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 @@ -501,7 +501,7 @@ R.omit(['v1', 'v3'], obj) # {'v2': 2}
- [ ] partialRight
- [x] 0.1.4 partition
- [x] 0.1.2 path
- [ ] pathEq
- [x] pathEq
- [ ] pathOr
- [x] 0.1.2 paths
- [ ] pathSatisfies
Expand Down
1 change: 1 addition & 0 deletions ramda/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
from .Or import Or
from .partition import partition
from .path import path
from .pathEq import pathEq
from .paths import paths
from .pick import pick
from .pickAll import pickAll
Expand Down
5 changes: 5 additions & 0 deletions ramda/pathEq.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .equals import equals
from .path import path
from .private._curry3 import _curry3

pathEq = _curry3(lambda val, _path, obj: equals(path(_path, obj), val))
79 changes: 79 additions & 0 deletions test/test_pathEq.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@

import unittest

import ramda as R

from .helpers.Maybe import Just

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

dictObj = {
'a': 1,
'b': [{
'ba': 2,
}, {
'ba': 3
}]
}


class Obj:
def __init__(self, a, b):
self.a = a
self.b = b


class Ba:
def __init__(self, ba):
self.ba = ba


obj = Obj(1, [Ba(2), Ba(3)])


class TestPathEqForDict(unittest.TestCase):
def test_returns_true_if_the_path_matches_the_value(self):
self.assertEqual(True, R.pathEq(1, ['a'], dictObj))
self.assertEqual(True, R.pathEq(3, ['b', 1, 'ba'], dictObj))

def test_returns_false_for_non_matches(self):
self.assertEqual(False, R.pathEq('1', ['a'], dictObj))
self.assertEqual(False, R.pathEq(3, ['b', 0, 'ba'], dictObj))

def test_returns_false_for_non_existing_values(self):
self.assertEqual(False, R.pathEq('foo', ['c'], dictObj))
self.assertEqual(False, R.pathEq('foo', ['c', 'd'], dictObj))

def test_accepts_empty_path(self):
self.assertEqual(False, R.pathEq(42, [], {'a': 1, 'b': 2}))
self.assertEqual(True, R.pathEq(dictObj, [], dictObj))

class TestPathEqForObject(unittest.TestCase):
def test_returns_true_if_the_path_matches_the_value(self):
self.assertEqual(True, R.pathEq(1, ['a'], obj))
self.assertEqual(True, R.pathEq(3, ['b', 1, 'ba'], obj))

def test_returns_false_for_non_matches(self):
self.assertEqual(False, R.pathEq('1', ['a'], obj))
self.assertEqual(False, R.pathEq(3, ['b', 0, 'ba'], obj))

def test_returns_false_for_non_existing_values(self):
self.assertEqual(False, R.pathEq('foo', ['c'], obj))
self.assertEqual(False, R.pathEq('foo', ['c', 'd'], obj))

def test_accepts_empty_path(self):
self.assertEqual(False, R.pathEq(42, [], {'a': 1, 'b': 2}))
self.assertEqual(True, R.pathEq(obj, [], obj))

class TestPathEqForOthers(unittest.TestCase):
def test_has_R_equals_semantics(self):
self.assertEqual(False, R.pathEq(0.0, ['value'], {'value': -0.0}))
self.assertEqual(False, R.pathEq(-0.0, ['value'], {'value': 0.0}))
self.assertEqual(True, R.pathEq(float('nan'), ['value'], {'value': float('nan')}))
self.assertEqual(True, R.pathEq(Just([42]), ['value'], {'value': Just([42])}))


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