scorpio 0.2.2 → 0.2.3

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
  SHA256:
3
- metadata.gz: 772f6b246d831d6737118bed2f363358ac6b62dc055c3503f0a96e04d416985e
4
- data.tar.gz: 20e4a1d856105a0c2f25d80fb252afd7b91bc35f71babc47f2d8ab3fbd46b2df
3
+ metadata.gz: 7d8f3fb8a266157352a5f4054b732210bbbff161fb11d780828a3fbbdbf6922d
4
+ data.tar.gz: 7ba1d3d214decdfa3c8b40df5d3d63377a160b8a6cb937090f8c3b67e47d4f45
5
5
  SHA512:
6
- metadata.gz: 8796f5f5227d3a70c374ae94b30cb6be1d7ad4dad71fb399c37c6c74e21117442d582a44d3417c828f156e42690d8f34a692bc3de5fcae4070431583ba1e5d88
7
- data.tar.gz: 5d1b897306c6a43e16016e13f125e81d0408e3aca0c94009a2d8804aef0835b3a5cec144441de2979b51c9436e2fff016f0a1046e65d25dcc17471f60cda5869
6
+ metadata.gz: 2ed9a28136c4661fab6bbe9309533e3521df809f8146e3e92eb397baf37f7880a80d7d3491d8d2d5670e06189653c6fac51fff349409af46402be6f29658efff
7
+ data.tar.gz: a4cd19c9266a038a93330d42aa1bb407b4d493dad6f7ddd3e1c61e5803c4fa84a65cf3802b7ceeba9d859e9cb5ed20b3124d140ed215d087d338b8e60fae579a
@@ -1,3 +1,8 @@
1
+ # v0.2.3
2
+ - fix mutability of SchemaInstanceBase with #[]=; instance is modified in place
3
+ - add mutability to JSON::Node with #[]=
4
+ - fix problems with initialize extending SchemaInstanceBase instances with Enumerable; just include it on SchemaInstanceBase itself
5
+
1
6
  # v0.2.2
2
7
  - Scorpio::SchemaInstanceJSONCoder
3
8
 
@@ -66,6 +66,14 @@ module Scorpio
66
66
  end
67
67
  end
68
68
 
69
+ def []=(k, v)
70
+ if v.is_a?(Node)
71
+ content[k] = v.content
72
+ else
73
+ content[k] = v
74
+ end
75
+ end
76
+
69
77
  def deref
70
78
  content = self.content
71
79
 
@@ -203,6 +211,7 @@ module Scorpio
203
211
  to_a
204
212
  end
205
213
 
214
+ include Enumerable
206
215
  include Arraylike
207
216
 
208
217
  def as_json(*opt) # needs redefined after including Enumerable
@@ -231,6 +240,7 @@ module Scorpio
231
240
  inject({}) { |h, (k, v)| h[k] = v; h }
232
241
  end
233
242
 
243
+ include Enumerable
234
244
  include Hashlike
235
245
 
236
246
  def as_json(*opt) # needs redefined after including Enumerable
@@ -5,6 +5,7 @@ module Scorpio
5
5
  # base class for representing an instance of an instance described by a schema
6
6
  class SchemaInstanceBase
7
7
  include Memoize
8
+ include Enumerable
8
9
 
9
10
  class << self
10
11
  def schema_id
@@ -58,18 +59,16 @@ module Scorpio
58
59
  elsif @instance.is_a?(Scorpio::JSON::ArrayNode)
59
60
  extend SchemaInstanceBaseArray
60
61
  end
61
- # certain methods need to be redefined after we are extended by Enumerable
62
- extend OverrideFromExtensions
63
- end
64
-
65
- module OverrideFromExtensions
66
- def as_json(*opt)
67
- Typelike.as_json(instance, *opt)
68
- end
69
62
  end
70
63
 
71
64
  attr_reader :instance
72
65
 
66
+ # each is overridden by SchemaInstanceBaseHash or SchemaInstanceBaseArray when appropriate. the base
67
+ # #each is not actually implemented, along with all the methods of Enumerable.
68
+ def each
69
+ raise NoMethodError, "Enumerable methods and #each not implemented for instance that is not like a hash or array: #{instance.pretty_inspect.chomp}"
70
+ end
71
+
73
72
  def parents
74
73
  parent = @origin
75
74
  (@origin.instance.path.size...self.instance.path.size).map do |i|
@@ -130,6 +129,10 @@ module Scorpio
130
129
  instance.object_group_text
131
130
  end
132
131
 
132
+ def as_json(*opt)
133
+ Typelike.as_json(instance, *opt)
134
+ end
135
+
133
136
  def fingerprint
134
137
  {class: self.class, instance: instance}
135
138
  end
@@ -137,11 +140,8 @@ module Scorpio
137
140
 
138
141
  private
139
142
  def instance=(thing)
140
- clear_memo(:[])
141
143
  if instance_variable_defined?(:@instance)
142
- if @instance.class != thing.class
143
- raise(Scorpio::Bug, "will not accept instance of different class #{thing.class} to current instance class #{@instance.class} on #{self.class.inspect}")
144
- end
144
+ raise(Scorpio::Bug, "overwriting instance is not supported")
145
145
  end
146
146
  if thing.is_a?(SchemaInstanceBase)
147
147
  warn "assigning instance to a SchemaInstanceBase instance is incorrect. received: #{thing.pretty_inspect.chomp}"
@@ -152,6 +152,15 @@ module Scorpio
152
152
  @instance = Scorpio::JSON::Node.new_by_type(Scorpio.deep_stringify_symbol_keys(thing), [])
153
153
  end
154
154
  end
155
+
156
+ def subscript_assign(subscript, value)
157
+ clear_memo(:[], subscript)
158
+ if value.is_a?(SchemaInstanceBase)
159
+ instance[subscript] = value.instance
160
+ else
161
+ instance[subscript] = value
162
+ end
163
+ end
155
164
  end
156
165
 
157
166
  # this module is just a namespace for schema classes.
@@ -211,7 +220,7 @@ module Scorpio
211
220
  end
212
221
 
213
222
  if schema.describes_hash?
214
- instance_method_modules = [m, SchemaInstanceBase, SchemaInstanceBaseArray, SchemaInstanceBaseHash, SchemaInstanceBase::OverrideFromExtensions]
223
+ instance_method_modules = [m, SchemaInstanceBase, SchemaInstanceBaseArray, SchemaInstanceBaseHash]
215
224
  instance_methods = instance_method_modules.map do |mod|
216
225
  mod.instance_methods + mod.private_instance_methods
217
226
  end.inject(Set.new, &:|)
@@ -271,11 +280,8 @@ module Scorpio
271
280
  end
272
281
  end
273
282
  end
274
-
275
283
  def []=(property_name, value)
276
- self.instance = instance.modified_copy do |hash|
277
- hash.merge(property_name => value)
278
- end
284
+ subscript_assign(property_name, value)
279
285
  end
280
286
  end
281
287
 
@@ -313,11 +319,7 @@ module Scorpio
313
319
  end
314
320
  end
315
321
  def []=(i, value)
316
- self.instance = instance.modified_copy do |ary|
317
- ary.each_with_index.map do |el, ary_i|
318
- ary_i == i ? value : el
319
- end
320
- end
322
+ subscript_assign(i, value)
321
323
  end
322
324
  end
323
325
  end
@@ -33,8 +33,6 @@ module Scorpio
33
33
  end
34
34
  end
35
35
  module Hashlike
36
- include Enumerable
37
-
38
36
  # safe methods which can be delegated to #to_hash (which the includer is assumed to have defined).
39
37
  # 'safe' means, in this context, nondestructive - methods which do not modify the receiver.
40
38
 
@@ -99,8 +97,6 @@ module Scorpio
99
97
  end
100
98
  end
101
99
  module Arraylike
102
- include Enumerable
103
-
104
100
  # safe methods which can be delegated to #to_ary (which the includer is assumed to have defined).
105
101
  # 'safe' means, in this context, nondestructive - methods which do not modify the receiver.
106
102
 
@@ -74,9 +74,15 @@ module Scorpio
74
74
  @memos[key][args_]
75
75
  end
76
76
 
77
- def clear_memo(key)
77
+ def clear_memo(key, *args)
78
78
  @memos ||= {}
79
- @memos[key].clear if @memos[key]
79
+ if @memos[key]
80
+ if args.empty?
81
+ @memos[key].clear
82
+ else
83
+ @memos[key].delete(args)
84
+ end
85
+ end
80
86
  end
81
87
  end
82
88
  extend Memoize
@@ -1,3 +1,3 @@
1
1
  module Scorpio
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency "faraday"
24
24
  # we are monkey patching json-schema with a fix that has not been merged in a timely fashion.
25
25
  spec.add_dependency "json-schema", "~> 2.8"
26
+ spec.add_dependency "api_hammer"
26
27
  spec.add_development_dependency "bundler", "~> 1.12"
27
28
  spec.add_development_dependency "rake", "~> 10.0"
28
29
  spec.add_development_dependency "minitest", "~> 5.0"
@@ -32,7 +33,6 @@ Gem::Specification.new do |spec|
32
33
  spec.add_development_dependency "rack", "~> 1.0"
33
34
  spec.add_development_dependency "rack-accept"
34
35
  spec.add_development_dependency "rack-test"
35
- spec.add_development_dependency "api_hammer"
36
36
  spec.add_development_dependency "activerecord"
37
37
  spec.add_development_dependency "sqlite3"
38
38
  spec.add_development_dependency "database_cleaner"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scorpio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ethan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-06 00:00:00.000000000 Z
11
+ date: 2018-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: api_hammer
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -164,20 +178,6 @@ dependencies:
164
178
  - - ">="
165
179
  - !ruby/object:Gem::Version
166
180
  version: '0'
167
- - !ruby/object:Gem::Dependency
168
- name: api_hammer
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '0'
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - ">="
179
- - !ruby/object:Gem::Version
180
- version: '0'
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: activerecord
183
183
  requirement: !ruby/object:Gem::Requirement