hpath 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d97f5894eb225d22238c604ab0fc4e06a31e5fa1
4
- data.tar.gz: a52d7400d901e41584dafb8613048358cfb78a2f
3
+ metadata.gz: 8a89f4dea22fe5b719e3f2c4402806bc07eb0676
4
+ data.tar.gz: 8a49750d03f96bfaf46c1a50181778d99eecea08
5
5
  SHA512:
6
- metadata.gz: 7ed6a57ed11bd16a296a6572ea282190960f0f60ca925d7226c469c461948c9bdc89e10972fed14221316c0fa138382cabf6c10b9a05485bbcf524b1b49f3bc1
7
- data.tar.gz: 3e0bb084b7274f51c8c53bd175ee3992f7049d3689d257f9851a31376ce88bd01cc8e6800d3a105c761869fd3e8f7fb3497b064c66b004f3f3c2abbf16368af4
6
+ metadata.gz: ffed5bced9a44c68d3d7d85b54580bec011178371519b4827daae79236d9230decf7ffcd6eb58eba2a8596be83490434ec1559032fe8a4308534ff1840c7c1f8
7
+ data.tar.gz: a777601d83a4633630ff28ce802577e25fe702a8ff767aa30cc20b922d51814ec986c39d1bbd8690ebd68429ee1a0d6361e24656a3f08d71dc84547952985741
@@ -8,6 +8,11 @@ module Hpath
8
8
  _get(object, hpath[:path])
9
9
  end
10
10
 
11
+ def self.set(object, hpath_string, value)
12
+ hpath = Hpath::Parser.parse(hpath_string)
13
+ _set(object, hpath[:path], value)
14
+ end
15
+
11
16
  #
12
17
  private
13
18
  #
@@ -39,18 +44,46 @@ module Hpath
39
44
  self._get(object, paths, _object)
40
45
  end
41
46
 
47
+ def self._set(object, paths, value)
48
+ if paths.empty?
49
+ if object.is_a?(Array)
50
+ object.push(value)
51
+ elsif object.is_a?(Hash)
52
+ object.merge!(value)
53
+ end
54
+
55
+ return
56
+ else
57
+ path = paths.shift
58
+ end
59
+
60
+ if (_object = self._get(object, [path])).nil?
61
+ if object.is_a?(Array)
62
+ if path[:type] == Array
63
+ object.push(_object = [])
64
+ elsif path[:type] == Hash
65
+ object.push({ path[:identifier].to_sym => (_object = {}) })
66
+ end
67
+ elsif object.is_a?(Hash)
68
+ object[path[:identifier].to_sym] = (_object = path[:type].new)
69
+ end
70
+ end
71
+
72
+ self._set(_object, paths, value)
73
+ end
74
+
42
75
  def self._apply_filters(object, filter)
43
76
  if object.is_a?(Array)
44
77
  object.select do |element|
45
78
  filter.applies?(element)
46
79
  end
47
80
  else
48
- #binding.pry
81
+ # TODO
49
82
  end
50
83
  end
51
84
 
52
85
  def self._resolve_identifier(object, identifier)
53
- if object.is_a?(Array)
86
+ if object.is_a?(Array) && !object.empty?
54
87
  if identifier.to_s == "*"
55
88
  object
56
89
  else
@@ -71,14 +104,14 @@ module Hpath
71
104
  object[identifier.to_s] || object[identifier.to_sym]
72
105
  end
73
106
  else
74
- #binding.pry
107
+ # TODO
75
108
  end
76
109
  end
77
110
 
78
111
  def self._resolve_indices(object, indices)
79
112
  if indices.length == 1
80
113
  object[indices.first]
81
- else
114
+ elsif indices.length > 1
82
115
  indices.map { |index| object[index] }
83
116
  end
84
117
  end
@@ -21,6 +21,7 @@ class Hpath::Parser
21
21
  element[:indices] = [element[:indices]] if !element[:indices].nil? && !element[:indices].is_a?(Array)
22
22
  element[:keys] ||= nil
23
23
  element[:keys] = [element[:keys]] if !element[:keys].nil? && !element[:keys].is_a?(Array)
24
+ element[:type] = element[:type] == "[]" || element[:indices].is_a?(Array) ? Array : Hash
24
25
  element
25
26
  end
26
27
 
@@ -68,7 +69,7 @@ class Hpath::Parser
68
69
  }
69
70
 
70
71
  rule(:node) {
71
- str("/") >> (identifier.as(:identifier) | (str("::") >> identifier.as(:axis))).maybe >> (str("[") >> space? >> (indices.as(:indices) | filter | keys.as(:keys)) >> space? >> str("]")).maybe
72
+ str("/") >> (identifier.as(:identifier) | (str("::") >> identifier.as(:axis))).maybe >> (str("[]").as(:type) | (str("[") >> space? >> (indices.as(:indices) | filter | keys.as(:keys)) >> space? >> str("]"))).maybe
72
73
  }
73
74
 
74
75
  rule(:path) {
@@ -87,13 +88,14 @@ class Hpath::Parser
87
88
  def transformation
88
89
  @transformation ||=
89
90
  Class.new(Parslet::Transform) do
90
- rule(axis: simple(:axis), identifier: simple(:identifier), filter: subtree(:filter), indices: subtree(:indices), keys: subtree(:keys)) {
91
+ rule(axis: simple(:axis), identifier: simple(:identifier), filter: subtree(:filter), indices: subtree(:indices), keys: subtree(:keys), type: simple(:type)) {
91
92
  {
92
93
  axis: axis.nil? ? nil : axis.to_s,
93
94
  identifier: identifier.nil? ? nil : identifier.to_s,
94
95
  filter: filter,
95
96
  indices: indices.nil? ? nil : indices.map { |element| Integer(element[:index]) },
96
- keys: keys.nil? ? nil : keys.map { |element| element[:key].to_s.to_sym }
97
+ keys: keys.nil? ? nil : keys.map { |element| element[:key].to_s.to_sym },
98
+ type: type
97
99
  }
98
100
  }
99
101
 
@@ -1,3 +1,3 @@
1
1
  module Hpath
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -66,5 +66,31 @@ describe Hpath do
66
66
  expect(hpath_result).to eq([{ foo: { bar: "foobar" } }])
67
67
  end
68
68
  end
69
+
70
+ describe "returns nil for non-matching hpath expressions" do
71
+ it "does not process \"/key1\" for an empty array" do
72
+ hpath_result = Hpath.get([], "/foo")
73
+ expect(hpath_result).to eq(nil)
74
+ end
75
+ end
76
+ end
77
+
78
+ describe "#set" do
79
+ describe "sets the object identified by its hpath to the given value" do
80
+ it "processes \"/key1/key2\" for a hash" do
81
+ Hpath.set(hash = {}, "/foo/bar", { muff: "foobar"})
82
+ expect(hash).to eq({foo: { bar: { muff: "foobar"} }})
83
+ end
84
+
85
+ it "processes \"/[]/key2\" for a array" do
86
+ Hpath.set(array = [], "/[]/bar", { foo: "bar"})
87
+ expect(array).to eq([{ bar: {foo: "bar"} }])
88
+ end
89
+
90
+ it "processes \"/key1[]/key2\" for a array" do
91
+ Hpath.set(hash = {}, "/key1[]/bar", { foo: "bar"})
92
+ expect(hash).to eq({key1: [{bar: {foo: "bar"}}]})
93
+ end
94
+ end
69
95
  end
70
96
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hpath
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Sievers