pavlov 0.0.1 → 0.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.
- data/lib/pavlov.rb +0 -2
- data/lib/pavlov/command.rb +1 -3
- data/lib/pavlov/helpers.rb +2 -2
- data/lib/pavlov/interactor.rb +5 -0
- data/lib/pavlov/operation.rb +43 -15
- data/lib/pavlov/query.rb +1 -4
- data/lib/pavlov/validations.rb +14 -9
- data/lib/pavlov/version.rb +2 -2
- metadata +39 -18
- data/lib/pavlov/entity.rb +0 -61
- data/lib/pavlov/helpers/safe_evaluator.rb +0 -17
- data/lib/pavlov/utils.rb +0 -7
- data/lib/pavlov/validations/errors.rb +0 -21
- data/lib/pavlov/validations/not_valid.rb +0 -7
data/lib/pavlov.rb
CHANGED
@@ -29,7 +29,6 @@ module Pavlov
|
|
29
29
|
end
|
30
30
|
|
31
31
|
require_relative 'pavlov/helpers'
|
32
|
-
require_relative 'pavlov/utils'
|
33
32
|
require_relative 'pavlov/access_denied'
|
34
33
|
require_relative 'pavlov/validation_error'
|
35
34
|
require_relative 'pavlov/validations'
|
@@ -37,5 +36,4 @@ require_relative 'pavlov/operation'
|
|
37
36
|
require_relative 'pavlov/command'
|
38
37
|
require_relative 'pavlov/query'
|
39
38
|
require_relative 'pavlov/interactor'
|
40
|
-
require_relative 'pavlov/entity'
|
41
39
|
require_relative 'pavlov/version'
|
data/lib/pavlov/command.rb
CHANGED
data/lib/pavlov/helpers.rb
CHANGED
@@ -7,12 +7,12 @@ module Pavlov
|
|
7
7
|
|
8
8
|
def query name, *args
|
9
9
|
args = add_pavlov_options args
|
10
|
-
Pavlov.query name, *args
|
10
|
+
Pavlov.query name, *args
|
11
11
|
end
|
12
12
|
|
13
13
|
def command name, *args
|
14
14
|
args = add_pavlov_options args
|
15
|
-
Pavlov.command name, *args
|
15
|
+
Pavlov.command name, *args
|
16
16
|
end
|
17
17
|
|
18
18
|
def pavlov_options
|
data/lib/pavlov/interactor.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'active_support/concern'
|
2
2
|
require 'active_support/inflector'
|
3
|
+
require 'pavlov/operation'
|
3
4
|
|
4
5
|
module Pavlov
|
5
6
|
module Interactor
|
@@ -16,5 +17,9 @@ module Pavlov
|
|
16
17
|
@queue ||= :interactor_operations
|
17
18
|
end
|
18
19
|
end
|
20
|
+
|
21
|
+
def authorized?
|
22
|
+
raise NotImplementedError
|
23
|
+
end
|
19
24
|
end
|
20
25
|
end
|
data/lib/pavlov/operation.rb
CHANGED
@@ -1,47 +1,71 @@
|
|
1
1
|
require 'active_support/concern'
|
2
|
+
require 'pavlov/validations'
|
3
|
+
require 'pavlov/helpers'
|
4
|
+
require_relative 'access_denied'
|
2
5
|
|
3
6
|
module Pavlov
|
4
7
|
module Operation
|
5
8
|
extend ActiveSupport::Concern
|
6
9
|
include Pavlov::Helpers
|
7
10
|
include Pavlov::Validations
|
8
|
-
|
9
|
-
def
|
10
|
-
@options
|
11
|
+
|
12
|
+
def initialize(*params)
|
13
|
+
keys, names, @options = extract_arguments(params)
|
14
|
+
set_instance_variables keys, names
|
15
|
+
validate
|
16
|
+
|
17
|
+
check_authorization
|
18
|
+
|
19
|
+
finish_initialize if respond_to? :finish_initialize
|
11
20
|
end
|
12
21
|
|
13
|
-
def
|
14
|
-
|
22
|
+
def validate
|
23
|
+
if respond_to? :valid?
|
24
|
+
valid?
|
25
|
+
else
|
26
|
+
true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def call(*args, &block)
|
31
|
+
execute(*args, &block)
|
15
32
|
end
|
16
33
|
|
17
|
-
|
18
|
-
|
34
|
+
private
|
35
|
+
|
36
|
+
def pavlov_options
|
37
|
+
@options
|
19
38
|
end
|
20
39
|
|
21
|
-
def
|
40
|
+
def extract_arguments(params)
|
22
41
|
keys = (respond_to? :arguments) ? arguments : []
|
23
42
|
names = params.first(keys.length)
|
43
|
+
|
24
44
|
if params.length == keys.length + 1
|
25
|
-
|
45
|
+
options = params.last
|
26
46
|
elsif params.length == keys.length
|
27
|
-
|
47
|
+
options = {}
|
28
48
|
else
|
29
49
|
raise "wrong number of arguments."
|
30
50
|
end
|
31
51
|
|
52
|
+
[keys, names, options]
|
53
|
+
end
|
54
|
+
|
55
|
+
def set_instance_variables(keys, names)
|
32
56
|
(keys.zip names).each do |pair|
|
33
57
|
name = "@" + pair[0].to_s
|
34
58
|
value = pair[1]
|
35
59
|
instance_variable_set(name, value)
|
36
60
|
end
|
61
|
+
end
|
37
62
|
|
38
|
-
|
39
|
-
|
40
|
-
finish_initialize if respond_to? :finish_initialize
|
63
|
+
def raise_unauthorized(message='Unauthorized')
|
64
|
+
raise Pavlov::AccessDenied, message
|
41
65
|
end
|
42
66
|
|
43
|
-
def
|
44
|
-
|
67
|
+
def check_authorization
|
68
|
+
raise_unauthorized if respond_to? :authorized?, true and not authorized?
|
45
69
|
end
|
46
70
|
|
47
71
|
module ClassMethods
|
@@ -57,6 +81,10 @@ module Pavlov
|
|
57
81
|
define_method :arguments do
|
58
82
|
keys
|
59
83
|
end
|
84
|
+
|
85
|
+
class_eval do
|
86
|
+
attr_reader(*keys)
|
87
|
+
end
|
60
88
|
end
|
61
89
|
|
62
90
|
# make our interactors behave as Resque jobs
|
data/lib/pavlov/query.rb
CHANGED
data/lib/pavlov/validations.rb
CHANGED
@@ -1,21 +1,18 @@
|
|
1
|
-
require_relative 'validations/errors'
|
2
|
-
require_relative 'validations/not_valid'
|
3
|
-
|
4
1
|
module Pavlov
|
5
2
|
module Validations
|
6
|
-
def errors
|
7
|
-
@errors ||= Pavlov::Validations::Errors.new
|
8
|
-
end
|
9
|
-
|
10
3
|
def validate_hexadecimal_string param_name, param
|
11
|
-
|
4
|
+
#warn "[DEPRECATION] `validate_hexadecimal_string` is deprecated. Please use the ActiveModel validation instead."
|
5
|
+
raise Pavlov::ValidationError, "#{param_name.to_s} should be an hexadecimal string." unless param.is_a? String and /\A[\da-fA-F]+\Z/.match param
|
12
6
|
end
|
13
7
|
|
14
8
|
def validate_regex param_name, param, regex, message
|
9
|
+
#warn "[DEPRECATION] `validate_integer` is deprecated. Please use the default format_of ActiveModel validator instead."
|
15
10
|
raise Pavlov::ValidationError, "#{param_name.to_s} #{message}" unless regex.match param
|
16
11
|
end
|
17
12
|
|
18
|
-
def validate_integer param_name, param
|
13
|
+
def validate_integer param_name, param, opts = {}
|
14
|
+
#warn "[DEPRECATION] `validate_integer` is deprecated. Please use the default numericality ActiveModel validator with the :only_integer option instead."
|
15
|
+
return if opts[:allow_blank] && param.blank?
|
19
16
|
raise Pavlov::ValidationError, "#{param_name.to_s} should be an integer." unless param.is_a? Integer
|
20
17
|
end
|
21
18
|
|
@@ -24,14 +21,22 @@ module Pavlov
|
|
24
21
|
end
|
25
22
|
|
26
23
|
def validate_string param_name, param
|
24
|
+
#warn "[DEPRECATION] `validate_string` is deprecated. Please use the ActiveModel validation instead."
|
27
25
|
raise Pavlov::ValidationError, "#{param_name.to_s} should be a string." unless param.is_a? String
|
28
26
|
end
|
29
27
|
|
28
|
+
def validate_nonempty_string param_name, param
|
29
|
+
#warn "[DEPRECATION] `validate_string` is deprecated. Please use the ActiveModel validation with the :non_empty option instead."
|
30
|
+
raise Pavlov::ValidationError, "#{param_name.to_s} should be a nonempty string." unless param.is_a?(String) && not(param.nil?) && not(param.empty?)
|
31
|
+
end
|
32
|
+
|
30
33
|
def validate_integer_string param_name, param
|
34
|
+
#warn "[DEPRECATION] `validate_integer_string` is deprecated. Please use the ActiveModel validation instead."
|
31
35
|
raise Pavlov::ValidationError, "#{param_name.to_s} should be an integer string." unless param.is_a? String and /\A\d+\Z/.match param
|
32
36
|
end
|
33
37
|
|
34
38
|
def validate_not_nil param_name, param
|
39
|
+
#warn "[DEPRECATION] `validate_not_nil` is deprecated. Please use the default presence ActiveModel validator instead."
|
35
40
|
raise Pavlov::ValidationError, "#{param_name.to_s} should not be nil." if param.nil?
|
36
41
|
end
|
37
42
|
end
|
data/lib/pavlov/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pavlov
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2013-
|
16
|
+
date: 2013-07-03 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: activesupport
|
@@ -32,7 +32,23 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 3.2.7
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
35
|
+
name: activemodel
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 3.2.7
|
42
|
+
type: :runtime
|
43
|
+
prerelease: false
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 3.2.7
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: rspec
|
36
52
|
requirement: !ruby/object:Gem::Requirement
|
37
53
|
none: false
|
38
54
|
requirements:
|
@@ -48,7 +64,7 @@ dependencies:
|
|
48
64
|
- !ruby/object:Gem::Version
|
49
65
|
version: '0'
|
50
66
|
- !ruby/object:Gem::Dependency
|
51
|
-
name:
|
67
|
+
name: guard
|
52
68
|
requirement: !ruby/object:Gem::Requirement
|
53
69
|
none: false
|
54
70
|
requirements:
|
@@ -64,7 +80,7 @@ dependencies:
|
|
64
80
|
- !ruby/object:Gem::Version
|
65
81
|
version: '0'
|
66
82
|
- !ruby/object:Gem::Dependency
|
67
|
-
name: guard
|
83
|
+
name: guard-bundler
|
68
84
|
requirement: !ruby/object:Gem::Requirement
|
69
85
|
none: false
|
70
86
|
requirements:
|
@@ -80,7 +96,7 @@ dependencies:
|
|
80
96
|
- !ruby/object:Gem::Version
|
81
97
|
version: '0'
|
82
98
|
- !ruby/object:Gem::Dependency
|
83
|
-
name: guard-
|
99
|
+
name: guard-rspec
|
84
100
|
requirement: !ruby/object:Gem::Requirement
|
85
101
|
none: false
|
86
102
|
requirements:
|
@@ -96,7 +112,7 @@ dependencies:
|
|
96
112
|
- !ruby/object:Gem::Version
|
97
113
|
version: '0'
|
98
114
|
- !ruby/object:Gem::Dependency
|
99
|
-
name: guard
|
115
|
+
name: terminal-notifier-guard
|
100
116
|
requirement: !ruby/object:Gem::Requirement
|
101
117
|
none: false
|
102
118
|
requirements:
|
@@ -159,6 +175,22 @@ dependencies:
|
|
159
175
|
- - ! '>='
|
160
176
|
- !ruby/object:Gem::Version
|
161
177
|
version: '0'
|
178
|
+
- !ruby/object:Gem::Dependency
|
179
|
+
name: coveralls
|
180
|
+
requirement: !ruby/object:Gem::Requirement
|
181
|
+
none: false
|
182
|
+
requirements:
|
183
|
+
- - ! '>='
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
186
|
+
type: :development
|
187
|
+
prerelease: false
|
188
|
+
version_requirements: !ruby/object:Gem::Requirement
|
189
|
+
none: false
|
190
|
+
requirements:
|
191
|
+
- - ! '>='
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '0'
|
162
194
|
description: Pavlov is a opinionated toolbox to help you architect your Ruby project.
|
163
195
|
email:
|
164
196
|
- jan+pavlov@deelstra.org
|
@@ -169,17 +201,12 @@ files:
|
|
169
201
|
- lib/pavlov.rb
|
170
202
|
- lib/pavlov/access_denied.rb
|
171
203
|
- lib/pavlov/command.rb
|
172
|
-
- lib/pavlov/entity.rb
|
173
204
|
- lib/pavlov/helpers.rb
|
174
|
-
- lib/pavlov/helpers/safe_evaluator.rb
|
175
205
|
- lib/pavlov/interactor.rb
|
176
206
|
- lib/pavlov/operation.rb
|
177
207
|
- lib/pavlov/query.rb
|
178
|
-
- lib/pavlov/utils.rb
|
179
208
|
- lib/pavlov/validation_error.rb
|
180
209
|
- lib/pavlov/validations.rb
|
181
|
-
- lib/pavlov/validations/errors.rb
|
182
|
-
- lib/pavlov/validations/not_valid.rb
|
183
210
|
- lib/pavlov/version.rb
|
184
211
|
homepage: https://github.com/Factlink/pavlov/
|
185
212
|
licenses: []
|
@@ -193,18 +220,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
193
220
|
- - ! '>='
|
194
221
|
- !ruby/object:Gem::Version
|
195
222
|
version: '0'
|
196
|
-
segments:
|
197
|
-
- 0
|
198
|
-
hash: -4075067472850494356
|
199
223
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
224
|
none: false
|
201
225
|
requirements:
|
202
226
|
- - ! '>='
|
203
227
|
- !ruby/object:Gem::Version
|
204
228
|
version: '0'
|
205
|
-
segments:
|
206
|
-
- 0
|
207
|
-
hash: -4075067472850494356
|
208
229
|
requirements: []
|
209
230
|
rubyforge_project:
|
210
231
|
rubygems_version: 1.8.23
|
data/lib/pavlov/entity.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
require_relative 'helpers/safe_evaluator'
|
2
|
-
|
3
|
-
module Pavlov
|
4
|
-
class Entity
|
5
|
-
def self.attributes *args
|
6
|
-
args.each do |attribute_name|
|
7
|
-
define_attribute_writer attribute_name
|
8
|
-
attr_reader attribute_name
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.new hash = {}, &block
|
13
|
-
super().send :mutate, hash, &block
|
14
|
-
end
|
15
|
-
|
16
|
-
def update hash = {}, &block
|
17
|
-
self.dup.send :mutate, hash, &block
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
def mutate hash, &block
|
22
|
-
copy_hash_values hash
|
23
|
-
safely_evaluate_against(&block) if block_given?
|
24
|
-
validate if respond_to? :validate
|
25
|
-
self
|
26
|
-
end
|
27
|
-
|
28
|
-
def copy_hash_values hash
|
29
|
-
make_temporary_mutatable do
|
30
|
-
hash.each {|key,value| send("#{key}=",value)}
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def safely_evaluate_against &block
|
35
|
-
make_temporary_mutatable do
|
36
|
-
caller_instance = eval "self", block.binding
|
37
|
-
evaluator = Pavlov::Helpers::SafeEvaluator.new(self, caller_instance)
|
38
|
-
evaluator.instance_eval(&block)
|
39
|
-
end
|
40
|
-
self
|
41
|
-
end
|
42
|
-
|
43
|
-
def make_temporary_mutatable &block
|
44
|
-
@mutable = true
|
45
|
-
block.call
|
46
|
-
@mutable = false
|
47
|
-
end
|
48
|
-
|
49
|
-
def self.define_attribute_writer attribute_name
|
50
|
-
define_method "#{attribute_name}=" do |new_value|
|
51
|
-
raise_not_mutable unless @mutable
|
52
|
-
instance_variable_symbol = "@#{attribute_name}".to_sym
|
53
|
-
instance_variable_set instance_variable_symbol, new_value
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def raise_not_mutable
|
58
|
-
raise "This entity is immutable, please use 'instance = #{self.class.name}.new do; self.attribute = 'value'; end' or 'instance = instance.update do; self.attribute = 'value'; end'."
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Pavlov
|
2
|
-
module Helpers
|
3
|
-
class SafeEvaluator < BasicObject
|
4
|
-
def initialize target_instance, caller_instance
|
5
|
-
@target_instance, @caller_instance = target_instance, caller_instance
|
6
|
-
end
|
7
|
-
|
8
|
-
def method_missing method_name, *args
|
9
|
-
if method_name[-1] == '='
|
10
|
-
@target_instance.public_send method_name, *args
|
11
|
-
else
|
12
|
-
@caller_instance.send method_name, *args
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
data/lib/pavlov/utils.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Pavlov
|
2
|
-
module Validations
|
3
|
-
module Errors
|
4
|
-
include Enumerable
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
@messages = {}
|
8
|
-
end
|
9
|
-
|
10
|
-
def each &block
|
11
|
-
@messages.each_key do |attribute|
|
12
|
-
@messages[attribute.to_s].each { |error| block.call attribute, error }
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def add attribute, error_message
|
17
|
-
(@messages[attribute.to_s] ||= []) << error_message
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|