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.
@@ -0,0 +1,201 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zyra
4
+ # @api public
5
+ #
6
+ # Registry of all registered creators
7
+ class Registry
8
+ # Register a new creator
9
+ #
10
+ # The creator will focus on one class and be registered under a
11
+ # symbol key
12
+ #
13
+ # @param klass [Class] Model class to be used by the creator
14
+ #
15
+ # @overload register(klass)
16
+ # When the key is not provided, it is infered from the class name
17
+ #
18
+ # @overload register(klass, key)
19
+ # @param key [String,Symbol] key to be used when storyin the creator
20
+ #
21
+ # @return [Zyra::FinderCreator] registered finder_creator
22
+ #
23
+ # @example Register models searching
24
+ # registry = Zyra::Registry.new
25
+ #
26
+ # registry.register(User, find_by: :email)
27
+ # registry
28
+ # .register(User, :user_by_name, find_by: :name)
29
+ # .on(:return) do |user|
30
+ # user.update(email: "#{user.name.gsub(/ /, '_')}@srv.com")
31
+ # end
32
+ #
33
+ # attributes = {
34
+ # name: 'my name',
35
+ # email: 'my_email@srv.com'
36
+ # }
37
+ #
38
+ # user = registry.find_or_create(:user, attributes)
39
+ # # returns a User with name 'my_email@srv.com'
40
+ #
41
+ # user = registry.find_or_create(:user_by_name, attributes)
42
+ # # returns a User with name 'my_name@srv.com'
43
+ def register(klass, key = nil, find_by:)
44
+ key ||= klass.name.gsub(/::([A-Z])/, '_\1').downcase
45
+
46
+ registry[key.to_sym] = FinderCreator.new(klass, find_by)
47
+ end
48
+
49
+ # Register a handler on a certain event
50
+ #
51
+ # Possible events are +found+, +build+, +create+
52
+ # and +return+
53
+ #
54
+ # @param key [String,Symbol] key under which the
55
+ # {FinderCreator finder_creator}
56
+ # is {Zyra::Registry#register registered}
57
+ #
58
+ # @param (see FinderCreator#after)
59
+ # @yield (see FinderCreator#after)
60
+ # @return [Finder] The finder registered under that key
61
+ #
62
+ # @see Zyra::Finder#find
63
+ # @see Zyra::Creator#create
64
+ #
65
+ # @example Adding a hook on return
66
+ # registry = Zyra::Registry.new
67
+ # registry.register(User, find_by: :email)
68
+ # registry.on(:user, :return) do |user|
69
+ # user.update(name: 'initial name')
70
+ # end
71
+ #
72
+ # email = 'email@srv.com'
73
+ #
74
+ # user = registry.find_or_create(
75
+ # :user,
76
+ # email: email
77
+ # )
78
+ # # returns a User with name 'initial name'
79
+ #
80
+ # user.update(name: 'some other name')
81
+ #
82
+ # user = registry.find_or_create(:user, email: email)
83
+ # # returns a User with name 'initial name'
84
+ #
85
+ # @example Adding a hook on found
86
+ # registry = Zyra::Registry.new
87
+ # registry.register(User, find_by: :email)
88
+ # registry.on(:user, :found) do |user|
89
+ # user.update(name: 'final name')
90
+ # end
91
+ #
92
+ # email = 'email@srv.com'
93
+ # attributes = { email: email, name: 'initial name' }
94
+ #
95
+ # user = registry.find_or_create(:user, attributes)
96
+ # # returns a User with name 'initial name'
97
+ #
98
+ # user = registry.find_or_create(:user, attributes)
99
+ # # returns a User with name 'final name'
100
+ #
101
+ # @example Adding a hook on build
102
+ # registry = Zyra::Registry.new
103
+ # registry.register(User, find_by: :email)
104
+ # registry.on(:user, :build) do |user|
105
+ # user.name = 'initial name'
106
+ # end
107
+ #
108
+ # email = 'email@srv.com'
109
+ #
110
+ # user = registry.find_or_create(:user, email: email)
111
+ # # returns a User with name 'initial name'
112
+ #
113
+ # user.update(name: 'some other name')
114
+ #
115
+ # user = registry.find_or_create(:user, email: email)
116
+ # # returns a User with name 'some other name'
117
+ #
118
+ # @example Adding a hook on create
119
+ # registry = Zyra::Registry.new
120
+ # registry.register(User, find_by: :email)
121
+ # registry.on(:user, :create) do |user|
122
+ # user.update(name: 'initial name')
123
+ # end
124
+ #
125
+ # email = 'email@srv.com'
126
+ #
127
+ # user = registry.find_or_create(:user, email: email)
128
+ # # returns a User with name 'initial name'
129
+ #
130
+ # user.update(name: 'some other name')
131
+ #
132
+ # user = registry.find_or_create(:user, email: email)
133
+ # # returns a User with name 'some other name'
134
+ def on(key, event, &block)
135
+ finder_creator_for(key).on(event, &block)
136
+ end
137
+
138
+ # Builds an instance of the registered model class
139
+ #
140
+ # @param key [String,Symbol] key under which the
141
+ # {FinderCreator finder_creator}
142
+ # is {Zyra::Registry#register registered}
143
+ #
144
+ # @param (see FinderCreator#find_or_create)
145
+ #
146
+ # @yield (see FinderCreator#find_or_create)
147
+ #
148
+ # @return [Object] A model either from the database or just
149
+ # inserted into it
150
+ #
151
+ # @see #register
152
+ # @see FinderCreator#find_or_create
153
+ #
154
+ # @example Regular usage passing all attributes
155
+ # registry = Zyra::Registry.new
156
+ # registry.register(User, find_by: :email)
157
+ #
158
+ # email = 'email@srv.com'
159
+ #
160
+ # user = registry.find_or_create(
161
+ # :user,
162
+ # email: email, name: 'initial name'
163
+ # )
164
+ # # returns a User with name 'initial name'
165
+ #
166
+ # user = registry.find_or_create(
167
+ # :user,
168
+ # email: email, name: 'final name'
169
+ # )
170
+ # # returns a User with name 'initial name'
171
+ def find_or_create(key, attributes, &block)
172
+ finder_creator_for(key).find_or_create(attributes, &block)
173
+ end
174
+
175
+ private
176
+
177
+ # @private
178
+ # @api private
179
+ # Returns a registered creator
180
+ #
181
+ # when the creator was not registerd, +nil+ is returned
182
+ #
183
+ # @param key [String,Symbol] key under which the creator is registered
184
+ #
185
+ # @return [Zyra::Creator]
186
+ def finder_creator_for(key)
187
+ registry[key.to_sym] ||
188
+ raise(Exceptions::NotRegistered)
189
+ end
190
+
191
+ # @private
192
+ # @api private
193
+ #
194
+ # Registry store for all creators
195
+ #
196
+ # @return [Hash] map of all registered creators
197
+ def registry
198
+ @registry ||= {}
199
+ end
200
+ end
201
+ end
data/lib/zyra/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Zyra
4
- VERSION = '0.0.1'
3
+ module Zyra
4
+ VERSION = '1.1.0'
5
5
  end
data/lib/zyra.rb CHANGED
@@ -1,7 +1,193 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_support'
4
+ require 'active_support/core_ext'
5
+ require 'jace'
6
+
3
7
  # @api public
4
8
  # @author darthjee
5
- class Zyra
9
+ #
10
+ # Zyra allows creators to be registered to ease up
11
+ # seeding
12
+ #
13
+ module Zyra
6
14
  autoload :VERSION, 'zyra/version'
15
+
16
+ autoload :Creator, 'zyra/creator'
17
+ autoload :Exceptions, 'zyra/exceptions'
18
+ autoload :Finder, 'zyra/finder'
19
+ autoload :FinderCreator, 'zyra/finder_creator'
20
+ autoload :Registry, 'zyra/registry'
21
+
22
+ class << self
23
+ # @method register(klass, key)
24
+ # @api public
25
+ #
26
+ # Register a new creator
27
+ #
28
+ # The creator will focus on one class and be registered under a
29
+ # symbol key
30
+ #
31
+ # @param klass [Class] Model class to be used by the creator
32
+ #
33
+ # @overload register(klass)
34
+ # When the key is not provided, it is infered from the class name
35
+ #
36
+ # @overload register(klass, key)
37
+ # @param key [String,Symbol] key to be used when storyin the creator
38
+ #
39
+ # @return [Zyra::FinderCreator] registered finder_creator
40
+ #
41
+ # @example Register models searching
42
+ # registry = Zyra::Registry.new
43
+ #
44
+ # registry.register(User, find_by: :email)
45
+ # registry
46
+ # .register(User, :user_by_name, find_by: :name)
47
+ # .on(:return) do |user|
48
+ # user.update(email: "#{user.name.gsub(/ /, '_')}@srv.com")
49
+ # end
50
+ #
51
+ # attributes = {
52
+ # name: 'my name',
53
+ # email: 'my_email@srv.com'
54
+ # }
55
+ #
56
+ # user = registry.find_or_create(:user, attributes)
57
+ # # returns a User with name 'my_email@srv.com'
58
+ #
59
+ # user = registry.find_or_create(:user_by_name, attributes)
60
+ # # returns a User with name 'my_name@srv.com'
61
+
62
+ # @method on(key, event, &block)
63
+ # @api public
64
+ #
65
+ # Register a handler on a certain event
66
+ #
67
+ # Possible events are +found+, +build+, +create+
68
+ # and +return+
69
+ #
70
+ # @param (see Zyra::Registry#after)
71
+ # @yield (see Zyra::Registry#after)
72
+ # @return [Finder] The finder registered under that key
73
+ #
74
+ # @example Adding a hook on return
75
+ # Zyra.register(User, find_by: :email)
76
+ # Zyra.on(:user, :return) do |user|
77
+ # user.update(name: 'initial name')
78
+ # end
79
+ #
80
+ # email = 'email@srv.com'
81
+ #
82
+ # user = Zyra.find_or_create(
83
+ # :user,
84
+ # email: email
85
+ # )
86
+ # # returns a User with name 'initial name'
87
+ #
88
+ # user.update(name: 'some other name')
89
+ #
90
+ # user = Zyra.find_or_create(:user, email: email)
91
+ # # returns a User with name 'initial name'
92
+ #
93
+ # @example Adding a hook on found
94
+ # Zyra.register(User, find_by: :email)
95
+ # Zyra.on(:user, :found) do |user|
96
+ # user.update(name: 'final name')
97
+ # end
98
+ #
99
+ # email = 'email@srv.com'
100
+ # attributes = { email: email, name: 'initial name' }
101
+ #
102
+ # user = Zyra.find_or_create(:user, attributes)
103
+ # # returns a User with name 'initial name'
104
+ #
105
+ # user = Zyra.find_or_create(:user, attributes)
106
+ # # returns a User with name 'final name'
107
+ #
108
+ # @example Adding a hook on build
109
+ # Zyra.register(User, find_by: :email)
110
+ # Zyra.on(:user, :build) do |user|
111
+ # user.name = 'initial name'
112
+ # end
113
+ #
114
+ # email = 'email@srv.com'
115
+ #
116
+ # user = Zyra.find_or_create(:user, email: email)
117
+ # # returns a User with name 'initial name'
118
+ #
119
+ # user.update(name: 'some other name')
120
+ #
121
+ # user = Zyra.find_or_create(:user, email: email)
122
+ # # returns a User with name 'some other name'
123
+ #
124
+ # @example Adding a hook on create
125
+ # Zyra.register(User, find_by: :email)
126
+ # Zyra.on(:user, :create) do |user|
127
+ # user.update(name: 'initial name')
128
+ # end
129
+ #
130
+ # email = 'email@srv.com'
131
+ #
132
+ # user = Zyra.find_or_create(:user, email: email)
133
+ # # returns a User with name 'initial name'
134
+ #
135
+ # user.update(name: 'some other name')
136
+ #
137
+ # user = Zyra.find_or_create(:user, email: email)
138
+ # # returns a User with name 'some other name'
139
+
140
+ # @method find_or_create(key, attributes = {}, &block)
141
+ # @api public
142
+ #
143
+ # Builds an instance of the registered model class
144
+ #
145
+ # @param (see Zyra::Registry#after)
146
+ # @yield (see Zyra::Registry#after)
147
+ # @return [Object] A model either from the database or just
148
+ # inserted into it
149
+ #
150
+ # @see .register
151
+ #
152
+ # @example Regular usage passing all attributes
153
+ # Zyra.register(User, find_by: :email)
154
+ #
155
+ # email = 'email@srv.com'
156
+ #
157
+ # user = Zyra.find_or_create(
158
+ # :user,
159
+ # email: email, name: 'initial name'
160
+ # )
161
+ # # returns a User with name 'initial name'
162
+ #
163
+ # user = Zyra.find_or_create(
164
+ # :user,
165
+ # email: email, name: 'final name'
166
+ # )
167
+ # # returns a User with name 'initial name'
168
+ delegate :register, :on, :find_or_create, to: :registry
169
+
170
+ # @api private
171
+ #
172
+ # Resets the state of the registry
173
+ #
174
+ # This is mainly used for testing
175
+ #
176
+ # @return [NilClass]
177
+ def reset
178
+ @registry = nil
179
+ end
180
+
181
+ private
182
+
183
+ # @private
184
+ # @api private
185
+ #
186
+ # Returns the registry containing all the creators
187
+ #
188
+ # @return [Registry]
189
+ def registry
190
+ @registry ||= Registry.new
191
+ end
192
+ end
7
193
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Zyra do
6
+ describe 'readme' do
7
+ it 'registering a model' do
8
+ Zyra
9
+ .register(User, find_by: :email)
10
+ .on(:build) do |user|
11
+ user.reference = SecureRandom.hex(16)
12
+ end
13
+
14
+ attributes = {
15
+ email: 'usr@srv.com',
16
+ name: 'Some User',
17
+ password: 'pass'
18
+ }
19
+
20
+ user = Zyra.find_or_create(:user, attributes) do |usr|
21
+ usr.update(attributes)
22
+ end
23
+
24
+ expect(user.name).to eq('Some User')
25
+ expect(user.email).to eq('usr@srv.com')
26
+ expect(user.password).to eq('pass')
27
+ expect(user.reference).not_to be_nil
28
+ end
29
+
30
+ it 'Registering hooks' do
31
+ Zyra
32
+ .register(User, find_by: :email)
33
+ .on(:build) do |user|
34
+ user.posts.build(name: 'first', content: 'some content')
35
+ end
36
+
37
+ Zyra.on(:user, :return) do |user|
38
+ user.update(reference: SecureRandom.hex(16))
39
+ end
40
+
41
+ attributes = {
42
+ email: 'usr@srv.com',
43
+ name: 'Some User',
44
+ password: 'pass'
45
+ }
46
+
47
+ user = Zyra.find_or_create(:user, attributes).reload
48
+
49
+ expect(user.email).to eq('usr@srv.com')
50
+ expect(user.posts).not_to be_empty
51
+ expect(user.reference).not_to be_nil
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Zyra::Registry do
6
+ describe 'yard' do
7
+ describe '#register' do
8
+ it 'Register models searching' do
9
+ registry = Zyra::Registry.new
10
+
11
+ registry.register(User, find_by: :email)
12
+ registry
13
+ .register(User, :user_by_name, find_by: :name)
14
+ .on(:return) do |user|
15
+ user.update(email: "#{user.name.gsub(/ /, '_')}@srv.com")
16
+ end
17
+
18
+ attributes = {
19
+ name: 'my name',
20
+ email: 'my_email@srv.com'
21
+ }
22
+
23
+ user = registry.find_or_create(:user, attributes)
24
+ expect(user.email).to eq('my_email@srv.com')
25
+
26
+ user = registry.find_or_create(:user_by_name, attributes)
27
+ expect(user.email).to eq('my_name@srv.com')
28
+ end
29
+ end
30
+
31
+ describe '#find_or_create' do
32
+ it 'Regular usage passing all attributes' do
33
+ registry = Zyra::Registry.new
34
+ registry.register(User, find_by: :email)
35
+
36
+ email = 'email@srv.com'
37
+
38
+ user = registry.find_or_create(
39
+ :user,
40
+ email: email, name: 'initial name'
41
+ )
42
+
43
+ expect(user.name).to eq('initial name')
44
+
45
+ user = registry.find_or_create(
46
+ :user,
47
+ email: email, name: 'final name'
48
+ )
49
+
50
+ expect(user.name).to eq('initial name')
51
+ end
52
+ end
53
+
54
+ describe '#on' do
55
+ it 'Adding a hook on return' do
56
+ registry = Zyra::Registry.new
57
+ registry.register(User, find_by: :email)
58
+ registry.on(:user, :return) do |user|
59
+ user.update(name: 'initial name')
60
+ end
61
+
62
+ email = 'email@srv.com'
63
+
64
+ user = registry.find_or_create(
65
+ :user,
66
+ email: email
67
+ )
68
+
69
+ expect(user.name).to eq('initial name')
70
+ user.update(name: 'some other name')
71
+
72
+ user = registry.find_or_create(:user, email: email)
73
+
74
+ expect(user.name).to eq('initial name')
75
+ end
76
+
77
+ it 'Adding a hook on found' do
78
+ registry = Zyra::Registry.new
79
+ registry.register(User, find_by: :email)
80
+ registry.on(:user, :found) do |user|
81
+ user.update(name: 'final name')
82
+ end
83
+
84
+ email = 'email@srv.com'
85
+ attributes = { email: email, name: 'initial name' }
86
+
87
+ user = registry.find_or_create(:user, attributes)
88
+
89
+ expect(user.name).to eq('initial name')
90
+
91
+ user = registry.find_or_create(:user, attributes)
92
+
93
+ expect(user.name).to eq('final name')
94
+ end
95
+
96
+ it 'Adding a hook on build' do
97
+ registry = Zyra::Registry.new
98
+ registry.register(User, find_by: :email)
99
+ registry.on(:user, :build) do |user|
100
+ user.name = 'initial name'
101
+ end
102
+
103
+ email = 'email@srv.com'
104
+
105
+ user = registry.find_or_create(:user, email: email)
106
+
107
+ expect(user.name).to eq('initial name')
108
+ user.update(name: 'some other name')
109
+
110
+ user = registry.find_or_create(:user, email: email)
111
+
112
+ expect(user.name).to eq('some other name')
113
+ end
114
+
115
+ it 'Adding a hook on create' do
116
+ registry = Zyra::Registry.new
117
+ registry.register(User, find_by: :email)
118
+ registry.on(:user, :create) do |user|
119
+ user.update(name: 'initial name')
120
+ end
121
+
122
+ email = 'email@srv.com'
123
+
124
+ user = registry.find_or_create(:user, email: email)
125
+
126
+ expect(user.name).to eq('initial name')
127
+ user.update(name: 'some other name')
128
+
129
+ user = registry.find_or_create(:user, email: email)
130
+
131
+ expect(user.name).to eq('some other name')
132
+ end
133
+ end
134
+ end
135
+ end