cistern 2.8.2 → 2.10.0
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 +4 -4
- data/README.md +3 -3
- data/lib/cistern/attributes.rb +14 -13
- data/lib/cistern/client.rb +2 -2
- data/lib/cistern/data.rb +1 -1
- data/lib/cistern/hash_support.rb +4 -4
- data/lib/cistern/model.rb +1 -1
- data/lib/cistern/request.rb +9 -9
- data/lib/cistern/version.rb +1 -1
- data/spec/attributes_spec.rb +17 -7
- data/spec/hash_spec.rb +7 -5
- data/spec/mock_data_spec.rb +16 -14
- data/spec/request_spec.rb +3 -3
- metadata +6 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5694e3c035882e211fed481448edf7d039a885fe8873426fad6c03e09e28e6e5
|
4
|
+
data.tar.gz: 1c989dab18e74848c0162c7c54a4b4768b6a9057e23792f0309d10ca6e7f2c04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc91cc89774987f5856a5c815a9afb64763febe9c025edd11f4f11437d1ca07eafa11868081211d4811540f4fec8c271be8c7b5482f91e226a30def1529d3756
|
7
|
+
data.tar.gz: 9be18655d0d71b1c0e6583854ec13e109924feb1586cc116b32da723edd6740f27d90ee9dca9940362bb500f7bf8dcfe497b1168e5ca2057aac7fd374e727a1c
|
data/README.md
CHANGED
@@ -613,12 +613,12 @@ class Blog::GetPost
|
|
613
613
|
[post_id, stringify_keys(parameters)]
|
614
614
|
end
|
615
615
|
|
616
|
-
def _mock(*args)
|
617
|
-
mock(*setup(*args))
|
616
|
+
def _mock(*args, **kwargs)
|
617
|
+
mock(*setup(*args, **kwargs))
|
618
618
|
end
|
619
619
|
|
620
620
|
def _real(post_id, parameters)
|
621
|
-
real(*setup(*args))
|
621
|
+
real(*setup(*args, **kwargs))
|
622
622
|
end
|
623
623
|
end
|
624
624
|
```
|
data/lib/cistern/attributes.rb
CHANGED
@@ -2,18 +2,19 @@
|
|
2
2
|
|
3
3
|
module Cistern::Attributes
|
4
4
|
PROTECTED_METHODS = [:cistern, :service, :identity, :collection].freeze
|
5
|
-
TRUTHY = ['true', '1'].freeze
|
5
|
+
TRUTHY = [true, 'On', 'ON', 'on', 'True', 'TRUE', 'true', '1', 1].freeze
|
6
6
|
|
7
7
|
module ClassMethods
|
8
8
|
def parsers
|
9
9
|
@parsers ||= {
|
10
|
-
array:
|
11
|
-
boolean:
|
12
|
-
date:
|
13
|
-
float:
|
14
|
-
integer:
|
15
|
-
|
16
|
-
|
10
|
+
array: ->(v, _) { [*v] },
|
11
|
+
boolean: ->(v, _) { TRUTHY.include?(v) },
|
12
|
+
date: ->(v, _) { v.is_a?(Date) ? v : v && Date.parse(v.to_s) },
|
13
|
+
float: ->(v, _) { v&.to_f },
|
14
|
+
integer: ->(v, _) { v&.to_i },
|
15
|
+
strict_integer: ->(v, _) { Integer(v) },
|
16
|
+
string: ->(v, _) { v&.to_s },
|
17
|
+
time: ->(v, _) { v.is_a?(Time) ? v : v && Time.parse(v.to_s) },
|
17
18
|
}
|
18
19
|
end
|
19
20
|
|
@@ -64,11 +65,11 @@ module Cistern::Attributes
|
|
64
65
|
name_sym
|
65
66
|
end
|
66
67
|
|
67
|
-
def identity(*args)
|
68
|
-
args.any? ? @identity = attribute(*args) : (@identity ||= parent_identity)
|
68
|
+
def identity(*args, **kwargs)
|
69
|
+
args.any? ? @identity = attribute(*args, **kwargs) : (@identity ||= parent_identity)
|
69
70
|
end
|
70
71
|
|
71
|
-
def ignore_attributes(*args)
|
72
|
+
def ignore_attributes(*args, **kwargs)
|
72
73
|
@ignored_attributes = args
|
73
74
|
end
|
74
75
|
|
@@ -228,7 +229,7 @@ module Cistern::Attributes
|
|
228
229
|
#
|
229
230
|
# @raise [ArgumentError] if any requested attribute does not have a value
|
230
231
|
# @return [Hash] of matching attributes
|
231
|
-
def requires(*args)
|
232
|
+
def requires(*args, **kwargs)
|
232
233
|
missing, required = missing_attributes(args)
|
233
234
|
|
234
235
|
if missing.length == 1
|
@@ -244,7 +245,7 @@ module Cistern::Attributes
|
|
244
245
|
#
|
245
246
|
# @raise [ArgumentError] if no requested attributes have values
|
246
247
|
# @return [Hash] of matching attributes
|
247
|
-
def requires_one(*args)
|
248
|
+
def requires_one(*args, **kwargs)
|
248
249
|
missing, required = missing_attributes(args)
|
249
250
|
|
250
251
|
if missing.length == args.length
|
data/lib/cistern/client.rb
CHANGED
@@ -248,11 +248,11 @@ module Cistern::Client
|
|
248
248
|
@_requests ||= []
|
249
249
|
end
|
250
250
|
|
251
|
-
def requires(*args)
|
251
|
+
def requires(*args, **kwargs)
|
252
252
|
required_arguments.concat(args)
|
253
253
|
end
|
254
254
|
|
255
|
-
def recognizes(*args)
|
255
|
+
def recognizes(*args, **kwargs)
|
256
256
|
recognized_arguments.concat(args)
|
257
257
|
end
|
258
258
|
|
data/lib/cistern/data.rb
CHANGED
data/lib/cistern/hash_support.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Cistern::HashSupport
|
4
|
-
def hash_slice(*args); Cistern::Hash.slice(*args); end
|
5
|
-
def hash_except(*args); Cistern::Hash.except(*args); end
|
6
|
-
def hash_except!(*args); Cistern::Hash.except!(*args); end
|
7
|
-
def hash_stringify_keys(*args); Cistern::Hash.stringify_keys(*args); end
|
4
|
+
def hash_slice(*args, **kwargs); Cistern::Hash.slice(*args, **kwargs); end
|
5
|
+
def hash_except(*args, **kwargs); Cistern::Hash.except(*args, **kwargs); end
|
6
|
+
def hash_except!(*args, **kwargs); Cistern::Hash.except!(*args, **kwargs); end
|
7
|
+
def hash_stringify_keys(*args, **kwargs); Cistern::Hash.stringify_keys(*args, **kwargs); end
|
8
8
|
end
|
data/lib/cistern/model.rb
CHANGED
@@ -14,7 +14,7 @@ module Cistern::Model
|
|
14
14
|
def self.cistern_model(cistern, klass, name)
|
15
15
|
cistern.const_get(:Collections).module_eval <<-EOS, __FILE__, __LINE__
|
16
16
|
def #{name}(attributes={})
|
17
|
-
#{klass.name}.new(
|
17
|
+
#{klass.name}.new({cistern: self}.merge(attributes))
|
18
18
|
end
|
19
19
|
EOS
|
20
20
|
end
|
data/lib/cistern/request.rb
CHANGED
@@ -24,8 +24,8 @@ module Cistern::Request
|
|
24
24
|
end
|
25
25
|
|
26
26
|
method = <<-EOS
|
27
|
-
def #{name}(*args)
|
28
|
-
#{klass}.new(self).call(*args)
|
27
|
+
def #{name}(*args, **kwargs)
|
28
|
+
#{klass}.new(self).call(*args, **kwargs)
|
29
29
|
end
|
30
30
|
EOS
|
31
31
|
|
@@ -34,12 +34,12 @@ module Cistern::Request
|
|
34
34
|
cistern::Real.module_eval method, __FILE__, __LINE__
|
35
35
|
end
|
36
36
|
|
37
|
-
def self.service_request(*args)
|
37
|
+
def self.service_request(*args, **kwargs)
|
38
38
|
Cistern.deprecation(
|
39
39
|
'#service_request is deprecated. Please use #cistern_request',
|
40
40
|
caller[0]
|
41
41
|
)
|
42
|
-
cistern_request(*args)
|
42
|
+
cistern_request(*args, **kwargs)
|
43
43
|
end
|
44
44
|
|
45
45
|
attr_reader :cistern
|
@@ -56,8 +56,8 @@ module Cistern::Request
|
|
56
56
|
@cistern = cistern
|
57
57
|
end
|
58
58
|
|
59
|
-
def call(*args)
|
60
|
-
dispatch(*args)
|
59
|
+
def call(*args, **kwargs)
|
60
|
+
dispatch(*args, **kwargs)
|
61
61
|
end
|
62
62
|
|
63
63
|
def real(*)
|
@@ -71,7 +71,7 @@ module Cistern::Request
|
|
71
71
|
protected
|
72
72
|
|
73
73
|
# @fixme remove _{mock,real} methods and call {mock,real} directly before 3.0 release.
|
74
|
-
def dispatch(*args)
|
74
|
+
def dispatch(*args, **kwargs)
|
75
75
|
to = cistern.mocking? ? :mock : :real
|
76
76
|
|
77
77
|
legacy_method = :"_#{to}"
|
@@ -82,9 +82,9 @@ module Cistern::Request
|
|
82
82
|
caller[0]
|
83
83
|
)
|
84
84
|
|
85
|
-
public_send(legacy_method, *args)
|
85
|
+
public_send(legacy_method, *args, **kwargs)
|
86
86
|
else
|
87
|
-
public_send(to, *args)
|
87
|
+
public_send(to, *args, **kwargs)
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
data/lib/cistern/version.rb
CHANGED
data/spec/attributes_spec.rb
CHANGED
@@ -204,14 +204,23 @@ describe Cistern::Attributes, 'parsing' do
|
|
204
204
|
expect(subject.new(list: 'item').list).to eq(['item'])
|
205
205
|
end
|
206
206
|
|
207
|
-
|
208
|
-
|
209
|
-
|
207
|
+
context 'with type integer' do
|
208
|
+
before do
|
209
|
+
subject.class_eval do
|
210
|
+
attribute :int, type: :integer
|
211
|
+
end
|
210
212
|
end
|
211
213
|
|
212
|
-
|
213
|
-
|
214
|
-
|
214
|
+
[
|
215
|
+
['42.5', 42],
|
216
|
+
['42', 42],
|
217
|
+
[42, 42],
|
218
|
+
["4f", 4],
|
219
|
+
].each do |input, output|
|
220
|
+
specify("input of #{input.inspect} casts to #{output.inspect}") do
|
221
|
+
expect(subject.new(int: input).int).to eq(output)
|
222
|
+
end
|
223
|
+
end
|
215
224
|
end
|
216
225
|
|
217
226
|
it 'should parse a float' do
|
@@ -250,7 +259,8 @@ describe Cistern::Attributes, 'parsing' do
|
|
250
259
|
expect(subject.new({ 'squash' => { 'type' => 'fred' } }).butternut_id).to be_nil
|
251
260
|
|
252
261
|
# override intermediate processing
|
253
|
-
expect(subject.new({ 'squash' => { 'id' => '12', 'type' => 'fred' } }).squash)
|
262
|
+
expect(subject.new({ 'squash' => { 'id' => '12', 'type' => 'fred' } }).squash)
|
263
|
+
.to eq({ 'id' => '12', 'type' => 'fred' })
|
254
264
|
|
255
265
|
# alias of override
|
256
266
|
expect(subject.new({ 'squash' => { 'id' => '12', 'type' => 'fred' } }).vegetable).to eq({ 'id' => '12', 'type' => 'fred' })
|
data/spec/hash_spec.rb
CHANGED
@@ -72,11 +72,13 @@ describe Cistern::Collection do
|
|
72
72
|
end
|
73
73
|
|
74
74
|
describe Cistern::Singular do
|
75
|
-
subject
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
75
|
+
subject do
|
76
|
+
Class.new(Sample::Singular) do
|
77
|
+
def reload
|
78
|
+
attributes
|
79
|
+
end
|
80
|
+
end.new({})
|
81
|
+
end
|
80
82
|
|
81
83
|
include_examples 'hash_support'
|
82
84
|
end
|
data/spec/mock_data_spec.rb
CHANGED
@@ -51,20 +51,22 @@ describe 'mock data' do
|
|
51
51
|
include_examples 'mock_data#backend', :hash
|
52
52
|
end
|
53
53
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
54
|
+
if ENV.key?('REDIS_URI')
|
55
|
+
describe 'Cistern::Data::Redis' do
|
56
|
+
include_examples 'mock_data#backend', :redis
|
57
|
+
|
58
|
+
context 'with an explicit client' do
|
59
|
+
before(:each) do
|
60
|
+
@other = Redis::Namespace.new('other_cistern', Redis.new)
|
61
|
+
@other.set('x', 'y')
|
62
|
+
end
|
63
|
+
|
64
|
+
include_examples 'mock_data#backend', :redis, client: Redis::Namespace.new('cistern', Redis.new)
|
65
|
+
|
66
|
+
after(:each) do
|
67
|
+
expect(@other.get('x')).to eq('y')
|
68
|
+
@other.del('x')
|
69
|
+
end
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
data/spec/request_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe 'Cistern::Request' do
|
|
11
11
|
Sample::Real.class_eval do
|
12
12
|
attr_reader :service_args
|
13
13
|
|
14
|
-
def initialize(*args)
|
14
|
+
def initialize(*args, **kwargs)
|
15
15
|
@service_args = args
|
16
16
|
end
|
17
17
|
end
|
@@ -30,11 +30,11 @@ describe 'Cistern::Request' do
|
|
30
30
|
|
31
31
|
it 'calls the appropriate method' do
|
32
32
|
class GetSamples < Sample::Request
|
33
|
-
def real(*args)
|
33
|
+
def real(*args, **kwargs)
|
34
34
|
cistern.service_args + args + ['real']
|
35
35
|
end
|
36
36
|
|
37
|
-
def mock(*args)
|
37
|
+
def mock(*args, **kwargs)
|
38
38
|
args + ['mock']
|
39
39
|
end
|
40
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cistern
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Lane
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: API client framework extracted from Fog
|
14
14
|
email:
|
@@ -75,7 +75,7 @@ homepage: http://joshualane.com/cistern
|
|
75
75
|
licenses:
|
76
76
|
- MIT
|
77
77
|
metadata: {}
|
78
|
-
post_install_message:
|
78
|
+
post_install_message:
|
79
79
|
rdoc_options: []
|
80
80
|
require_paths:
|
81
81
|
- lib
|
@@ -90,9 +90,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
90
|
- !ruby/object:Gem::Version
|
91
91
|
version: '0'
|
92
92
|
requirements: []
|
93
|
-
|
94
|
-
|
95
|
-
signing_key:
|
93
|
+
rubygems_version: 3.4.10
|
94
|
+
signing_key:
|
96
95
|
specification_version: 4
|
97
96
|
summary: API client framework
|
98
97
|
test_files:
|