Repository: exercism/python
Pull request #2822 (2021-12-19 23:40:24)

Fixed broken img ref (it was pointing to a private repo)

github-actions[bot]: Hi & Welcome! 👋🏽&nbsp;👋

**Thank you** for contributing to `exercism/python` 💛&nbsp;💙 -- we really appreciate it! 🌟 🌈


<br>

This is an automated [🤖&nbsp;🤖 &nbsp;] comment for the  **`maintainers`** of this repository, notifying them of your contribution.  🎉
Someone will review/reply to your changes shortly. (_usually within **72 hours**._)
You can safely ignore the **`maintainers`**  section below.

<br>
<details open>
  <summary>⚠️ &nbsp;<b>Please be aware</b>&nbsp;⚠️ </summary>

  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_This repo does not generally accept [Pull Requests](https://github.com/exercism/docs/blob/main/community/good-member/pull-requests.md) unless they follow our [contributing guidelines](https://github.com/exercism/python/blob/main/CONTRIBUTING.md) and are:_

  &nbsp;&nbsp;&nbsp;&nbsp; 1️⃣ &nbsp;&nbsp;&nbsp; Small, contained fixes for typos/grammar/punctuation/code syntax on [one] exercise,
  &nbsp;&nbsp;&nbsp;&nbsp; 2️⃣ &nbsp;&nbsp;&nbsp;&nbsp;Medium changes that have been agreed/discussed via a filed issue,
  &nbsp;&nbsp;&nbsp;&nbsp; 3️⃣ &nbsp;&nbsp;&nbsp;&nbsp;Contributions from our [help wanted][help-wanted] issue list,
  &nbsp;&nbsp;&nbsp;&nbsp; 4️⃣ &nbsp;&nbsp;&nbsp;&nbsp;Larger (_previously agreed-upon_) contributions from recent & regular (_within the last 6 months_) contributors.

  &nbsp;&nbsp;&nbsp;&nbsp;Pull Requests not in these categories **will be closed**.  😞

</details>
<br>



<h2>🛠️ &nbsp;&nbsp; Maintainers &nbsp;&nbsp;</h2>
<h3> Please take note 📒  of the following sections/review items 👀   ✨ </h3>
<br>
<br>
<details>
<summary> 🌈  &nbsp;Acknowledgements and Reputation</summary>
<br>
<table>
<td>

- ❓ Does this PR need to receive a label with a [`reputation modifier`](https://github.com/exercism/docs/blob/main/using/product/reputation.md#creating-a-pull-request)?
     -  `medium` is awarded by default.
- ❓ Does this contributor need to be added to the **exercise** [`authors` or `contributors`](https://github.com/exercism/docs/blob/main/building/tracks/practice-exercises.md#file-metaconfigjson)?
- ❓ Does this contributor need to be added to the **concept** [`authors` or `contributors`](https://github.com/exercism/docs/blob/main/building/tracks/concepts.md#file-metaconfigjson)?
- ❓ Is there an associated issue or issues that should be linked to this PR?

</td>
</table>
</details>
<details>
<summary>💫 &nbsp;General Code Quality</summary>
<ul>
<table>
<td>
  <h4>Verify:</h4>

  -  [ ]  &nbsp;The branch was updated & rebased with any (recent) upstream changes.
  -  [ ]  &nbsp;All prose was checked for spelling and grammar.
  -  [ ]  &nbsp;Files are formatted via [yapf](https://github.com/google/yapf) ([_yapf config_](https://github.com/exercism/python/blob/main/.style.yapf)) & conform to our [coding standards](https://github.com/exercism/python/blob/main/CONTRIBUTING.md#coding-standards)
  -  [ ]  &nbsp;Files pass [flake8](http://flake8.pycqa.org/) with [_flake8 config_](https://github.com/exercism/python/blob/main/.flake8) & [pylint](https://pylint.pycqa.org/en/v2.11.1/user_guide/index.html) with [_pylint config_](https://github.com/exercism/python/blob/main/pylintrc).
  -  [ ]  &nbsp;Changed `example.py`/`exemplar.py` files still pass their associated **test files**.
  -  [ ]  &nbsp;Changed _**test files**_ still work with associated `example.py`/`exemplar.py` files.
      - Check that tests **fail** properly, as well as succeed.
             (_**e.g.**, make some tests fail on purpose to "test the tests" & failure messages_).
  -  [ ]  &nbsp;All files have proper EOL.
  -  [ ]  &nbsp;If a `JinJa2` template was modified/created, was the test file [regenerated](https://github.com/exercism/python/blob/main/CONTRIBUTING.md#auto-generated-test-files-and-test-templates)?
      - Does the regenerated test file successfully test the exercises `example.py` file?
  -  [ ]  &nbsp;The branch passes all CI checks & [`configlet-lint`](https://github.com/exercism/configlet#configlet-lint).

<br>
</td>
</table>
</ul>
<br>
</details>
<details>
<summary>🌿 &nbsp;Changes to Concept Exercises</summary>
<br>

  -   ❓ Are all required files still up-to-date & configured correctly for this change?_
  -   ❓ Does `<exercise>/.meta/design.md` need to be updated with new implementation/design decisions
  -   ❓ Do these changes require follow-on/supporting changes to related **concept** documents?

<ul>
<details>
<summary><em><b> ✨ &nbsp;Where applicable, check the following&nbsp;✨  </b></em></summary>
<br>
<ul>
<table>
<td>

(_as a reminder: [Concept Exercise Anatomy](https://github.com/exercism/docs/blob/main/building/tracks/concept-exercises.md)_)
  - [ ] Exercise `introduction.md`
    - [ ]  Do all code examples compile, run, and return the shown output?
    - [ ]  Are all the code examples formatted per the Python docs?
  - [ ]  Exercise `instructions.md`
  - [ ]  Exercise  `hints.md`
  - [ ]   Check that exercise `design.md` was fulfilled or edited appropriately
  - [ ]   Exercise `exemplar.py`
    - [ ]  Only uses syntax previously introduced or explained.
    - [ ]  Is correct and appropriate for the exercise and story.
  - [ ]   Exercise `<exercise_name>.py` (stub)
    - [ ]  Includes appropriate docstrings and function names.
    - [ ]  Includes `pass` for each function
    - [ ]  Includes an EOL at the end
  - [ ]   Exercise  `<exercise_name>_test.py`
    - [ ]   Tests cover all (reasonable) inputs and scenarios
    - [ ]   At least one test for each task in the exercise
    - [ ]   If using subtests or fixtures they're [formatted correctly](https://github.com/exercism/python/blob/main/CONTRIBUTING.md#Test-File_style) for the runner
    - [ ]   Classnames are `<ExerciseName>Test`
    - [ ]   Test functions are `test_<test_name>`
  - [ ]   Exercise `config.json` --> **valid UUID4**
  - [ ]   Corresponding concept `introduction.md`
  - [ ]   Corresponding concept `about.md`
  - [ ]   Concept  `config.json`
  - [ ]   All Markdown Files :  Prettier linting (_for all markdown docs_)
  - [ ]   All Code files: PyLint linting (**_except for test files_**)
  - [ ]   All files with text:  Spell check & grammar review.

</td>
</table>
</ul>
</details>
</ul>
</details>

<details>
<summary>🚀&nbsp;  Changes to Practice Exercises</summary>
<br>
<ul>
<table>
<td>

_Is the exercise is in line with [Practice Exercise Anatomy](https://github.com/exercism/docs/blob/main/building/tracks/practice-exercises.md)?_
- [ ] `.docs/instructions.md`(**required**)
   - Was this file updated and regenerated properly?
- [ ] `.docs/introduction.md`(_optional_)
- [ ] `.docs/introduction.append.md`(_optional_)
- [ ] `.docs/instructions.append.md` (_optional_)
   - Are any additional instructions needed/provided?
   &nbsp;(_e.g. error handling or information on classes_)
- [ ] `.docs/hints.md`(_optional_)
   - Was this file regenerated properly?
- [ ] `.meta/config.json` (**required**)
- [ ] `.meta/example.py` (**required**)
   - Does this pass all the current tests as written/generated?
- [ ] `.meta/design.md` (_optional_)
- [ ] `.meta/template.j2` (_template for generating tests from canonical data_)
  - Was a test file properly regenerated from this template?
- [ ] `.meta/tests.toml`
   -  Are there additional test cases to include or exclude?
   -  Are there any Python-specific test cases needed for this exercise?
- [ ] `<exercise-slug>_test.py`
   - Does this file need to be regenerated?
   - Does this file correctly test the `example.py` file?
   - Does this file correctly report test failures and messages?
- [ ] `<exercise-slug>.py` (**required**)
   - Does this stub have enough information to get
   &nbsp;the student started coding a valid solution?

</td>
</table>
</ul>
</details>
  <details>
    <summary>🐣 &nbsp;Brand-New Concept Exercises</summary>
<br>
<ul>
<table>
<td>

_Is the exercise is in line with [Concept Exercise Anatomy](https://github.com/exercism/docs/blob/main/building/tracks/concept-exercises.md)?_
  - [ ] Exercise `introduction.md`
    - [ ]  Do all code examples compile, run, and return the shown output?
    - [ ]  Are all the code examples formatted per the Python docs?
  - [ ]  Exercise `instructions.md`
  - [ ]  Exercise  `hints.md`
  - [ ]   Check that exercise `design.md` was fulfilled or edited appropriately
  - [ ]   Exercise `exemplar.py`
    - [ ]  Only uses syntax previously introduced or explained.
    - [ ]  Is correct and appropriate for the exercise and story.
  - [ ]   Exercise `<exercise_name>.py` (stub)
    - [ ]  Includes appropriate docstrings and function names.
    - [ ]  Includes `pass` for each function
    - [ ]  Includes an EOL at the end
  - [ ]   Exercise  `<exercise_name>_test.py`
    - [ ]   Tests cover all (reasonable) inputs and scenarios
    - [ ]   At least one test for each task in the exercise
    - [ ]   If using subtests or fixtures they're formatted correctly for the runner
    - [ ]   Classnames are `<ExerciseName>Test`
    - [ ]   Test functions are `test_<test_name>`
  - [ ]   Exercise `config.json` --> valid UUID4
  - [ ]   Corresponding concept `introduction.md`
  - [ ]   Corresponding concept `about.md`
  - [ ]   Concept  `config.json`
  - [ ]   All Markdown Files :  Prettier linting (_for all markdown docs_)
  - [ ]   All Code files: Flake8 & PyLint linting
  - [ ]   All Code Examples:  proper formatting and fencing.  Verify they run in the REPL
  - [ ]   All files with text:  Spell check & grammar review.

<br>
</td>
</table>
</ul>
</details>
<br>
<h3>Our &nbsp; 💖  &nbsp; for all your review efforts! 🌟 🦄</h3>


<!-- pr-commenter-metadata: any-file-changed -->

Patch:
diff --git a/concepts/basics/introduction.md b/concepts/basics/introduction.md
index 51535a19..1c7762a5 100644
--- a/concepts/basics/introduction.md
+++ b/concepts/basics/introduction.md
@@ -57,7 +57,7 @@ Functions that do not have an explicit `return` expression will return [`None`][
 def add_two_numbers(number_one, number_two):
   result = number_one + number_two
 
->>> print(add_two_number s(5, 7))
+>>> print(add_two_numbers(5, 7))
 None
 ```
 
diff --git a/exercises/concept/currency-exchange/.docs/instructions.md b/exercises/concept/currency-exchange/.docs/instructions.md
index 7e6f347b..8e41ec0c 100644
--- a/exercises/concept/currency-exchange/.docs/instructions.md
+++ b/exercises/concept/currency-exchange/.docs/instructions.md
@@ -38,10 +38,10 @@ Create the `get_value_of_bills()` function, taking 2 parameters:
 1. `denomination` : The value of a single bill.
 2. `number_of_bills` : Amount of bills you received.
 
-This exchanging booth only deals in cash of certain increments. 
+This exchanging booth only deals in cash of certain increments.
 The total you receive must be divisible by the value of one "bill" or unit, which can leave behind a fraction or remainder.
 Your function should return only the total value of the bills (_excluding fractional amounts_) the booth would give back.
-Unfortunately, the booth gets to keep the remainder/change as an added bonus. 
+Unfortunately, the booth gets to keep the remainder/change as an added bonus.
 
 ```python
 >>> get_value_of_bills(5, 128)
@@ -52,10 +52,11 @@ Unfortunately, the booth gets to keep the remainder/change as an added bonus.
 
 Create the `get_number_of_bills()` function, taking `budget` and `denomination`.
 
-This function should return the _number of new currency bills_ that you can receive within the given _budget_. 
-In other words:  How many _whole bills_ of new currency fit into the amount of old currency you have in your budget? 
-Remember -- you can only receive _whole bills_, not fractions of bills, so remember to divide accordingly. 
+This function should return the _number of new currency bills_ that you can receive within the given _budget_.
+In other words:  How many _whole bills_ of new currency fit into the amount of old currency you have in your budget?
+Remember -- you can only receive _whole bills_, not fractions of bills, so remember to divide accordingly.
 Effectively, you are rounding _down_ to the nearest whole bill/denomination.
+
 ```python
 >>> get_number_of_bills(127.5, 5)
 25
@@ -65,8 +66,8 @@ Effectively, you are rounding _down_ to the nearest whole bill/denomination.
 
 Create the `exchangeable_value()` function, taking `budget`, `exchange_rate`, `spread`, and `denomination`.
 
-Parameter `spread` is the *percentage taken* as an exchange fee, written as an integer. 
-It needs to be converted to decimal by dividing it by 100. 
+Parameter `spread` is the *percentage taken* as an exchange fee, written as an integer.
+It needs to be converted to decimal by dividing it by 100.
 If `1.00 EUR == 1.20 USD` and the *spread* is `10`, the actual exchange rate will be: `1.00 EUR == 1.32 USD` because 10% of 1.20 is 0.12, and this additional fee is added to the exchange.
 
 This function should return the maximum value of the new currency after calculating the *exchange rate* plus the *spread*.
@@ -87,7 +88,7 @@ Create the `non_exchangeable_value()` function, taking `budget`, `exchange_rate`
 
 This function should return the value that is *not* exchangeable due to the *denomination* of the bills.
 Remember - this booth gets to keep the change _in addition_ to charging an exchange fee.
-Start by calculating the value you would receive if you were able to keep subdivided bills, then subtract the amount you would receive in whole bills. 
+Start by calculating the value you would receive if you were able to keep subdivided bills, then subtract the amount you would receive in whole bills.
 Both amounts should take the spread, or the exchange fee into account.
 
 **Note:** Returned value should be `int` type.
diff --git a/exercises/concept/little-sisters-vocab/.docs/instructions.md b/exercises/concept/little-sisters-vocab/.docs/instructions.md
index cd37fa92..6100cdb1 100644
--- a/exercises/concept/little-sisters-vocab/.docs/instructions.md
+++ b/exercises/concept/little-sisters-vocab/.docs/instructions.md
@@ -82,16 +82,15 @@ Suffixes are often used to change the part of speech a word has.
 In this task, your sister is going to practice "verbing" words by extracting an adjective from a sentence and turning it into a verb.
  Fortunately, all the words that need to be transformed here are "regular" - they don't need spelling changes to add the suffix.
 
-Implement the `noun_to_verb(<sentence>, <index>)` function that takes two parameters.
+Implement the `adjective_to_verb(<sentence>, <index>)` function that takes two parameters.
  A `sentence` using the vocabulary word, and the `index` of the word, once that sentence is split apart.
  The function should return the extracted adjective as a verb.
 
 
 ```python
->>> noun_to_verb('I need to make that bright.', -1 )
+>>> adjective_to_verb('I need to make that bright.', -1 )
 'brighten'
 
->>> noun_to_verb('It got dark as the sun set.', 2)
+>>> adjective_to_verb('It got dark as the sun set.', 2)
 'darken'
 ```
-
diff --git a/exercises/concept/little-sisters-vocab/.meta/exemplar.py b/exercises/concept/little-sisters-vocab/.meta/exemplar.py
index b0145fb3..ccd00092 100644
--- a/exercises/concept/little-sisters-vocab/.meta/exemplar.py
+++ b/exercises/concept/little-sisters-vocab/.meta/exemplar.py
@@ -45,7 +45,7 @@ def remove_suffix_ness(word):
     return word
 
 
-def noun_to_verb(sentence, index):
+def adjective_to_verb(sentence, index):
     """
 
     :param sentence: str that uses the word in sentence
diff --git a/exercises/concept/little-sisters-vocab/strings.py b/exercises/concept/little-sisters-vocab/strings.py
index 10ceba8f..56aaa04a 100644
--- a/exercises/concept/little-sisters-vocab/strings.py
+++ b/exercises/concept/little-sisters-vocab/strings.py
@@ -38,7 +38,7 @@ def remove_suffix_ness(word):
     pass
 
 
-def noun_to_verb(sentence, index):
+def adjective_to_verb(sentence, index):
     """
 
     :param sentence: str that uses the word in sentence
diff --git a/exercises/practice/clock/.docs/instructions.append.md b/exercises/practice/clock/.docs/instructions.append.md
new file mode 100644
index 00000000..76fb934b
--- /dev/null
+++ b/exercises/practice/clock/.docs/instructions.append.md
@@ -0,0 +1,69 @@
+# Instructions append
+
+The tests for this exercise expect your clock will be implemented via a Clock `class` in Python.
+If you are unfamiliar with classes in Python, [classes][classes in python] from the Python docs is a good place to start.
+## Representing your class
+
+When working with and debugging objects, it's important to have a string representation of that object.
+For example, if you were to create a new `datetime.datetime` object in the Python [REPL][REPL] environment, you could see its string representation:
+
+```python
+>>> from datetime import datetime
+>>> new_date = datetime(2022, 5, 4)
+>>> new_date
+datetime.datetime(2022, 5, 4, 0, 0)
+
+Your Clock `class` will create a custom `object` that handles times without dates.
+One important aspect of this `class` will be how it is represented as a _string_.
+Other programmers who use or call Clock `objects` created from the Clock `class` will refer to this string representation for debugging and other activities.  
+However, the default string representation on a `class` is usually not very helpful.
+
+```python
+>>> Clock(12, 34)
+<Clock object st 0x102807b20 >
+```
+
+To create a more helpful representation, you can define a `__repr__` method on the `class` that returns a string.
+
+Ideally, the `__repr__` method returns valid Python code that can be used to recreate the object -- as laid out in the [specification for a `__repr__` method][repr-docs].
+Returning valid Python code allows you to copy-paste the `str` directly into code or the REPL.
+
+For example, a `Clock` that represents 11:30 AM could look like this: `Clock(11, 30)`.
+
+Defining a `__repr__` method is good practice for all classes.
+Some things to consider:
+
+- The information returned from this method should be beneficial when debugging issues.
+- _Ideally_, the method returns a string that is valid Python code -- although that might not always be possible.
+- If valid Python code is not practical, returning a description between angle brackets: `< ...a practical description... >` is the convention.
+
+
+### String conversion
+
+In addition to the `__repr__` method, there might also be a need for an alternative "human-readable" string representation of the `class`.
+This might be used to format the object for program output or documentation.
+Looking at `datetime.datetime` again:
+
+```python
+>>> str(datetime.datetime(2022, 5, 4))
+'2022-05-04 00:00:00'
+```
+
+When a `datetime` object is asked to convert itself to a string representation, it returns a `str` formatted according to the [ISO 8601 standard][ISO 8601], which can be parsed by most datetime libraries into a human-readable date and time.
+
+In this exercise, you will get a chance to write a `__str__` method, as well as a `__repr__`.
+
+```python
+>>> str(Clock(11, 30))
+'11:30'
+```
+
+To support this string conversion, you will need to create a `__str__` method on your class that returns a more "human readable" string showing the Clock time.
+
+If you don't create a `__str__` method and you call `str()` on your class, python will try calling `__repr__` on your class as a fallback. So if you only implement one of the two, it would be better to create a `__repr__` method.
+
+[repr-docs]: https://docs.python.org/3/reference/datamodel.html#object.__repr__
+[classes in python]: https://docs.python.org/3/tutorial/classes.html
+[REPL]: https://pythonprogramminglanguage.com/repl/
+[ISO 8601]: https://www.iso.org/iso-8601-date-and-time-format.html
+
diff --git a/exercises/practice/clock/.meta/config.json b/exercises/practice/clock/.meta/config.json
index 6a917e5d..441a88c4 100644
--- a/exercises/practice/clock/.meta/config.json
+++ b/exercises/practice/clock/.meta/config.json
@@ -16,7 +16,8 @@
     "rootulp",
     "smalley",
     "thomasjpfan",
-    "tqa236"
+    "tqa236",
+    "chrismay"
   ],
   "files": {
     "solution": [
diff --git a/exercises/practice/clock/.meta/example.py b/exercises/practice/clock/.meta/example.py
index 0c76dca2..47d52681 100644
--- a/exercises/practice/clock/.meta/example.py
+++ b/exercises/practice/clock/.meta/example.py
@@ -7,6 +7,9 @@ class Clock:
         self.cleanup()
 
     def __repr__(self):
+        return f'Clock({self.hour}, {self.minute})'
+
+    def __str__(self):
         return '{:02d}:{:02d}'.format(self.hour, self.minute)
 
     def __eq__(self, other):
diff --git a/exercises/practice/clock/.meta/template.j2 b/exercises/practice/clock/.meta/template.j2
index 106b1c76..f786b2f1 100644
--- a/exercises/practice/clock/.meta/template.j2
+++ b/exercises/practice/clock/.meta/template.j2
@@ -4,6 +4,8 @@ Clock({{ obj["hour"] }}, {{ obj["minute"] }})
 {%- endmacro -%}
 {{ macros.header(["Clock"])}}
 
+{% set cases = additional_cases + cases %}
+
 class {{ exercise | camel_case }}Test(unittest.TestCase):
     {% for casegroup in cases -%}
     # {{ casegroup["description"].title() }}
@@ -17,7 +19,7 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
                 {{- clock(input["clock1"]) }},
                 {{- clock(input["clock2"]) }}
             {% else -%}
-                Equal(str({{ clock(input) }}
+                Equal({{ 'repr' if prop == 'repr' else 'str' }}({{ clock(input) }}
                 {%- if prop == "add" %} + {{ input["value"] }}
                 {%- elif prop == "subtract" %} - {{ input["value"] }}
                 {%- endif %}), "
@@ -27,5 +29,4 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
 
     {% endfor %}
     {%- endfor %}
-
 {{ macros.footer() }}
diff --git a/exercises/practice/clock/clock.py b/exercises/practice/clock/clock.py
index 26739a78..1102992a 100644
--- a/exercises/practice/clock/clock.py
+++ b/exercises/practice/clock/clock.py
@@ -5,6 +5,9 @@ class Clock:
     def __repr__(self):
         pass
 
+    def __str__(self):
+        pass
+
     def __eq__(self, other):
         pass
 
diff --git a/reference/track_exercises_overview.md b/reference/track_exercises_overview.md
index 19822a76..5c165917 100644
--- a/reference/track_exercises_overview.md
+++ b/reference/track_exercises_overview.md
@@ -20,7 +20,7 @@
 |  <img src="./Beta.svg" width="40" height="20"> 	| [basics](https://github.com/exercism/python/blob/main/concepts/basics)                                                       	|  <img src="./Beta.svg" width="40" height="20"> 	| [Guidos Gorgeous Lasagna](https://github.com/exercism/python/tree/main/tree/main/exercises/concept/guidos-gorgeous-lasagna)   	| [`.meta`folder](https://github.com/exercism/python/tree/main/exercises/concept/guidos-gorgeous-lasagna/.meta)    	|
 |  <img src="./Beta.svg" width="40" height="20"> 	| [bools](https://github.com/exercism/python/blob/main/concepts/bools)                                                         	|  <img src="./Beta.svg" width="40" height="20"> 	| [Ghost Gobble Arcade Game](https://github.com/exercism/python/tree/main/tree/main/exercises/concept/ghost-gobble-arcade-game) 	| [`.meta`folder](https://github.com/exercism/python/tree/main/exercises/concept/ghost-gobble-arcade-game/.meta)   	|
 |  <img src="./Beta.svg" width="40" height="20"> 	| [conditionals](https://github.com/exercism/python/blob/main/concepts/conditionals)                                           	|  <img src="./Beta.svg" width="40" height="20"> 	| [Meltdown Mitigation ](https://github.com/exercism/python/tree/main/exercises/concept/meltdown-mitigation)                    	| [`.meta`folder](https://github.com/exercism/python/tree/main/exercises/concept/meltdown-mitigation/.meta)        	|
-|  <img src="./Beta.svg" width="40" height="20"> 	| [dicts](https://github.com/exercism/python/blob/main/concepts/dicts)                                                         	| <img src="https://github.com/BethanyG/beginner_nights/blob/master/Beta.svg" width="40" height="20"> 	| [Inventory Management](https://github.com/exercism/python/tree/main/exercises/concept/inventory-management)                   	| [`.meta`folder](https://github.com/exercism/python/tree/main/exercises/concept/inventory-management)             	|
+|  <img src="./Beta.svg" width="40" height="20"> 	| [dicts](https://github.com/exercism/python/blob/main/concepts/dicts)                                                         	| <img src="./Beta.svg" width="40" height="20"> 	| [Inventory Management](https://github.com/exercism/python/tree/main/exercises/concept/inventory-management)                   	| [`.meta`folder](https://github.com/exercism/python/tree/main/exercises/concept/inventory-management)             	|
 |  <img src="./Beta.svg" width="40" height="20"> 	| [list-methods](https://github.com/exercism/python/blob/main/concepts/list-methods)                                           	|  <img src="./Beta.svg" width="40" height="20"> 	| [Chaitanas Colossal Coaster](https://github.com/exercism/python/tree/main/exercises/concept/chaitanas-colossal-coaster)       	| [`.meta`folder](https://github.com/exercism/python/tree/main/exercises/concept/chaitanas-colossal-coaster/.meta) 	|
 |  <img src="./Beta.svg" width="40" height="20"> 	| [lists](https://github.com/exercism/python/blob/main/concepts/lists)                                                         	|  <img src="./Beta.svg" width="40" height="20"> 	| [Card Games](https://github.com/exercism/python/tree/main/exercises/concept/card-games)                                       	| [`.meta`folder](https://github.com/exercism/python/tree/main/exercises/concept/card-games/.meta)                 	|
 |  <img src="./Beta.svg" width="40" height="20"> 	| [loops](https://github.com/exercism/python/blob/main/concepts/loops)                                                         	|  <img src="./Beta.svg" width="40" height="20"> 	| [Making the Grade](https://github.com/exercism/python/tree/main/exercises/concept/making-the-grade)                           	| [`.meta`folder](https://github.com/exercism/python/tree/main/exercises/concept/making-the-grade/.meta)           	|


Test patch:
diff --git a/exercises/concept/little-sisters-vocab/strings_test.py b/exercises/concept/little-sisters-vocab/strings_test.py
index aca9e45e..79ca4abc 100644
--- a/exercises/concept/little-sisters-vocab/strings_test.py
+++ b/exercises/concept/little-sisters-vocab/strings_test.py
@@ -3,7 +3,7 @@ import pytest
 from strings import (add_prefix_un,
                      make_word_groups,
                      remove_suffix_ness,
-                     noun_to_verb)
+                     adjective_to_verb)
 
 
 class LittleSistersVocabTest(unittest.TestCase):
@@ -73,22 +73,22 @@ class LittleSistersVocabTest(unittest.TestCase):
                                  msg=f'Expected: {result} but got a different word instead.')
 
     @pytest.mark.task(taskno=4)
-    def test_noun_to_verb(self):
+    def test_adjective_to_verb(self):
         input_data = ['Look at the bright sky.',
                       'His expression went dark.',
                       'The bread got hard after sitting out.',
                       'The butter got soft in the sun.',
-                      'Her face was filled with light.',
+                      'Her eyes were light blue.',
                       'The morning fog made everything damp with mist.',
                       'He cut the fence pickets short by mistake.',
                       'Charles made weak crying noises.',
                       'The black oil got on the white dog.']
-        index_data = [-2, -1, 3, 3, -1, -3, 5, 2, 1]
+        index_data = [-2, -1, 3, 3, -2, -3, 5, 2, 1]
         result_data = ['brighten', 'darken', 'harden', 'soften',
                        'lighten', 'dampen', 'shorten', 'weaken', 'blacken']
         number_of_variants = range(1, len(input_data) + 1)
 
         for variant, sentence, index, result in zip(number_of_variants, input_data, index_data, result_data):
             with self.subTest(f'variation #{variant}', sentence=sentence, index=index, result=result):
-                self.assertEqual(noun_to_verb(sentence, index), result,
+                self.assertEqual(adjective_to_verb(sentence, index), result,
                                  msg=f'Expected: {result} but got a different word instead.')
diff --git a/exercises/practice/clock/.meta/additional_tests.json b/exercises/practice/clock/.meta/additional_tests.json
new file mode 100644
index 00000000..ba0c72bb
--- /dev/null
+++ b/exercises/practice/clock/.meta/additional_tests.json
@@ -0,0 +1,39 @@
+{
+  "cases": [
+    {
+      "description": "Create a string representation",
+      "cases": [
+        {
+          "uuid": "d2c8f173-018d-488c-8c4c-009f8c772313",
+          "description": "lunch time",
+          "property": "repr",
+          "input": {
+            "hour": 12,
+            "minute": 0
+          },
+          "expected": "Clock(12, 0)"
+        },
+        {
+          "uuid": "61a68f88-b980-46cd-a9f5-844832618092",
+          "description": "breakfast time",
+          "property": "repr",
+          "input": {
+            "hour": 6,
+            "minute": 45
+          },
+          "expected": "Clock(6, 45)"
+        },
+        {
+          "uuid": "ea93b367-fb03-44e4-a845-51756b8c9f3a",
+          "description": "dinner time",
+          "property": "repr",
+          "input": {
+            "hour": 18,
+            "minute": 30
+          },
+          "expected": "Clock(18, 30)"
+        }
+      ]
+    }
+  ]
+}
diff --git a/exercises/practice/clock/clock_test.py b/exercises/practice/clock/clock_test.py
index f73af094..fe063366 100644
--- a/exercises/practice/clock/clock_test.py
+++ b/exercises/practice/clock/clock_test.py
@@ -8,6 +8,16 @@ from clock import (
 
 
 class ClockTest(unittest.TestCase):
+    # Create A String Representation
+    def test_lunch_time(self):
+        self.assertEqual(repr(Clock(12, 0)), "Clock(12, 0)")
+
+    def test_breakfast_time(self):
+        self.assertEqual(repr(Clock(6, 45)), "Clock(6, 45)")
+
+    def test_dinner_time(self):
+        self.assertEqual(repr(Clock(18, 30)), "Clock(18, 30)")
+
     # Create A New Clock With An Initial Time
     def test_on_the_hour(self):
         self.assertEqual(str(Clock(8, 0)), "08:00")