Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
0a60e6e
remove reference to logo from README
cmccandless Mar 5, 2019
7f7389d
Merge branch 'master' into cmccandless-patch-2
cmccandless Mar 6, 2019
9c3df67
Merge pull request #1707 from exercism/cmccandless-patch-2
cmccandless Mar 6, 2019
bd1e9dd
Update palindrome_products_test.py
AnAccountForReportingBugs Mar 7, 2019
8235356
Merge pull request #1713 from AnAccountForReportingBugs/patch-2
cmccandless Mar 7, 2019
b5f3b32
rest-api: update tests to v1.1.1
AnAccountForReportingBugs Mar 7, 2019
1ea5ef9
Merge pull request #1716 from AnAccountForReportingBugs/patch-5
cmccandless Mar 8, 2019
1af5240
retree: rename to satellite
cmccandless Mar 13, 2019
f172bd0
Merge pull request #1722 from cmccandless/retree-rename-to-satellite
cmccandless Mar 13, 2019
5a5b038
resistor-colors: Implement exercise (#1718)
ee7 Mar 18, 2019
5f5bf89
darts: Fixes FP for out of date test suite (#1731)
AnAccountForReportingBugs Mar 25, 2019
7574242
satellite: update tests to v2.0.0 (#1729)
AnAccountForReportingBugs Mar 25, 2019
bf0b7f2
leap: update tests to v1.5.1 (#1730)
AnAccountForReportingBugs Mar 25, 2019
a032397
rational-numbers: update tests to v1.1.0 (#1732)
AnAccountForReportingBugs Mar 25, 2019
58a689c
simple-cipher: update tests to v2.0.0 (#1733)
AnAccountForReportingBugs Mar 25, 2019
148f6d1
Travis: enforce configlet fmt (#1710)
cmccandless Mar 26, 2019
ccd3995
Create CODEOWNERS file (#1719)
cmccandless Mar 26, 2019
912c8f8
Stop leep test being ignored
sambryant4 Apr 3, 2019
b976218
Merge pull request #1738 from srbry/leap
cmccandless Apr 3, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @exercism/python
7 changes: 6 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,12 @@ matrix:
- env: JOB=HOUSEKEEPING
install: ./bin/fetch-configlet
before_script: ./bin/check-readmes.sh
script: ./bin/configlet lint .
script:
# May provide more useful output than configlet fmt
# if JSON is not valid or items are incomplete
- ./bin/configlet lint .
# Verify correct formatting in config.json
- ./bin/configlet fmt . && git diff --quiet
allow_failures:
- python: nightly

Expand Down
4 changes: 0 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,5 @@ If you're interested, Tim Pope even has an [entire blog post](http://tbaggery.co

If you're new to Git, take a look at [this short guide](https://github.com/exercism/docs/blob/master/contributing-to-language-tracks/README.md#git-basics).


## Python icon
The Python logo is an unregistered trademark. We are using a derived logo with the permission of the Python Software Foundation.

## License
This repository uses the [MIT License](/LICENSE).
12 changes: 11 additions & 1 deletion config.json
Original file line number Diff line number Diff line change
Expand Up @@ -1423,7 +1423,7 @@
]
},
{
"slug": "retree",
"slug": "satellite",
"uuid": "18467e72-e3b0-403c-896a-ce337f96e6f7",
"core": false,
"unlocked_by": "markdown",
Expand Down Expand Up @@ -1554,6 +1554,16 @@
"topics": [
"arrays"
]
},
{
"slug": "resistor-colors",
"uuid": "089f06a6-0759-479c-8c00-d699525a1e22",
"core": false,
"unlocked_by": null,
"difficulty": 1,
"topics": [
"arrays"
]
}
]
}
2 changes: 1 addition & 1 deletion exercises/darts/darts_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from darts import score


# Tests adapted from 'problem-specifications//canonical-data.json' @ v1.1.0
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.0

class darts_test(unittest.TestCase):
def test_dart_lands_outside_target(self):
Expand Down
6 changes: 5 additions & 1 deletion exercises/leap/leap_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@
from leap import is_leap_year


# Tests adapted from `problem-specifications//canonical-data.json` @ v1.4.0
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.5.1


class LeapTest(unittest.TestCase):
def test_year_not_divisible_by_4(self):
self.assertIs(is_leap_year(2015), False)

def test_year_divisible_by_2_not_divisible_by_4(self):
self.assertIs(is_leap_year(1970), False)

def test_year_divisible_by_4_not_divisible_by_100(self):
self.assertIs(is_leap_year(1996), True)

Expand Down
4 changes: 2 additions & 2 deletions exercises/palindrome-products/palindrome_products_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,12 @@ def test_largest_palindrome_from_four_digit_factors(self):
def test_empty_for_smallest_palindrome_if_none_in_range(self):
value, factors = smallest_palindrome(min_factor=1002, max_factor=1003)
self.assertIsNone(value)
self.assertEqual(factors, [])
self.assertFactorsEqual(factors, [])

def test_empty_for_largest_palindrome_if_none_in_range(self):
value, factors = largest_palindrome(min_factor=15, max_factor=15)
self.assertIsNone(value)
self.assertEqual(factors, [])
self.assertFactorsEqual(factors, [])

def test_error_for_smallest_if_min_is_more_than_max(self):
with self.assertRaisesWithMessage(ValueError):
Expand Down
8 changes: 7 additions & 1 deletion exercises/rational-numbers/rational_numbers_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from rational_numbers import Rational


# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.0

class RationalNumbersTest(unittest.TestCase):

Expand Down Expand Up @@ -71,9 +71,15 @@ def test_divide_by_one(self):
def test_absolute_value_of_positive(self):
self.assertEqual(abs(Rational(1, 2)), Rational(1, 2))

def test_absolute_value_of_positive_negative_numerator_denominator(self):
self.assertEqual(abs(Rational(-1, -2)), Rational(1, 2))

def test_absolute_value_of_negative(self):
self.assertEqual(abs(Rational(-1, 2)), Rational(1, 2))

def test_absolute_value_of_negative_with_negative_denominator(self):
self.assertEqual(abs(Rational(1, -2)), Rational(1, 2))

def test_absolute_value_of_zero(self):
self.assertEqual(abs(Rational(0, 1)), Rational(0, 1))

Expand Down
72 changes: 72 additions & 0 deletions exercises/resistor-colors/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Resistor Colors

If you want to build something using a Raspberry Pi, you'll probably use _resistors_. For this exercise, you need to know two things about them:

* Each resistor has a resistance value.
* Resistors are small - so small in fact that if you printed the resistance value on them, it would be hard to read.
To get around this problem, manufacturers print color-coded bands onto the resistors to denote their resistance values. Each band acts as a digit of a number. For example, if they printed a brown band (value 1) followed by a green band (value 5), it would translate to the number 15.

In this exercise, you are going to create a helpful program so that you don't have to remember the values of the bands. The program will take two colors as input, and output the correct number.

The band colors are encoded as follows:

- Black: 0
- Brown: 1
- Red: 2
- Orange: 3
- Yellow: 4
- Green: 5
- Blue: 6
- Violet: 7
- Grey: 8
- White: 9


## Exception messages

Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
a message.

To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
`raise Exception`, you should write:

```python
raise Exception("Meaningful message indicating the source of the error")
```

## Running the tests

To run the tests, run the appropriate command below ([why they are different](https://github.com/pytest-dev/pytest/issues/1629#issue-161422224)):

- Python 2.7: `py.test resistor_colors_test.py`
- Python 3.4+: `pytest resistor_colors_test.py`

Alternatively, you can tell Python to run the pytest module (allowing the same command to be used regardless of Python version):
`python -m pytest resistor_colors_test.py`

### Common `pytest` options

- `-v` : enable verbose output
- `-x` : stop running tests on first failure
- `--ff` : run failures from previous test before running other test cases

For other options, see `python -m pytest -h`

## Submitting Exercises

Note that, when trying to submit an exercise, make sure the solution is in the `$EXERCISM_WORKSPACE/python/resistor-colors` directory.

You can find your Exercism workspace by running `exercism debug` and looking for the line that starts with `Workspace`.

For more detailed information about running tests, code style and linting,
please see [Running the Tests](http://exercism.io/tracks/python/tests).

## Source

Maud de Vries, Erik Schierboom [https://github.com/exercism/problem-specifications/issues/1464](https://github.com/exercism/problem-specifications/issues/1464)

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.
16 changes: 16 additions & 0 deletions exercises/resistor-colors/example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
COLORS = [
'black',
'brown',
'red',
'orange',
'yellow',
'green',
'blue',
'violet',
'grey',
'white'
]


def value(colors):
return 10 * COLORS.index(colors[0]) + COLORS.index(colors[1])
2 changes: 2 additions & 0 deletions exercises/resistor-colors/resistor_colors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
def value(colors):
pass
23 changes: 23 additions & 0 deletions exercises/resistor-colors/resistor_colors_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import unittest

from resistor_colors import value


# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0

class ResistorColorsTest(unittest.TestCase):
def test_brown_and_black(self):
self.assertEqual(value(['brown', 'black']), 10)

def test_blue_and_grey(self):
self.assertEqual(value(['blue', 'grey']), 68)

def test_yellow_and_violet(self):
self.assertEqual(value(['yellow', 'violet']), 47)

def test_orange_and_orange(self):
self.assertEqual(value(['orange', 'orange']), 33)


if __name__ == '__main__':
unittest.main()
52 changes: 51 additions & 1 deletion exercises/rest-api/rest_api_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from rest_api import RestAPI


# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.2
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.1

class RestAPITest(unittest.TestCase):
def test_no_users(self):
Expand Down Expand Up @@ -325,6 +325,56 @@ def test_lender_owes_borrower_less_than_new_loan(self):
}
self.assertDictEqual(json.loads(response), expected)

def test_lender_owes_borrower_same_as_new_loan(self):
database = {
"users": [
{
"name": "Adam",
"owes": {
"Bob": 3.0
},
"owed_by": {},
"balance": -3.0
},
{
"name": "Bob",
"owes": {},
"owed_by": {
"Adam": 3.0
},
"balance": 3.0
}
]
}
api = RestAPI(database)
payload = json.dumps({
'lender': 'Adam',
'borrower': 'Bob',
'amount': 3.0
})
response = api.post('/iou', payload)
expected = {
'users': [
{
"name": "Adam",
"owes": {
},
"owed_by": {
},
"balance": 0.0
},
{
"name": "Bob",
"owes": {
},
"owed_by": {
},
"balance": 0.0
}
]
}
self.assertDictEqual(json.loads(response), expected)


if __name__ == '__main__':
unittest.main()
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import unittest

from retree import tree_from_traversals
from satellite import tree_from_traversals


# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
# Tests adapted from `problem-specifications//canonical-data.json` @ v2.0.0

class TwoFerTest(unittest.TestCase):
class SatelliteTest(unittest.TestCase):
def test_empty_tree(self):
preorder = []
inorder = []
Expand Down
8 changes: 6 additions & 2 deletions exercises/simple-cipher/simple_cipher_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from simple_cipher import Cipher


# Tests adapted from `problem-specifications//canonical-data.json` @ v1.2.0
# Tests adapted from `problem-specifications//canonical-data.json` @ v2.0.0

class SimpleCipherTest(unittest.TestCase):
# Utility functions
Expand Down Expand Up @@ -65,10 +65,14 @@ def test_can_wrap_on_decode(self):
cipher = Cipher('abcdefghij')
self.assertEqual(cipher.decode('zabcdefghi'), 'zzzzzzzzzz')

def test_can_handle_messages_longer_than_key(self):
def test_can_encode_messages_longer_than_key(self):
cipher = Cipher('abc')
self.assertEqual(cipher.encode('iamapandabear'), 'iboaqcnecbfcr')

def test_can_decode_messages_longer_than_key(self):
cipher = Cipher('abc')
self.assertEqual(cipher.decode('iboaqcnecbfcr'), 'iamapandabear')


if __name__ == '__main__':
unittest.main()