object-template 0.7 → 0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b73996b9c7fc5ffc66469ea21da8612d85cfc0ca
4
- data.tar.gz: 6982a85aa7cb5f4ef27b1d3d07e219cbf39cbacd
3
+ metadata.gz: 5bc6ab2eb7270d6d725ee9f0e37d6ff2ad31789d
4
+ data.tar.gz: d20466007e0d8895d6d97184cde46729b4c17d02
5
5
  SHA512:
6
- metadata.gz: df96bc58a7d309b763ef03f7fc3c4742593a5692b5fdb5acdf7704f53b00f476fdf4c1c3f90cca9f308c92d377a0f6a28889b4815b134c2db83da87bbc821e26
7
- data.tar.gz: 0874436e5f11014864e032d99c67d731f21d665d6e7cc635f2f16bf585f28189a6c2aeb3599e6876ade7bfd130659501258c78e5249412f667e0c099c3ee7648
6
+ metadata.gz: c40640688e71dabf0dcb8374d036ec9aa4c8f41c5c997c2f850f58d2437fce8eba4cf25c0e41dd6bbc26aa18cb6954efdd1e586fd2c773f4216167f4547884e9
7
+ data.tar.gz: e30e5141b82b1d2dbeb846efa765566bb331741f59f9bfc75f934ee9b4305ce54c426d2e70497cf68c66293fe517487c1fd22d63e3fbca70344c353eb04e7727
@@ -2,9 +2,9 @@ require 'set'
2
2
 
3
3
  # Base class for classes of templates used to match somewhat arbitrary objects.
4
4
  class ObjectTemplate
5
- VERSION = "0.7"
5
+ VERSION = "0.8"
6
6
 
7
- attr_reader :spec
7
+ attr_reader :spec, :key_converter
8
8
 
9
9
  # A set implementation that treats the matching operator (===) as membership.
10
10
  # Used internally by PortableObjectTemplate, but can also be used in
@@ -15,7 +15,7 @@ class ObjectTemplate
15
15
 
16
16
  # The key_converter is for matching objects that, for example, have had symbol
17
17
  # keys serialized to strings. Using a converter that round-trips through the
18
- # same serialializer, symbols in keys will match strings. However, symbols in
18
+ # same serializer, symbols in keys will match strings. However, symbols in
19
19
  # values will not.
20
20
  def initialize spec, key_converter = nil
21
21
  unless spec.respond_to? :size and spec.respond_to? :each
@@ -24,18 +24,19 @@ class ObjectTemplate
24
24
 
25
25
  @spec = spec
26
26
  @size = spec.size
27
+ @key_converter = key_converter
27
28
  @matchers = []
28
29
 
29
30
  if spec.respond_to? :to_hash # assume hash-like
30
31
  @shibboleth = :to_hash
31
32
  spec.each do |k, v|
32
- kc = key_converter ? key_converter[k=>nil].keys[0] : k
33
- # Note: cannot use key_converter[v] because v may have class, regex,
34
- # or other non-serializable object.
33
+ if key_converter
34
+ k = key_converter[k => nil].keys[0]
35
35
  # Note: the [k=>nil].keys[0] is needed instead of just [k]
36
36
  # because the key_converter might not convert values, only keys.
37
37
  # We do not assume that k is a scalar.
38
- fill_matchers kc, v
38
+ end
39
+ fill_matchers k, v
39
40
  end
40
41
 
41
42
  else # assume array-like
@@ -93,6 +94,9 @@ end
93
94
  # classes, regexes, ranges, and so on, in addition to single values.
94
95
  class RubyObjectTemplate < ObjectTemplate
95
96
  def fill_matchers k, v # :nodoc:
97
+ if key_converter
98
+ (v = key_converter[v]) rescue nil # error means templating object
99
+ end
96
100
  @matchers << [k, v]
97
101
  end
98
102
  end
@@ -116,6 +120,9 @@ class PortableObjectTemplate < ObjectTemplate
116
120
  v.each do |kk, vv|
117
121
  case kk
118
122
  when :value, "value"
123
+ if key_converter
124
+ (vv = key_converter[vv]) rescue nil # error means templating object
125
+ end
119
126
  @matchers << [k, vv]
120
127
  when :set, "set"
121
128
  @matchers << [k, MemberMatchingSet.new(vv)]
@@ -4,41 +4,90 @@ require 'minitest/autorun'
4
4
  require 'object-template'
5
5
  require 'assert-threequal'
6
6
 
7
- class TestKeyConv < Minitest::Test
8
- include AssertThreequal
9
-
10
- POT = PortableObjectTemplate
11
- ROT = RubyObjectTemplate
12
-
13
- def test_match_converted_key
14
- assert_threequal(
15
- POT.new(
16
- {foo: {value: 1}},
17
- proc {|x| Symbol === x ? x.to_s : x}),
18
- {"foo" => 1}
19
- )
20
-
21
- assert_threequal(
22
- ROT.new(
23
- {foo: 1},
24
- proc {|x| Symbol === x ? x.to_s : x}),
25
- {"foo" => 1}
26
- )
27
- end
7
+ begin
8
+ require 'msgpack'
9
+ rescue LoadError
10
+ $stderr.puts "skipping TestKeyConv: msgpack lib not available"
11
+ else
12
+
13
+ class TestKeyConv < Minitest::Test
14
+ include AssertThreequal
15
+
16
+ POT = PortableObjectTemplate
17
+ ROT = RubyObjectTemplate
18
+
19
+ CK_STR = proc {|x|
20
+ MessagePack.load(
21
+ MessagePack.dump(x))}
22
+ CK_SYM = proc {|x|
23
+ MessagePack.load(
24
+ MessagePack.dump(x), symbolize_keys: true)}
25
+
26
+ def test_match_converted_key
27
+ assert_threequal(
28
+ POT.new(
29
+ {foo: {value: {bar: 1}}}, CK_STR),
30
+ {"foo" => {"bar" => 1}}
31
+ )
32
+
33
+ assert_threequal(
34
+ POT.new(
35
+ {foo: {value: {"bar" => 1}}}, CK_STR),
36
+ {"foo" => {"bar" => 1}}
37
+ )
38
+
39
+ assert_threequal(
40
+ ROT.new(
41
+ {foo: {bar: 1}}, CK_STR),
42
+ {"foo" => {"bar" => 1}}
43
+ )
28
44
 
29
- def test_not_match_unconverted_key
30
- assert_not_threequal(
31
- POT.new(
32
- {foo: {value: 1}},
33
- proc {|x| x}),
34
- {"foo" => 1}
35
- )
36
-
37
- assert_not_threequal(
38
- ROT.new(
39
- {foo: 1},
40
- proc {|x| x}),
41
- {"foo" => 1}
42
- )
45
+ assert_threequal(
46
+ ROT.new(
47
+ {"foo" => {"bar" => 1}}, CK_STR),
48
+ {"foo" => {"bar" => 1}}
49
+ )
50
+
51
+ assert_threequal(
52
+ POT.new(
53
+ {foo: {value: {bar: 1}}}, CK_SYM),
54
+ {foo: {bar: 1}}
55
+ )
56
+
57
+ assert_threequal(
58
+ POT.new(
59
+ {foo: {value: {"bar" => 1}}}, CK_SYM),
60
+ {foo: {bar: 1}}
61
+ )
62
+
63
+ assert_threequal(
64
+ ROT.new(
65
+ {foo: {bar: 1}}, CK_SYM),
66
+ {foo: {bar: 1}}
67
+ )
68
+
69
+ assert_threequal(
70
+ ROT.new(
71
+ {"foo" => {"bar" => 1}}, CK_SYM),
72
+ {foo: {bar: 1}}
73
+ )
74
+ end
75
+
76
+ def test_not_match_unconverted_key
77
+ assert_not_threequal(
78
+ POT.new(
79
+ {foo: {value: 1}},
80
+ proc {|x| x}),
81
+ {"foo" => 1}
82
+ )
83
+
84
+ assert_not_threequal(
85
+ ROT.new(
86
+ {foo: 1},
87
+ proc {|x| x}),
88
+ {"foo" => 1}
89
+ )
90
+ end
43
91
  end
92
+
44
93
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: object-template
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.7'
4
+ version: '0.8'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel VanderWerf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-18 00:00:00.000000000 Z
11
+ date: 2014-04-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Templates for matching objects.
14
14
  email: vjoel@users.sourceforge.net