zyra 0.0.1 → 1.1.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/.circleci/config.yml +20 -6
- data/.rubocop.yml +1 -0
- data/Dockerfile +1 -1
- data/Dockerfile.circleci +7 -0
- data/README.md +68 -2
- data/config/check_specs.yml +1 -0
- data/config/yardstick.yml +6 -2
- data/docker-compose.yml +11 -0
- data/lib/zyra/creator.rb +68 -0
- data/lib/zyra/exceptions.rb +11 -0
- data/lib/zyra/finder.rb +103 -0
- data/lib/zyra/finder_creator.rb +162 -0
- data/lib/zyra/registry.rb +201 -0
- data/lib/zyra/version.rb +2 -2
- data/lib/zyra.rb +187 -1
- data/spec/integration/readme/zyra_spec.rb +54 -0
- data/spec/integration/yard/zyra/registry_spec.rb +135 -0
- data/spec/integration/yard/zyra_spec.rb +128 -0
- data/spec/lib/zyra/creator_spec.rb +75 -0
- data/spec/lib/zyra/finder_creator_spec.rb +263 -0
- data/spec/lib/zyra/finder_spec.rb +117 -0
- data/spec/lib/zyra/registry_spec.rb +19 -0
- data/spec/lib/zyra_spec.rb +14 -1
- data/spec/spec_helper.rb +18 -0
- data/spec/support/factories/user.rb +9 -0
- data/spec/support/factory_bot.rb +7 -0
- data/spec/support/models/post.rb +5 -0
- data/spec/support/models/user.rb +5 -0
- data/spec/support/schema.rb +18 -0
- data/spec/support/shared_examples/registry/find_or_create.rb +130 -0
- data/spec/support/shared_examples/registry/on.rb +42 -0
- data/spec/support/shared_examples/registry/register.rb +54 -0
- data/zyra.gemspec +7 -0
- metadata +107 -2
@@ -0,0 +1,130 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
shared_examples 'a method that returns or create a model' do
|
4
|
+
let(:key) { :user }
|
5
|
+
let(:email) { SecureRandom.hex(10) }
|
6
|
+
let(:model_class) { User }
|
7
|
+
|
8
|
+
let(:attributes) do
|
9
|
+
{
|
10
|
+
name: 'Some Name',
|
11
|
+
email: email,
|
12
|
+
password: 'SomePassword'
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when the model has not been registered' do
|
17
|
+
it do
|
18
|
+
expect { registry.find_or_create(key, attributes) }
|
19
|
+
.to raise_error(Zyra::Exceptions::NotRegistered)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when the model has been registered' do
|
24
|
+
before do
|
25
|
+
registry.register(model_class, find_by: :email)
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when there is no entry in the database' do
|
29
|
+
it do
|
30
|
+
expect(registry.find_or_create(key, attributes))
|
31
|
+
.to be_a(model_class)
|
32
|
+
end
|
33
|
+
|
34
|
+
it do
|
35
|
+
expect { registry.find_or_create(key, attributes) }
|
36
|
+
.to change(model_class, :count)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'when the entry is there with the same attributes' do
|
41
|
+
let!(:user) { create(:user, **attributes) }
|
42
|
+
|
43
|
+
it 'returns the user' do
|
44
|
+
expect(registry.find_or_create(key, attributes)).to eq(user)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when the entry is there with other attributes' do
|
49
|
+
let!(:user) { create(:user, email: email) }
|
50
|
+
|
51
|
+
it 'returns the user' do
|
52
|
+
expect(registry.find_or_create(key, attributes)).to eq(user)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when there is another entry' do
|
57
|
+
before { create(:user) }
|
58
|
+
|
59
|
+
it 'returns a new model' do
|
60
|
+
expect(registry.find_or_create(key, attributes))
|
61
|
+
.to be_a(model_class)
|
62
|
+
end
|
63
|
+
|
64
|
+
it do
|
65
|
+
expect { registry.find_or_create(key, attributes) }
|
66
|
+
.to change(model_class, :count)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when the keys is set as string' do
|
71
|
+
let(:keys) { 'email' }
|
72
|
+
let!(:user) { create(:user, **attributes) }
|
73
|
+
|
74
|
+
it 'finds the user the same way' do
|
75
|
+
expect(registry.find_or_create(key, attributes)).to eq(user)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'when the attributes have string keys' do
|
80
|
+
let(:attributes) { { 'email' => email } }
|
81
|
+
let!(:user) { create(:user, **attributes) }
|
82
|
+
|
83
|
+
it 'finds the user the same way' do
|
84
|
+
expect(registry.find_or_create(key, attributes)).to eq(user)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'when there is an event handler and it is triggered' do
|
89
|
+
let(:name) { 'new_name' }
|
90
|
+
|
91
|
+
let!(:user) { create(:user, **attributes) }
|
92
|
+
|
93
|
+
before do
|
94
|
+
new_name = name
|
95
|
+
|
96
|
+
registry.on(:user, :found) do |model|
|
97
|
+
model.update(name: new_name)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'runs the event after the model was found' do
|
102
|
+
expect { registry.find_or_create(key, attributes) }
|
103
|
+
.to change { user.reload.name }
|
104
|
+
.to(name)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when there is an event handler and it is not triggered' do
|
109
|
+
let(:name) { 'new_name' }
|
110
|
+
|
111
|
+
before do
|
112
|
+
new_name = name
|
113
|
+
|
114
|
+
registry.on(:user, :found) do |model|
|
115
|
+
model.update(name: new_name)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
it do
|
120
|
+
expect(registry.find_or_create(key, attributes))
|
121
|
+
.to be_a(model_class)
|
122
|
+
end
|
123
|
+
|
124
|
+
it do
|
125
|
+
expect { registry.find_or_create(key, attributes) }
|
126
|
+
.to change(model_class, :count)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
shared_examples 'a method that registers an event handler' do
|
4
|
+
let(:model_class) { User }
|
5
|
+
let(:key) { :user }
|
6
|
+
let(:name) { SecureRandom.hex(10) }
|
7
|
+
|
8
|
+
let(:attributes) do
|
9
|
+
{
|
10
|
+
name: 'Some Name',
|
11
|
+
email: 'someemail@srv.com',
|
12
|
+
password: 'SomePassword'
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when a creator has not been registered' do
|
17
|
+
it do
|
18
|
+
expect { registry.on(key, :found) {} }
|
19
|
+
.to raise_error(Zyra::Exceptions::NotRegistered)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when a creator has been registered' do
|
24
|
+
before do
|
25
|
+
create(:user, **attributes)
|
26
|
+
registry.register(model_class, find_by: :email)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'register a handler to be ran after an event' do
|
30
|
+
value = name
|
31
|
+
|
32
|
+
expect { registry.on(key, :found) { |m| m.name = value } }
|
33
|
+
.to change { registry.find_or_create(key, attributes).name }
|
34
|
+
.from('Some Name').to(name)
|
35
|
+
end
|
36
|
+
|
37
|
+
it do
|
38
|
+
expect(registry.on(key, :build) {})
|
39
|
+
.to be_a(Zyra::FinderCreator)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
shared_examples 'a method that registers a finder creator' do
|
4
|
+
let(:recovery_key) { [key.to_s, key.to_sym].sample }
|
5
|
+
let(:attributes) { { email: 'email@srv.com' } }
|
6
|
+
|
7
|
+
context 'when providing symbol alias' do
|
8
|
+
let(:key) { :user_alias }
|
9
|
+
|
10
|
+
it 'creates a creator for the given class' do
|
11
|
+
expect(registry.register(User, key, find_by: :email))
|
12
|
+
.to eq(Zyra::FinderCreator.new(User, [:email]))
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'register creator under the key' do
|
16
|
+
registry.register(User, key, find_by: :email)
|
17
|
+
|
18
|
+
expect(registry.find_or_create(recovery_key, attributes))
|
19
|
+
.to be_a(User)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when providing string alias' do
|
24
|
+
let(:key) { 'user' }
|
25
|
+
|
26
|
+
it 'creates a creator for the given class' do
|
27
|
+
expect(registry.register(User, key, find_by: :email))
|
28
|
+
.to eq(Zyra::FinderCreator.new(User, [:email]))
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'register creator under the key' do
|
32
|
+
registry.register(User, key, find_by: :email)
|
33
|
+
|
34
|
+
expect(registry.find_or_create(recovery_key, attributes))
|
35
|
+
.to be_a(User)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'when not providing an alias' do
|
40
|
+
let(:key) { :user }
|
41
|
+
|
42
|
+
it 'creates a creator for the given class' do
|
43
|
+
expect(registry.register(User, find_by: :email))
|
44
|
+
.to eq(Zyra::FinderCreator.new(User, [:email]))
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'register creator under the correct key' do
|
48
|
+
registry.register(User, key, find_by: :email)
|
49
|
+
|
50
|
+
expect(registry.find_or_create(recovery_key, attributes))
|
51
|
+
.to be_a(User)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/zyra.gemspec
CHANGED
@@ -19,7 +19,13 @@ Gem::Specification.new do |gem|
|
|
19
19
|
gem.test_files = gem.files.grep(%r{^(test|gem|features)/})
|
20
20
|
gem.require_paths = ['lib']
|
21
21
|
|
22
|
+
gem.add_runtime_dependency 'activesupport', '~> 5.2.0'
|
23
|
+
gem.add_runtime_dependency 'jace', '>= 0.1.1'
|
24
|
+
|
25
|
+
gem.add_development_dependency 'activerecord', '5.2.8.1'
|
22
26
|
gem.add_development_dependency 'bundler', '2.3.20'
|
27
|
+
gem.add_development_dependency 'database_cleaner', '1.8.3'
|
28
|
+
gem.add_development_dependency 'factory_bot', '6.2.1'
|
23
29
|
gem.add_development_dependency 'pry', '0.14.1'
|
24
30
|
gem.add_development_dependency 'pry-nav', '1.0.0'
|
25
31
|
gem.add_development_dependency 'rake', '13.0.1'
|
@@ -33,6 +39,7 @@ Gem::Specification.new do |gem|
|
|
33
39
|
gem.add_development_dependency 'rubocop-rspec', '1.38.1'
|
34
40
|
gem.add_development_dependency 'rubycritic', '4.7.0'
|
35
41
|
gem.add_development_dependency 'simplecov', '0.21.2'
|
42
|
+
gem.add_development_dependency 'sqlite3', '1.4.2'
|
36
43
|
gem.add_development_dependency 'yard', '0.9.27'
|
37
44
|
gem.add_development_dependency 'yardstick', '0.9.9'
|
38
45
|
end
|
metadata
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zyra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- DarthJee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 5.2.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 5.2.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jace
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.1.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.1.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activerecord
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 5.2.8.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 5.2.8.1
|
13
55
|
- !ruby/object:Gem::Dependency
|
14
56
|
name: bundler
|
15
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -24,6 +66,34 @@ dependencies:
|
|
24
66
|
- - '='
|
25
67
|
- !ruby/object:Gem::Version
|
26
68
|
version: 2.3.20
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: database_cleaner
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.8.3
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.8.3
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: factory_bot
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 6.2.1
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 6.2.1
|
27
97
|
- !ruby/object:Gem::Dependency
|
28
98
|
name: pry
|
29
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,6 +276,20 @@ dependencies:
|
|
206
276
|
- - '='
|
207
277
|
- !ruby/object:Gem::Version
|
208
278
|
version: 0.21.2
|
279
|
+
- !ruby/object:Gem::Dependency
|
280
|
+
name: sqlite3
|
281
|
+
requirement: !ruby/object:Gem::Requirement
|
282
|
+
requirements:
|
283
|
+
- - '='
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: 1.4.2
|
286
|
+
type: :development
|
287
|
+
prerelease: false
|
288
|
+
version_requirements: !ruby/object:Gem::Requirement
|
289
|
+
requirements:
|
290
|
+
- - '='
|
291
|
+
- !ruby/object:Gem::Version
|
292
|
+
version: 1.4.2
|
209
293
|
- !ruby/object:Gem::Dependency
|
210
294
|
name: yard
|
211
295
|
requirement: !ruby/object:Gem::Requirement
|
@@ -247,6 +331,7 @@ files:
|
|
247
331
|
- ".rubocop.yml"
|
248
332
|
- ".rubocop_todo.yml"
|
249
333
|
- Dockerfile
|
334
|
+
- Dockerfile.circleci
|
250
335
|
- Gemfile
|
251
336
|
- LICENSE
|
252
337
|
- README.md
|
@@ -257,13 +342,33 @@ files:
|
|
257
342
|
- config/yardstick.yml
|
258
343
|
- docker-compose.yml
|
259
344
|
- lib/zyra.rb
|
345
|
+
- lib/zyra/creator.rb
|
346
|
+
- lib/zyra/exceptions.rb
|
347
|
+
- lib/zyra/finder.rb
|
348
|
+
- lib/zyra/finder_creator.rb
|
349
|
+
- lib/zyra/registry.rb
|
260
350
|
- lib/zyra/version.rb
|
261
351
|
- spec/integration/readme/.keep
|
352
|
+
- spec/integration/readme/zyra_spec.rb
|
262
353
|
- spec/integration/yard/.keep
|
354
|
+
- spec/integration/yard/zyra/registry_spec.rb
|
355
|
+
- spec/integration/yard/zyra_spec.rb
|
356
|
+
- spec/lib/zyra/creator_spec.rb
|
357
|
+
- spec/lib/zyra/finder_creator_spec.rb
|
358
|
+
- spec/lib/zyra/finder_spec.rb
|
359
|
+
- spec/lib/zyra/registry_spec.rb
|
263
360
|
- spec/lib/zyra_spec.rb
|
264
361
|
- spec/spec_helper.rb
|
362
|
+
- spec/support/factories/user.rb
|
363
|
+
- spec/support/factory_bot.rb
|
265
364
|
- spec/support/models/.keep
|
365
|
+
- spec/support/models/post.rb
|
366
|
+
- spec/support/models/user.rb
|
367
|
+
- spec/support/schema.rb
|
266
368
|
- spec/support/shared_examples/.keep
|
369
|
+
- spec/support/shared_examples/registry/find_or_create.rb
|
370
|
+
- spec/support/shared_examples/registry/on.rb
|
371
|
+
- spec/support/shared_examples/registry/register.rb
|
267
372
|
- zyra.gemspec
|
268
373
|
- zyra.jpg
|
269
374
|
homepage: https://github.com/darthjee/zyra
|