right 0.7.2

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.
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: []