flatter-extensions 0.2.0 → 0.2.1
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 +20 -4
- data/flatter-extensions.gemspec +1 -1
- data/lib/flatter/extensions/active_record.rb +51 -13
- data/lib/flatter/extensions/order.rb +11 -0
- data/lib/flatter/extensions/skipping.rb +26 -1
- data/lib/flatter/extensions/version.rb +1 -1
- metadata +26 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4542fbf33538d98c2fadc27ef9b858fed8555dca
|
4
|
+
data.tar.gz: 08923753f3dab118027e8d9e4012e61bbf80780d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 324a581971e9b55af3fceaa4df3d7975028491a4269876ebc64da21cd3135ae69fdf27727ac16f8149b507571c2e425afb25a76301b4af7fecc4f9f23c7cd496
|
7
|
+
data.tar.gz: 959e2f9da6ba4bf3b7bf2c76e5db7c698a539e4bcc7a2ff2b43a7322f1660ecb256c8d27ce6179f83d7d2dc329be33f4dc73fe38723ea61b4e6a5ffc7565672b
|
data/README.md
CHANGED
@@ -92,6 +92,20 @@ class PersonMapper < Flatter::Mapper
|
|
92
92
|
end
|
93
93
|
```
|
94
94
|
|
95
|
+
Starting from version `0.2.1`, there are `:skip_if` and `:reject_if` options
|
96
|
+
for mounted mappers. First one is used for skipping mounting if passed condition
|
97
|
+
is evaluated to non-falsy value. Second one is used to reject specific sets of
|
98
|
+
params before they are passed for collection processing.
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
class EmployeeMapper < Flatter::Mapper
|
102
|
+
map :first_name, :last_name
|
103
|
+
|
104
|
+
mount :department, skip_if: -> { department_name.blank? }
|
105
|
+
mount :projects, reject_if: ->(params){ params[:project_name].blank? }
|
106
|
+
end
|
107
|
+
```
|
108
|
+
|
95
109
|
### Order
|
96
110
|
|
97
111
|
```ruby
|
@@ -202,11 +216,13 @@ not supported for now.
|
|
202
216
|
Keep in mind that you can always pass `:target` option to control targets of
|
203
217
|
mounted mappers.
|
204
218
|
|
205
|
-
#### Saving is performed without
|
219
|
+
#### Saving is performed without validation and callbacks by default
|
206
220
|
|
207
|
-
|
208
|
-
|
209
|
-
|
221
|
+
On save your models will not be validated (and their validation callbacks will
|
222
|
+
not be called), and their `:save` callbacks will not be executed. However,
|
223
|
+
starting from version `0.2.1`, you can use `Flatter::Mapper` class-level methods
|
224
|
+
`enable_callback` (and it's alias `enable_callbacks`) to enable specific
|
225
|
+
callbacks, such as `enable_callbacks :create, :update`.
|
210
226
|
|
211
227
|
For example, if you have multi-step form and want to put all your validations in
|
212
228
|
model, there will be dozens of boolean checks to use specific validations only
|
data/flatter-extensions.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
25
25
|
spec.require_paths = ["lib"]
|
26
26
|
|
27
|
-
spec.add_dependency "flatter", "
|
27
|
+
spec.add_dependency "flatter", ">= 0.2.1"
|
28
28
|
|
29
29
|
spec.add_development_dependency "activerecord", ">= 4.0"
|
30
30
|
spec.add_development_dependency "sqlite3"
|
@@ -3,33 +3,46 @@ module Flatter
|
|
3
3
|
module ActiveRecord
|
4
4
|
extend ::Flatter::Extension
|
5
5
|
|
6
|
-
module
|
7
|
-
def
|
8
|
-
@
|
6
|
+
module CallbacksControl
|
7
|
+
def save_with_callbacks(callbacks)
|
8
|
+
@_saving_callbacks = callbacks
|
9
9
|
create_or_update
|
10
10
|
ensure
|
11
|
-
remove_instance_variable('@
|
11
|
+
remove_instance_variable('@_saving_callbacks')
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
16
|
def _run_save_callbacks
|
17
|
-
|
17
|
+
return super unless defined? @_saving_callbacks
|
18
|
+
@_saving_callbacks.include?(:save) ? super : yield
|
18
19
|
end
|
19
20
|
|
20
21
|
def _run_create_callbacks
|
21
|
-
|
22
|
+
return super unless defined? @_saving_callbacks
|
23
|
+
@_saving_callbacks.include?(:create) ? super : yield
|
22
24
|
end
|
23
25
|
|
24
26
|
def _run_update_callbacks
|
25
|
-
|
27
|
+
return super unless defined? @_saving_callbacks
|
28
|
+
@_saving_callbacks.include?(:update) ? super : yield
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
29
32
|
register_as :active_record
|
30
33
|
|
31
34
|
hooked do
|
32
|
-
::ActiveRecord::Base.send(:prepend,
|
35
|
+
::ActiveRecord::Base.send(:prepend, CallbacksControl)
|
36
|
+
Flatter::Mapper::Collection::Concern.module_eval do
|
37
|
+
alias build_collection_item_without_ar build_collection_item
|
38
|
+
|
39
|
+
def build_collection_item
|
40
|
+
return build_collection_item_without_ar unless mounter!.try(:ar?)
|
41
|
+
|
42
|
+
mounter!.target.association(name.to_sym).try(:build) ||
|
43
|
+
build_collection_item_without_ar
|
44
|
+
end
|
45
|
+
end
|
33
46
|
end
|
34
47
|
|
35
48
|
factory.extend do
|
@@ -64,6 +77,28 @@ module Flatter
|
|
64
77
|
end
|
65
78
|
|
66
79
|
mapper.add_options :foreign_key, :mounter_foreign_key do
|
80
|
+
extend ActiveSupport::Concern
|
81
|
+
attr_reader :ar_error
|
82
|
+
|
83
|
+
included do
|
84
|
+
class_attribute :enabled_ar_callbacks
|
85
|
+
self.enabled_ar_callbacks = []
|
86
|
+
end
|
87
|
+
|
88
|
+
class_methods do
|
89
|
+
def enable_ar_callbacks(*callbacks)
|
90
|
+
self.enabled_ar_callbacks += callbacks
|
91
|
+
enabled_ar_callbacks.uniq!
|
92
|
+
end
|
93
|
+
|
94
|
+
def disable_ar_callbacks(*callbacks)
|
95
|
+
self.enabled_ar_callbacks -= callbacks
|
96
|
+
end
|
97
|
+
|
98
|
+
alias enable_ar_callback enable_ar_callbacks
|
99
|
+
alias disable_ar_callback disable_ar_callbacks
|
100
|
+
end
|
101
|
+
|
67
102
|
def apply(*)
|
68
103
|
return super unless ar?
|
69
104
|
|
@@ -75,15 +110,18 @@ module Flatter
|
|
75
110
|
def save
|
76
111
|
!!::ActiveRecord::Base.transaction do
|
77
112
|
begin
|
113
|
+
@ar_error = nil
|
78
114
|
super
|
79
|
-
rescue ::ActiveRecord::StatementInvalid
|
115
|
+
rescue ::ActiveRecord::StatementInvalid => e
|
116
|
+
@ar_error = e
|
80
117
|
raise ::ActiveRecord::Rollback
|
81
118
|
end
|
82
119
|
end
|
83
120
|
end
|
84
121
|
|
85
122
|
def delete_target_item(item)
|
86
|
-
item.destroy!
|
123
|
+
item.destroy! if ar?(item)
|
124
|
+
super
|
87
125
|
end
|
88
126
|
|
89
127
|
def save_target
|
@@ -91,7 +129,7 @@ module Flatter
|
|
91
129
|
|
92
130
|
assign_foreign_keys_from_mountings
|
93
131
|
|
94
|
-
result = target.
|
132
|
+
result = target.save_with_callbacks(enabled_ar_callbacks)
|
95
133
|
|
96
134
|
assign_foreign_keys_for_mountings if result
|
97
135
|
|
@@ -122,8 +160,8 @@ module Flatter
|
|
122
160
|
end
|
123
161
|
private :associated_mountings
|
124
162
|
|
125
|
-
def ar?
|
126
|
-
|
163
|
+
def ar?(object = target)
|
164
|
+
object.class < ::ActiveRecord::Base
|
127
165
|
end
|
128
166
|
end
|
129
167
|
end
|
@@ -5,11 +5,22 @@ module Flatter
|
|
5
5
|
|
6
6
|
register_as :order
|
7
7
|
|
8
|
+
mapping.add_option :index do
|
9
|
+
def index
|
10
|
+
options[:index] || 0
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
8
14
|
mapper.add_option :index do
|
9
15
|
def index
|
10
16
|
options[:index] || 0
|
11
17
|
end
|
12
18
|
|
19
|
+
def local_mappings
|
20
|
+
@_local_mappings ||= super.sort_by(&:index)
|
21
|
+
end
|
22
|
+
protected :local_mappings
|
23
|
+
|
13
24
|
def mappers_chain(context)
|
14
25
|
super.sort_by do |mapper|
|
15
26
|
index = mapper.index
|
@@ -5,7 +5,25 @@ module Flatter
|
|
5
5
|
|
6
6
|
register_as :skipping
|
7
7
|
|
8
|
-
|
8
|
+
hooked do
|
9
|
+
::Flatter::Mapper::Collection.module_eval do
|
10
|
+
alias extract_data_without_reject extract_data
|
11
|
+
|
12
|
+
def extract_data(params)
|
13
|
+
extract_data_without_reject(params).tap do |data|
|
14
|
+
data.reject!{ |params| reject_if[params] } if reject_if?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
mapper.add_options :skip_if, :reject_if do
|
21
|
+
extend ActiveSupport::Concern
|
22
|
+
|
23
|
+
included do
|
24
|
+
set_callback :validate, :before, :ignore_skipped_mountings
|
25
|
+
end
|
26
|
+
|
9
27
|
def run_validations!
|
10
28
|
if skipped?
|
11
29
|
errors.clear
|
@@ -27,6 +45,13 @@ module Flatter
|
|
27
45
|
def skipped?
|
28
46
|
!!@skipped
|
29
47
|
end
|
48
|
+
|
49
|
+
def ignore_skipped_mountings
|
50
|
+
local_mountings.each do |mapper|
|
51
|
+
mapper.skip! if mapper.skip_if? && instance_exec(&mapper.skip_if)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
private :ignore_skipped_mountings
|
30
55
|
end
|
31
56
|
end
|
32
57
|
end
|
metadata
CHANGED
@@ -1,125 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flatter-extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Kuzko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: flatter
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.2.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.2.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activerecord
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '4.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '4.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sqlite3
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.10'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.10'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - ~>
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '10.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - ~>
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '10.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: pry
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: pry-nav
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
description: |-
|
@@ -135,9 +135,9 @@ executables:
|
|
135
135
|
extensions: []
|
136
136
|
extra_rdoc_files: []
|
137
137
|
files:
|
138
|
-
- .gitignore
|
139
|
-
- .rspec
|
140
|
-
- .travis.yml
|
138
|
+
- ".gitignore"
|
139
|
+
- ".rspec"
|
140
|
+
- ".travis.yml"
|
141
141
|
- Gemfile
|
142
142
|
- LICENSE.txt
|
143
143
|
- README.md
|
@@ -161,17 +161,17 @@ require_paths:
|
|
161
161
|
- lib
|
162
162
|
required_ruby_version: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- -
|
164
|
+
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: 2.0.0
|
167
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
168
|
requirements:
|
169
|
-
- -
|
169
|
+
- - ">="
|
170
170
|
- !ruby/object:Gem::Version
|
171
171
|
version: '0'
|
172
172
|
requirements: []
|
173
173
|
rubyforge_project:
|
174
|
-
rubygems_version: 2.1
|
174
|
+
rubygems_version: 2.5.1
|
175
175
|
signing_key:
|
176
176
|
specification_version: 4
|
177
177
|
summary: Set of extensions for Flatter gem.
|