flatter-extensions 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d1610548722ed156df3b6ec87c309f3932bb4cf5
4
- data.tar.gz: 3babab0a77a55252c362bb0f1652cb77131264b4
3
+ metadata.gz: 4542fbf33538d98c2fadc27ef9b858fed8555dca
4
+ data.tar.gz: 08923753f3dab118027e8d9e4012e61bbf80780d
5
5
  SHA512:
6
- metadata.gz: b247e946523b399435929d1e8da0a198a249cc1ca8877ddfa60ee10c269c4ee73890f20e4b78f8a9af5eb7a0145c6b6b822187fef1fe285fe91b1293ced345c4
7
- data.tar.gz: bd68d670ccb3c43c2a6222e353028e5f9047b197128efd193145f5c304cd486af2c2c068620d3fc56ece75a6e875b8e15965c48851c3486a28f0603b0281d4d0
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 callbacks and validation
219
+ #### Saving is performed without validation and callbacks by default
206
220
 
207
- That's right. On save your models will not be validated and their `:save` callbacks
208
- will not be executed. All such form-related business logic should be handled by mappers,
209
- keeping models clean for taking care about inner application business logic only.
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
@@ -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", "~> 0.2"
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 SkipCallbacks
7
- def save_without_callbacks
8
- @_saving_without_callbacks = true
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('@_saving_without_callbacks')
11
+ remove_instance_variable('@_saving_callbacks')
12
12
  end
13
13
 
14
14
  private
15
15
 
16
16
  def _run_save_callbacks
17
- @_saving_without_callbacks ? yield : super
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
- @_saving_without_callbacks ? yield : super
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
- @_saving_without_callbacks ? yield : super
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, SkipCallbacks)
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! && super
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.save_without_callbacks
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
- target.class < ::ActiveRecord::Base
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
- mapper.extend do
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
@@ -1,5 +1,5 @@
1
1
  module Flatter
2
2
  module Extensions
3
- VERSION = "0.2.0"
3
+ VERSION = "0.2.1"
4
4
  end
5
5
  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.0
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: 2015-10-25 00:00:00.000000000 Z
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: '0.2'
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: '0.2'
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.11
174
+ rubygems_version: 2.5.1
175
175
  signing_key:
176
176
  specification_version: 4
177
177
  summary: Set of extensions for Flatter gem.