Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,7 @@ R.propEq(1, 'v1', {'v1': 1}) # True
```

- [ ] propIs
- [ ] propOr
- [x] propOr
- [x] 0.1.2 props
- [ ] propSatisfies
- [x] 0.1.2 range
Expand Down
1 change: 1 addition & 0 deletions ramda/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
from .project import project
from .prop import prop
from .propEq import propEq
from .propOr import propOr
from .props import props
from .range import range
from .reduce import reduce
Expand Down
5 changes: 5 additions & 0 deletions ramda/propOr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .defaultTo import defaultTo
from .private._curry3 import _curry3
from .prop import prop

propOr = _curry3(lambda val, p, obj: defaultTo(val, prop(p, obj)))
69 changes: 69 additions & 0 deletions test/test_propOr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@

import unittest

import ramda as R

"""
https://github.com/ramda/ramda/blob/master/test/propOr.js
"""

fred = {'name': 'Fred', 'age': 23}
anon = {'age': 99}

nm = R.propOr('Unknown', 'name')

class TestPropOrForDict(unittest.TestCase):
def test_returns_a_function_that_fetches_the_appropriate_property(self):
self.assertEqual('Fred', nm(fred))

def test_returns_the_default_value_when_the_property_does_not_exist(self):
self.assertEqual('Unknown', nm(anon))

def test_returns_the_default_value_when_the_object_is_None(self):
self.assertEqual('Unknown', nm(None))

def test_uses_the_default_when_supplied_an_object_with_a_None_value(self):
self.assertEqual('foo', R.propOr('foo', 'x', {'x': None}))

class Fred:
def __init__(self):
self.name = 'Fred'
self.age = 23
fredObj = Fred()

class Anon:
def __init__(self):
self.age = 99
anonObj = Anon()

class TestPropOrForObject(unittest.TestCase):
def test_returns_a_function_that_fetches_the_appropriate_property(self):
self.assertEqual('Fred', nm(fredObj))

def test_returns_the_default_value_when_the_property_does_not_exist(self):
self.assertEqual('Unknown', nm(anonObj))

def test_returns_the_default_value_when_the_object_is_None(self):
self.assertEqual('Unknown', nm(None))

def test_uses_the_default_when_supplied_an_object_with_a_None_value(self):
class NoneObj:
def __init__(self):
self.x = None
self.assertEqual('foo', R.propOr('foo', 'x', NoneObj()))

class TestPropOtherCases(unittest.TestCase):
def test_handles_number_as_property(self):
deities = ['Cthulhu', 'Dagon', 'Yog-Sothoth']
self.assertEqual('Cthulhu', R.propOr('Unknown', 0, deities))
self.assertEqual('Dagon', R.propOr('Unknown', 1, deities))
self.assertEqual('Yog-Sothoth', R.propOr('Unknown', 2, deities))
self.assertEqual('Yog-Sothoth', R.propOr('Unknown', -1, deities))
self.assertEqual('Unknown', R.propOr('Unknown', 3, deities))

def test_shows_the_same_behaviours_as_pathOr_for_a_nonexistent_property(self):
# TODO: implement pathOr
pass

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