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 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.