internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: mozilla/bugbug

Issue:
[model:bugtype] ValueError: y should be a 1d array, got an array of shape (198635, 5) instead.
> I'm wondering if the error encountered during the training of the `bugtype` model is something we should investigate.
>
> ```bash
> Traceback (most recent call last):
>   File "/home/promisefru/anaconda3/envs/bugbug/lib/python3.10/runpy.py", line 196, in _run_module_as_main
>     return _run_code(code, main_globals, None,
>   File "/home/promisefru/anaconda3/envs/bugbug/lib/python3.10/runpy.py", line 86, in _run_code
>     exec(code, run_globals)
>   File "/home/promisefru/mozilla/bugbug/scripts/trainer.py", line 145, in <module>
>     main()
>   File "/home/promisefru/mozilla/bugbug/scripts/trainer.py", line 141, in main
>     retriever.go(args)
>   File "/home/promisefru/mozilla/bugbug/scripts/trainer.py", line 41, in go
>     metrics = model_obj.train(limit=args.limit)
>   File "/home/promisefru/mozilla/bugbug/bugbug/model.py", line 377, in train
>     self.le.fit(y)
>   File "/home/promisefru/anaconda3/envs/bugbug/lib/python3.10/site-packages/sklearn/preprocessing/_label.py", line 98, in fit
>     y = column_or_1d(y, warn=True)
>   File "/home/promisefru/anaconda3/envs/bugbug/lib/python3.10/site-packages/sklearn/utils/validation.py", line 1156, in column_or_1d
>     raise ValueError(
> ValueError: y should be a 1d array, got an array of shape (198635, 5) instead.
> ```

_Originally posted by @PromiseFru in https://github.com/mozilla/bugbug/issues/3928#issuecomment-1875673580_

See also: https://github.com/mozilla/bugbug/pull/3823#pullrequestreview-1746981626


Discussion:

Resolving patch:
diff --git a/bugbug/models/bugtype.py b/bugbug/models/bugtype.py
--- a/bugbug/models/bugtype.py
+++ b/bugbug/models/bugtype.py
@@ -12,6 +12,7 @@
 from sklearn.feature_extraction import DictVectorizer
 from sklearn.multiclass import OneVsRestClassifier
 from sklearn.pipeline import Pipeline
+from sklearn.preprocessing import LabelBinarizer
 
 from bugbug import bug_features, bugzilla, feature_cleanup, utils
 from bugbug.model import BugModel
@@ -25,6 +26,8 @@ def __init__(self, lemmatization=False, historical=False):
 
         self.calculate_importance = False
 
+        self.le = LabelBinarizer()
+
         self.bug_type_extractors = bug_features.BugTypes.bug_type_extractors
 
         label_keyword_prefixes = {
diff --git a/bugbug/models/rcatype.py b/bugbug/models/rcatype.py
--- a/bugbug/models/rcatype.py
+++ b/bugbug/models/rcatype.py
@@ -12,6 +12,7 @@
 from sklearn.feature_extraction import DictVectorizer
 from sklearn.multiclass import OneVsRestClassifier
 from sklearn.pipeline import Pipeline
+from sklearn.preprocessing import LabelBinarizer
 
 from bugbug import bug_features, bugzilla, feature_cleanup, utils
 from bugbug.model import BugModel
@@ -61,6 +62,8 @@ def __init__(
         self.calculate_importance = False
         self.rca_subcategories_enabled = rca_subcategories_enabled
 
+        self.le = LabelBinarizer()
+
         # should we consider only the main category or all sub categories
         self.RCA_TYPES = (
             RCA_SUBCATEGORIES + RCA_CATEGORIES


Test patch:
Repository: mozilla/bugbug

Issue:
[model:bugtype] ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
 Another bug to be looked at. 
```

File "/usr/local/lib/python3.10/site-packages/bugbug/model.py", line 546, in <genexpr>
    classified_num = sum(1 for v in y_pred_filter if v != "__NOT_CLASSIFIED__")

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

```

_Originally posted by @jpangas in https://github.com/mozilla/bugbug/issues/3958#issuecomment-1880820955_
            


Discussion:
We are counting `classified_num` for the multi-label cases. The current way works for the binary-label case only.
Proposed:
`classified_num` would be `len(classified_indices)` for multi-label cases.

https://github.com/mozilla/bugbug/blob/0bcedc35035853c02403a1786c6d08814f0683fa/bugbug/model.py#L546-L547

Resolving patch:
diff --git a/bugbug/model.py b/bugbug/model.py
--- a/bugbug/model.py
+++ b/bugbug/model.py
@@ -540,7 +540,12 @@ def train(self, importance_cutoff=0.15, limit=None):
                     np.array(y_pred_filter[classified_indices], dtype=int)
                 )
 
-            classified_num = sum(1 for v in y_pred_filter if v != "__NOT_CLASSIFIED__")
+            if is_multilabel:
+                classified_num = len(classified_indices)
+            else:
+                classified_num = sum(
+                    1 for v in y_pred_filter if v != "__NOT_CLASSIFIED__"
+                )
 
             logger.info(
                 f"\nConfidence threshold > {confidence_threshold} - {classified_num} classified"


Test patch:
Repository: mozilla/bugbug

Issue:
Include certain comment fields which will help the model to tag spam comments
Certain fields e.g. `comment_tag` and `commenter` will be helpful in the context of developing a model to tag spam comments.
Part of the work towards #3377 


Discussion:

Resolving patch:
diff --git a/bugbug/bugzilla.py b/bugbug/bugzilla.py
--- a/bugbug/bugzilla.py
+++ b/bugbug/bugzilla.py
@@ -27,7 +27,7 @@
 db.register(
     BUGS_DB,
     "https://community-tc.services.mozilla.com/api/index/v1/task/project.bugbug.data_bugs.latest/artifacts/public/bugs.json.zst",
-    9,
+    10,
 )
 
 PRODUCTS = (
@@ -64,7 +64,14 @@
     "file_name",
 ]
 
-COMMENT_INCLUDE_FIELDS = ["id", "count", "text", "creation_time"]
+COMMENT_INCLUDE_FIELDS = [
+    "id",
+    "count",
+    "text",
+    "creation_time",
+    "tags",
+    "creator",
+]
 
 PRODUCT_COMPONENT_CSV_REPORT_URL = "https://bugzilla.mozilla.org/report.cgi"
 


Test patch:
Repository: mozilla/bugbug

Issue:
Use Ruff for linting and formatting
Proposal to use[ Ruff ](https://docs.astral.sh/ruff/) for linting and code quality. Due to following reasons:

-  It's faster 
-  Can fix code automatically 



Discussion:
I like the idea of using Ruff (though our current linters can already fix code automatically, so that's not going to change).

There is https://github.com/astral-sh/ruff-pre-commit, so the integration should be pretty easy.
@BaasanbayarOverflow feel free to work on any issue that is not linked to an open PR.
Once https://github.com/mozilla/bugbot/pull/2335 is merged, we can do the same here in the BugBug repo.

Resolving patch:
diff --git a/scripts/past_bugs_by_unit.py b/scripts/past_bugs_by_unit.py
--- a/scripts/past_bugs_by_unit.py
+++ b/scripts/past_bugs_by_unit.py
@@ -153,7 +153,7 @@ def _transform(bug_ids: list[int]) -> list[dict]:
             return results
 
         def past_bug_ids_to_summaries(
-            past_bugs_by: dict[str, list[int]]
+            past_bugs_by: dict[str, list[int]],
         ) -> dict[str, list[dict]]:
             return {path: _transform(bug_ids) for path, bug_ids in past_bugs_by.items()}
 
@@ -189,7 +189,7 @@ def past_bug_ids_to_summaries(
             zstd_compress(f"data/past_fixed_bug_blocked_bugs_by_{dimension}.json")
 
         def past_function_bug_ids_to_summaries(
-            past_bugs: dict[str, dict[str, list[int]]]
+            past_bugs: dict[str, dict[str, list[int]]],
         ) -> dict[str, dict[str, list[dict]]]:
             return {
                 path: {


Test patch:
Repository: mozilla/bugbug

Issue:
QualityReport/MEI: Hide non-weighted BurndownTime
The non weighted burndown time is just creating confusion, as it does not match exactly to the (weighted) MEI. It might be fine to look at it in other contextes, but it's not really needed in the email.


Discussion:

Resolving patch:
diff --git a/scripts/generate_landings_risk_report.py b/scripts/generate_landings_risk_report.py
--- a/scripts/generate_landings_risk_report.py
+++ b/scripts/generate_landings_risk_report.py
@@ -1795,9 +1795,8 @@ def calculate_maintenance_effectiveness(
 
             def format_maintenance_effectiveness(period: relativedelta) -> str:
                 me = calculate_maintenance_effectiveness(period)
-                return "ME: {}%, BurnDownTime: {} y, WeightedBurnDownTime: {} y".format(
+                return "ME: {}%, WeightedBurnDownTime: {} y".format(
                     round(me["ME"], 2),
-                    round(me["BDTime"], 2),
                     round(me["WBDTime"], 2),
                 )
 


Test patch:
Repository: streamlit/streamlit

Issue:
On rerun, faded elements are becoming opaque one by one. Instead they become opaque all at once.
Steps to repro:
1. Run `examples/reference.py`
2. When done, rerun it.

**Expected:** on rerun, all elements fade out and then become opaque one by one even before the run is done.
**Actual:** on rerun, all elements fade out and only become opaque when the entire run is done.

I believe this bug was introduced with the Sidebar code.


Discussion:

Resolving patch:
diff --git a/docs/conf.py b/docs/conf.py
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -90,8 +90,10 @@
 # Theme options are theme-specific and customize the look and feel of a theme
 # further.  For a list of options available for each theme, see the
 # documentation.
-#
-# html_theme_options = {}
+
+html_theme_options = {
+    "analytics_id": "UA-122023594-3",
+}
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,


Test patch:
Repository: streamlit/streamlit

Issue:
Update text for login flow
# Summary
Can we please update the text when you first login to read:
```
 Telemetry: As an open-source project, we collect usage
 statistics. We do not collect, and cannot see the contents of your app!

```

# Debug info
```
$ streamlit version
Streamlit, version 0.46.0
```

On rerun, faded elements are becoming opaque one by one. Instead they become opaque all at once.
Steps to repro:
1. Run `examples/reference.py`
2. When done, rerun it.

**Expected:** on rerun, all elements fade out and then become opaque one by one even before the run is done.
**Actual:** on rerun, all elements fade out and only become opaque when the entire run is done.

I believe this bug was introduced with the Sidebar code.


Discussion:

Resolving patch:
diff --git a/lib/streamlit/cli.py b/lib/streamlit/cli.py
--- a/lib/streamlit/cli.py
+++ b/lib/streamlit/cli.py
@@ -36,13 +36,17 @@
 
 NEW_VERSION_TEXT = """
   %(new_version)s
+
   See what's new at https://discuss.streamlit.io/c/announcements
 
   Enter the following command to upgrade:
-  $ %(command)s
+  %(prompt)s %(command)s
 """ % {
-    "new_version": click.style("A new version of Streamlit is available.", fg="green"),
-    "command": click.style("pip install streamlit --upgrade", fg="white", bold=True),
+    "new_version": click.style(
+        "A new version of Streamlit is available.", fg="blue", bold=True),
+    "prompt": click.style("$", fg="blue"),
+    "command": click.style(
+        "pip install streamlit --upgrade", bold=True),
 }
 
 
diff --git a/lib/streamlit/credentials.py b/lib/streamlit/credentials.py
--- a/lib/streamlit/credentials.py
+++ b/lib/streamlit/credentials.py
@@ -56,8 +56,8 @@
 }
 
 TELEMETRY_TEXT = """
-  %(telemetry)s as an open source project, we collect summary statistics
-  and metadata to understand how people are using Streamlit.
+  %(telemetry)s As an open source project, we collect usage statistics.
+  We cannot see and do not store information contained in Streamlit apps.
 
   If you'd like to opt out, add the following to ~/.streamlit/config.toml,
   creating that file if necessary:


Test patch:
Repository: streamlit/streamlit

Issue:
On rerun, faded elements are becoming opaque one by one. Instead they become opaque all at once.
Steps to repro:
1. Run `examples/reference.py`
2. When done, rerun it.

**Expected:** on rerun, all elements fade out and then become opaque one by one even before the run is done.
**Actual:** on rerun, all elements fade out and only become opaque when the entire run is done.

I believe this bug was introduced with the Sidebar code.


Discussion:

Resolving patch:
diff --git a/lib/streamlit/hello.py b/lib/streamlit/hello.py
--- a/lib/streamlit/hello.py
+++ b/lib/streamlit/hello.py
@@ -68,8 +68,9 @@ def mapping_demo():
 
     @st.cache
     def from_data_file(filename):
-        GITHUB_DATA = "https://raw.githubusercontent.com/streamlit/streamlit/develop/examples/"
-        return pd.read_json(os.path.join(GITHUB_DATA, "data", filename))
+        return pd.read_json(
+            "https://raw.githubusercontent.com/streamlit/streamlit/develop/"
+            "examples/data/" + filename)
 
     try:
         ALL_LAYERS = {


Test patch:
Repository: streamlit/streamlit

Issue:
Fix Danny's S3 sharing issue
It looks like `[s3] keyPrefix=...` isn't making it into the URLs being fetched from S3.

This is the address of a manifest protobuf we want to fetch:
`https://yelp-people-dev.s3-us-west-2.amazonaws.com/~dqn/st/0.49.0-A8NT/reports/NJphBiGR4twz88mU9wTegn/manifest.pb`

And this is the address that's being generated:
`https://yelp-people-dev.s3.amazonaws.com/~dqn/reports/NJphBiGR4twz88mU9wTegn/manifest.pb`

The generated address is missing the `st/<streamlit version>` bits. Looks like we're splitting on a forward slash on the pathname in `ConnectionManager.fetchManifest`, which is giving us the wrong result because the keyPrefix itself has a forward slash.


Discussion:

Resolving patch:
diff --git a/examples/bart_vs_bikes.py b/examples/bart_vs_bikes.py
--- a/examples/bart_vs_bikes.py
+++ b/examples/bart_vs_bikes.py
@@ -33,7 +33,9 @@
 
 @st.cache
 def from_data_file(filename):
-    dirname = "https://raw.githubusercontent.com/streamlit/streamlit/develop/examples/data/"    
+    dirname = (
+        "https://raw.githubusercontent.com/streamlit/streamlit/develop/examples/data/"
+    )
     url = urljoin(dirname, filename)
     return pd.read_json(url)
 


Test patch:
diff --git a/frontend/src/lib/s3helper.test.ts b/frontend/src/lib/s3helper.test.ts
new file mode 100644
--- /dev/null
+++ b/frontend/src/lib/s3helper.test.ts
@@ -0,0 +1,53 @@
+/**
+ * @license
+ * Copyright 2018-2019 Streamlit Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { getBucketAndResourceRoot } from "./s3helper"
+
+describe("getBucketAndResourceRoot", () => {
+  test("handles no resource root", () => {
+    mockWindowLocationHref("https://example.com")
+    expect(getBucketAndResourceRoot()).toStrictEqual({
+      bucket: "example.com",
+      resourceRoot: "",
+    })
+
+    mockWindowLocationHref("https://example.com/")
+    expect(getBucketAndResourceRoot()).toStrictEqual({
+      bucket: "example.com",
+      resourceRoot: "",
+    })
+  })
+
+  test("handles resource root", () => {
+    mockWindowLocationHref(
+      "https://example.com/some/path/0.49.0/index.html?id=1234"
+    )
+    expect(getBucketAndResourceRoot()).toStrictEqual({
+      bucket: "example.com",
+      resourceRoot: "some/path/0.49.0",
+    })
+  })
+})
+
+function mockWindowLocationHref(href: string): void {
+  delete global.window.location
+  global.window = Object.create(window)
+  Object.defineProperty(window, "location", {
+    value: { href: href },
+    writable: true,
+  })
+}
Repository: streamlit/streamlit

Issue:
Single quotes break example strings
**Link to doc page in question (if any):**
1) https://streamlit.io/docs/api.html#streamlit.radio
2) https://streamlit.io/docs/api.html#streamlit.date_input

**Name of the Streamlit feature whose docs need improvement:**
Multiple

**What you think the docs should say:**
Use double quotes so that example code is not broken. I.e. 
Current:
```py
>>> genre = st.radio(
...     'What's your favorite movie genre',
...     ('Comedy', 'Drama', 'Documentary'))
>>>
>>> if genre == 'Comedy':
...     st.write('You selected comedy.')
... else:
...     st.write('You didn't select comedy.')
```

What I'd like:
```py
>>> genre = st.radio(
...     "What's your favorite movie genre",
...     ("Comedy", "Drama", "Documentary"))
>>>
>>> if genre == "Comedy":
...     st.write("You selected comedy.")
... else:
...     st.write("You didn't select comedy.")
```



Discussion:

Resolving patch:
diff --git a/lib/streamlit/DeltaGenerator.py b/lib/streamlit/DeltaGenerator.py
--- a/lib/streamlit/DeltaGenerator.py
+++ b/lib/streamlit/DeltaGenerator.py
@@ -1647,13 +1647,13 @@ def radio(self, element, label, options, index=0, format_func=str, key=None):
         Example
         -------
         >>> genre = st.radio(
-        ...     'What\'s your favorite movie genre',
+        ...     "What\'s your favorite movie genre",
         ...     ('Comedy', 'Drama', 'Documentary'))
         >>>
         >>> if genre == 'Comedy':
         ...     st.write('You selected comedy.')
         ... else:
-        ...     st.write('You didn\'t select comedy.')
+        ...     st.write("You didn\'t select comedy.")
 
         """
         if not isinstance(index, int):
@@ -2058,7 +2058,7 @@ def date_input(self, element, label, value=None, key=None):
         Example
         -------
         >>> d = st.date_input(
-        ...     'When\'s your birthday',
+        ...     "When\'s your birthday",
         ...     datetime.date(2019, 7, 6))
         >>> st.write('Your birthday is:', d)
 


Test patch:
Repository: streamlit/streamlit

Issue:
Remove obfuscated visibility option from configs
### Problem

It would be easier to debug streamlit apps if could see the options using `streamlit config show`

### Solution

Remove obfuscated visibility option from configs


Discussion:

Resolving patch:
diff --git a/lib/streamlit/ConfigOption.py b/lib/streamlit/ConfigOption.py
--- a/lib/streamlit/ConfigOption.py
+++ b/lib/streamlit/ConfigOption.py
@@ -72,7 +72,7 @@ def _proxy_port():
     where_defined : str
         Indicates which file set this config option.
         ConfigOption.DEFAULT_DEFINITION means this file.
-    visibility : {'visible', 'hidden', 'obfuscated'}
+    visibility : {"visible", "hidden"}
         See __init__.
     scriptable : bool
         See __init__.
@@ -118,7 +118,7 @@ def __init__(
             Like a comment for the config option.
         default_val : anything
             The value for this config option.
-        visibility : {'visible', 'hidden', 'obfuscated'}
+        visibility : {"visible", "hidden"}
             Whether this option should be shown to users.
         scriptable : bool
             Whether this config option can be set within a user script.
diff --git a/lib/streamlit/config.py b/lib/streamlit/config.py
--- a/lib/streamlit/config.py
+++ b/lib/streamlit/config.py
@@ -500,7 +500,6 @@ def _browser_server_port():
                 which has limitations and is not guaranteed to always work. 
                 To get a token for yourself, create an account at 
                 https://mapbox.com. It's free! (for moderate usage levels)""",
-                visibility="obfuscated",
                 default_val="pk.eyJ1IjoidGhpYWdvdCIsImEiOiJjamh3bm85NnkwMng4M3"
                             "dydnNveWwzeWNzIn0.vCBDzNsEF2uFSFk2AM0WZQ")
 
@@ -529,7 +528,7 @@ def _s3_url():
     return None
 
 
-@_create_option("s3.accessKeyId", visibility="obfuscated")
+@_create_option("s3.accessKeyId")
 def _s3_access_key_id():
     """Access key to write to the S3 bucket.
 
@@ -540,7 +539,7 @@ def _s3_access_key_id():
     return None
 
 
-@_create_option("s3.secretAccessKey", visibility="obfuscated")
+@_create_option("s3.secretAccessKey")
 def _s3_secret_access_key():
     """Secret access key to write to the S3 bucket.
 
@@ -725,12 +724,9 @@ def append_newline():
 
             toml_setting = toml.dumps({key: option.value})
 
-            if len(toml_setting) == 0 or option.visibility == "obfuscated":
+            if len(toml_setting) == 0:
                 toml_setting = "#%s =\n" % key
 
-            elif option.visibility == "obfuscated":
-                toml_setting = "%s = (value hidden)\n" % key
-
             append_setting(toml_setting)
 
     click.echo("\n".join(out))


Test patch:
Repository: streamlit/streamlit

Issue:
NoneType option returns DeltaGenerator object instead
# Summary

Widgets with `None` as the chosen option returns a `DeltaGenerator` object instead.

# Steps to reproduce

````
import streamlit as st

a = st.radio(options=[None, 1], label="label", index=0)
b = st.radio(options=[None, 1], label="label", index=1)

c = st.selectbox(options=[None, 1], label="label", index=0)
d = st.selectbox(options=[None, 1], label="label", index=1)

print(a)
print(b)
print(c)
print(d)
````

This outputs
````
<streamlit.DeltaGenerator.DeltaGenerator object at 0x7fa3de516710>
1
<streamlit.DeltaGenerator.DeltaGenerator object at 0x7fa3de516710>
1
````

# Debug info

- Streamlit version: (0.53 (also didn't work on 0.52)
- Python version: (3.7.3)


Discussion:

Resolving patch:
diff --git a/lib/streamlit/DeltaGenerator.py b/lib/streamlit/DeltaGenerator.py
--- a/lib/streamlit/DeltaGenerator.py
+++ b/lib/streamlit/DeltaGenerator.py
@@ -1809,7 +1809,8 @@ def radio(self, element, label, options, index=0, format_func=str, key=None):
 
         ui_value = _get_widget_ui_value("radio", element, user_key=key)
         current_value = ui_value if ui_value is not None else index
-        return options[current_value] if len(options) > 0 else NoValue
+
+        return options[current_value] if len(options) > 0 and options[current_value] is not None else NoValue
 
     @_with_element
     def selectbox(self, element, label, options, index=0, format_func=str, key=None):
@@ -1863,7 +1864,8 @@ def selectbox(self, element, label, options, index=0, format_func=str, key=None)
 
         ui_value = _get_widget_ui_value("selectbox", element, user_key=key)
         current_value = ui_value if ui_value is not None else index
-        return options[current_value] if len(options) > 0 else NoValue
+
+        return options[current_value] if len(options) > 0 and options[current_value] is not None else NoValue
 
     @_with_element
     def slider(


Test patch:
diff --git a/lib/tests/streamlit/radio_test.py b/lib/tests/streamlit/radio_test.py
--- a/lib/tests/streamlit/radio_test.py
+++ b/lib/tests/streamlit/radio_test.py
@@ -43,6 +43,12 @@ def test_valid_value(self):
         self.assertEqual(c.label, "the label")
         self.assertEqual(c.default, 1)
 
+    def test_noneType_option(self):
+        """Test NoneType option value."""
+        current_value = st.radio("the label", (None, "selected"), 0)
+
+        self.assertEqual(current_value, None)
+
     @parameterized.expand(
         [
             (("m", "f"), ["m", "f"]),
diff --git a/lib/tests/streamlit/selectbox_test.py b/lib/tests/streamlit/selectbox_test.py
--- a/lib/tests/streamlit/selectbox_test.py
+++ b/lib/tests/streamlit/selectbox_test.py
@@ -43,6 +43,12 @@ def test_valid_value(self):
         self.assertEqual(c.label, "the label")
         self.assertEqual(c.default, 1)
 
+    def test_noneType_option(self):
+        """Test NoneType option value."""
+        current_value = st.selectbox("the label", (None, "selected"), 0)
+
+        self.assertEqual(current_value, None)
+
     @parameterized.expand(
         [
             (("m", "f"), ["m", "f"]),