right 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +19 -0
  3. data/.gitignore +11 -0
  4. data/.hound.yml +2 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +13 -0
  7. data/.travis.yml +13 -0
  8. data/Appraisals +27 -0
  9. data/CHANGELOG.md +25 -0
  10. data/Gemfile +7 -0
  11. data/LICENSE +202 -0
  12. data/README.md +323 -0
  13. data/Rakefile +7 -0
  14. data/bin/console +15 -0
  15. data/bin/setup +7 -0
  16. data/config/locales/en.yml +7 -0
  17. data/gemfiles/rails_4.2.7_ransack_1.6.6.gemfile +10 -0
  18. data/gemfiles/rails_4.2.7_ransack_1.8.2.gemfile +10 -0
  19. data/gemfiles/rails_5.0.0_ransack_1.6.6.gemfile +10 -0
  20. data/gemfiles/rails_5.0.0_ransack_1.8.2.gemfile +10 -0
  21. data/lib/right.rb +49 -0
  22. data/lib/right/fetcher.rb +248 -0
  23. data/lib/right/fetcher_error.rb +5 -0
  24. data/lib/right/filter_middleware.rb +25 -0
  25. data/lib/right/filter_parameter.rb +66 -0
  26. data/lib/right/filter_parameter_definition.rb +79 -0
  27. data/lib/right/filter_parameters.rb +93 -0
  28. data/lib/right/filter_parameters_extractor.rb +75 -0
  29. data/lib/right/filter_parameters_validator.rb +27 -0
  30. data/lib/right/filter_predicates.rb +97 -0
  31. data/lib/right/filter_undefined_parameter.rb +14 -0
  32. data/lib/right/filter_value_validator.rb +35 -0
  33. data/lib/right/pagination_middleware.rb +54 -0
  34. data/lib/right/pagination_parameters_validator.rb +46 -0
  35. data/lib/right/paginator.rb +38 -0
  36. data/lib/right/railtie.rb +8 -0
  37. data/lib/right/ransackable_filter.rb +25 -0
  38. data/lib/right/ransackable_filter_parameters_adapter.rb +62 -0
  39. data/lib/right/ransackable_sort.rb +28 -0
  40. data/lib/right/ransackable_sort_parameters_adapter.rb +24 -0
  41. data/lib/right/result.rb +72 -0
  42. data/lib/right/sort_middleware.rb +27 -0
  43. data/lib/right/sort_parameter.rb +53 -0
  44. data/lib/right/sort_parameter_definition.rb +53 -0
  45. data/lib/right/sort_parameters_extractor.rb +60 -0
  46. data/lib/right/sort_parameters_validator.rb +27 -0
  47. data/lib/right/sort_undefined_parameter.rb +14 -0
  48. data/lib/right/sort_value_validator.rb +35 -0
  49. data/lib/right/version.rb +4 -0
  50. data/right.gemspec +36 -0
  51. metadata +281 -0
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+ module Right
3
+ # User provided sorting syntax:
4
+ # * `name` - sort by name
5
+ # * `-name` - sort by name in reversed order
6
+ # * `-name,created_at` - sort by name in reversed order, and then sort by created_at
7
+ #
8
+ # This middleware parses sorting string and builds Parameter array
9
+ # @see Right::Sort::Parameter
10
+ #
11
+ # If user passes not defined sort order, it yields to `UndefinedParameter`, so you may
12
+ # validate it.
13
+ #
14
+ class SortParametersExtractor
15
+ # @param app [#call]
16
+ # @param parameters_definition [Set<Right::SortParameterDefinition>]
17
+ def initialize(app, parameters_definition)
18
+ @app = app
19
+ @parameters_definition = parameters_definition
20
+ end
21
+
22
+ # @param env [<String, []>]
23
+ # * first element is a scope to be sorted
24
+ # * second is a String with user provided sortings
25
+ # @return [<<Right::RansackableSort::SortParameter, []>]
26
+ #
27
+ def call(env)
28
+ params, errors = env
29
+
30
+ sort_params = sort_order(params[:sort]).map do |(attribute, direction)|
31
+ extract_parameter(attribute, direction)
32
+ end
33
+
34
+ app.call([params.merge(sort: sort_params), errors])
35
+ end
36
+
37
+ private
38
+
39
+ attr_reader :parameters_definition, :app
40
+
41
+ def extract_parameter(name, direction)
42
+ definition = parameters_definition.detect { |d| d.as == name } || SortUndefinedParameter.new(name)
43
+ SortParameter.new(direction, definition)
44
+ end
45
+
46
+ def sort_order(params)
47
+ String(params).split(',').map do |attribute|
48
+ sorting_for(attribute)
49
+ end
50
+ end
51
+
52
+ def sorting_for(field)
53
+ if field.start_with?('-')
54
+ [field.delete('-'), 'desc']
55
+ else
56
+ [field, 'asc']
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module Right
3
+ # Validates sortings and raises error if one of them is invalid
4
+ #
5
+ class SortParametersValidator
6
+ # @param app [#call]
7
+ def initialize(app)
8
+ @app = app
9
+ end
10
+
11
+ # @param env [<{:sort => Right::FilterParameter}, Array>]
12
+ # @return [<{:sort => Right::FilterParameter}, Array>]
13
+ #
14
+ def call(env)
15
+ params, errors = env
16
+
17
+ not_allowed_parameters = Array(params[:sort]).select(&:invalid?)
18
+ messages = not_allowed_parameters.flat_map(&:errors)
19
+
20
+ app.call([params, errors.concat(messages)])
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :app
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ module Right
3
+ # Null object for ParameterDefinition
4
+ #
5
+ class SortUndefinedParameter < SortParameterDefinition
6
+ def required?
7
+ false
8
+ end
9
+
10
+ def defined?
11
+ false
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+ module Right
3
+ # Build singleton validation class for specified attribute name
4
+ # @example you need a nice validator for a first_name
5
+ # validator_klass = ValueValidator.build('first_name', presence: true, length: { minimum: 3 })
6
+ # validator = validator_klass.new('Bo')
7
+ # validator.valid? #=> false
8
+ # validator.errors.full_messages #=> ['First name is too short (minimum is 3 characters)']
9
+ #
10
+ module SortValueValidator
11
+ module_function
12
+
13
+ # Validates if Parameter is undefined or not
14
+ class DefinedValidator < ActiveModel::EachValidator
15
+ def validate_each(record, attribute, _value)
16
+ record.errors.add(attribute, :undefined_sort_order) if record.undefined?
17
+ end
18
+ end
19
+
20
+ def build(definition)
21
+ Class.new do
22
+ include ActiveModel::Validations
23
+
24
+ validates(definition.name, 'right/sort_value_validator/defined': true)
25
+
26
+ define_method(:undefined?) { definition.undefined? }
27
+ define_method(definition.name) {}
28
+
29
+ def self.model_name
30
+ ActiveModel::Name.new(Right, nil, 'Right')
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ module Right
3
+ VERSION = '0.7.2'
4
+ end
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'right/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'right'
9
+ spec.version = Right::VERSION
10
+ spec.authors = ['Tema Bolshakov']
11
+ spec.email = ['abolshakov@spbtv.com']
12
+
13
+ spec.summary = 'Mighty resource fetchers'
14
+ spec.description = 'Mighty resource fetchers build on top of Ransack gem'
15
+ spec.homepage = 'https://github.com/SPBTV/right'
16
+ spec.license = 'Apache 2.0'
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ spec.bindir = 'exe'
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_runtime_dependency 'activesupport', '>= 3.2'
24
+ spec.add_runtime_dependency 'activemodel', '>= 3.2'
25
+ spec.add_runtime_dependency 'uber', '~> 0.0.15'
26
+ spec.add_runtime_dependency 'ibsciss-middleware', '~> 0.3'
27
+ spec.add_runtime_dependency 'ransack', '>= 1.6.6'
28
+ spec.add_development_dependency 'activerecord', '>= 3.2', '< 6.0.0'
29
+ spec.add_development_dependency 'sqlite3', '~> 1.3.11'
30
+ spec.add_development_dependency 'bundler', '>= 1.13.7'
31
+ spec.add_development_dependency 'rake', '>= 11.2.2'
32
+ spec.add_development_dependency 'rspec', '~> 3.5.0'
33
+ spec.add_development_dependency 'spbtv_code_style', '1.4.1'
34
+ spec.add_development_dependency 'appraisal', '2.1.0'
35
+ spec.add_development_dependency 'rubocop', '0.40.0'
36
+ end
metadata ADDED
@@ -0,0 +1,281 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: right
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.2
5
+ platform: ruby
6
+ authors:
7
+ - Tema Bolshakov
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-09-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activemodel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '3.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '3.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: uber
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.0.15
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.15
55
+ - !ruby/object:Gem::Dependency
56
+ name: ibsciss-middleware
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.3'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: ransack
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 1.6.6
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 1.6.6
83
+ - !ruby/object:Gem::Dependency
84
+ name: activerecord
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '3.2'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: 6.0.0
93
+ type: :development
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '3.2'
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: 6.0.0
103
+ - !ruby/object:Gem::Dependency
104
+ name: sqlite3
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 1.3.11
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 1.3.11
117
+ - !ruby/object:Gem::Dependency
118
+ name: bundler
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 1.13.7
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 1.13.7
131
+ - !ruby/object:Gem::Dependency
132
+ name: rake
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 11.2.2
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 11.2.2
145
+ - !ruby/object:Gem::Dependency
146
+ name: rspec
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: 3.5.0
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: 3.5.0
159
+ - !ruby/object:Gem::Dependency
160
+ name: spbtv_code_style
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - '='
164
+ - !ruby/object:Gem::Version
165
+ version: 1.4.1
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - '='
171
+ - !ruby/object:Gem::Version
172
+ version: 1.4.1
173
+ - !ruby/object:Gem::Dependency
174
+ name: appraisal
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - '='
178
+ - !ruby/object:Gem::Version
179
+ version: 2.1.0
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - '='
185
+ - !ruby/object:Gem::Version
186
+ version: 2.1.0
187
+ - !ruby/object:Gem::Dependency
188
+ name: rubocop
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - '='
192
+ - !ruby/object:Gem::Version
193
+ version: 0.40.0
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - '='
199
+ - !ruby/object:Gem::Version
200
+ version: 0.40.0
201
+ description: Mighty resource fetchers build on top of Ransack gem
202
+ email:
203
+ - abolshakov@spbtv.com
204
+ executables: []
205
+ extensions: []
206
+ extra_rdoc_files: []
207
+ files:
208
+ - ".codeclimate.yml"
209
+ - ".gitignore"
210
+ - ".hound.yml"
211
+ - ".rspec"
212
+ - ".rubocop.yml"
213
+ - ".travis.yml"
214
+ - Appraisals
215
+ - CHANGELOG.md
216
+ - Gemfile
217
+ - LICENSE
218
+ - README.md
219
+ - Rakefile
220
+ - bin/console
221
+ - bin/setup
222
+ - config/locales/en.yml
223
+ - gemfiles/rails_4.2.7_ransack_1.6.6.gemfile
224
+ - gemfiles/rails_4.2.7_ransack_1.8.2.gemfile
225
+ - gemfiles/rails_5.0.0_ransack_1.6.6.gemfile
226
+ - gemfiles/rails_5.0.0_ransack_1.8.2.gemfile
227
+ - lib/right.rb
228
+ - lib/right/fetcher.rb
229
+ - lib/right/fetcher_error.rb
230
+ - lib/right/filter_middleware.rb
231
+ - lib/right/filter_parameter.rb
232
+ - lib/right/filter_parameter_definition.rb
233
+ - lib/right/filter_parameters.rb
234
+ - lib/right/filter_parameters_extractor.rb
235
+ - lib/right/filter_parameters_validator.rb
236
+ - lib/right/filter_predicates.rb
237
+ - lib/right/filter_undefined_parameter.rb
238
+ - lib/right/filter_value_validator.rb
239
+ - lib/right/pagination_middleware.rb
240
+ - lib/right/pagination_parameters_validator.rb
241
+ - lib/right/paginator.rb
242
+ - lib/right/railtie.rb
243
+ - lib/right/ransackable_filter.rb
244
+ - lib/right/ransackable_filter_parameters_adapter.rb
245
+ - lib/right/ransackable_sort.rb
246
+ - lib/right/ransackable_sort_parameters_adapter.rb
247
+ - lib/right/result.rb
248
+ - lib/right/sort_middleware.rb
249
+ - lib/right/sort_parameter.rb
250
+ - lib/right/sort_parameter_definition.rb
251
+ - lib/right/sort_parameters_extractor.rb
252
+ - lib/right/sort_parameters_validator.rb
253
+ - lib/right/sort_undefined_parameter.rb
254
+ - lib/right/sort_value_validator.rb
255
+ - lib/right/version.rb
256
+ - right.gemspec
257
+ homepage: https://github.com/SPBTV/right
258
+ licenses:
259
+ - Apache 2.0
260
+ metadata: {}
261
+ post_install_message:
262
+ rdoc_options: []
263
+ require_paths:
264
+ - lib
265
+ required_ruby_version: !ruby/object:Gem::Requirement
266
+ requirements:
267
+ - - ">="
268
+ - !ruby/object:Gem::Version
269
+ version: '0'
270
+ required_rubygems_version: !ruby/object:Gem::Requirement
271
+ requirements:
272
+ - - ">="
273
+ - !ruby/object:Gem::Version
274
+ version: '0'
275
+ requirements: []
276
+ rubyforge_project:
277
+ rubygems_version: 2.6.13
278
+ signing_key:
279
+ specification_version: 4
280
+ summary: Mighty resource fetchers
281
+ test_files: []