eluvia-base 3.37.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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +225 -0
  4. data/lib/eluvia/active_model/amount_attribute.rb +108 -0
  5. data/lib/eluvia/active_model/array_attribute.rb +134 -0
  6. data/lib/eluvia/active_model/attributes.rb +417 -0
  7. data/lib/eluvia/active_model/enum_array_attribute.rb +60 -0
  8. data/lib/eluvia/active_model/enum_attribute.rb +174 -0
  9. data/lib/eluvia/active_model/object_attribute.rb +143 -0
  10. data/lib/eluvia/active_model/range_attribute.rb +74 -0
  11. data/lib/eluvia/active_record/file_array_attribute.rb +116 -0
  12. data/lib/eluvia/active_record/file_attribute.rb +158 -0
  13. data/lib/eluvia/active_record/filtering.rb +680 -0
  14. data/lib/eluvia/active_record/filters_model.rb +58 -0
  15. data/lib/eluvia/active_record/ordering.rb +110 -0
  16. data/lib/eluvia/base/config.rb +38 -0
  17. data/lib/eluvia/base/version.rb +12 -0
  18. data/lib/eluvia/errors/bad_request.rb +17 -0
  19. data/lib/eluvia/errors/forbidden.rb +17 -0
  20. data/lib/eluvia/errors/not_found.rb +17 -0
  21. data/lib/eluvia/errors/service_unavailable.rb +17 -0
  22. data/lib/eluvia/errors/standard_error.rb +33 -0
  23. data/lib/eluvia/errors/unauthorized.rb +17 -0
  24. data/lib/eluvia/errors/unprocessable_entity.rb +26 -0
  25. data/lib/eluvia/fieldset/rest_field.rb +83 -0
  26. data/lib/eluvia/fieldset/rest_fieldset.rb +158 -0
  27. data/lib/eluvia/fieldset.rb +12 -0
  28. data/lib/eluvia/handlers/error_handler.rb +60 -0
  29. data/lib/eluvia/handlers/pagination_handler.rb +25 -0
  30. data/lib/eluvia/handlers/params_handler.rb +43 -0
  31. data/lib/eluvia/helpers/attachment_helper.rb +37 -0
  32. data/lib/eluvia/integrations/eluvia_integration.rb +281 -0
  33. data/lib/eluvia/models/file.rb +44 -0
  34. data/lib/eluvia/models/file_wrapper.rb +38 -0
  35. data/lib/eluvia/models/image_wrapper.rb +38 -0
  36. data/lib/eluvia/serializers/error_serializer.rb +21 -0
  37. data/lib/eluvia/serializers/fieldset_serializer.rb +63 -0
  38. data/lib/eluvia/services/health_service.rb +56 -0
  39. data/lib/eluvia/uploads.rb +13 -0
  40. data/lib/eluvia/utils/hash_and_array.rb +98 -0
  41. data/lib/eluvia/utils/jwt.rb +36 -0
  42. data/lib/eluvia/utils/string.rb +31 -0
  43. data/lib/eluvia/utils/uuid.rb +21 -0
  44. data/lib/eluvia-base.rb +79 -0
  45. metadata +186 -0
@@ -0,0 +1,98 @@
1
+ class Object
2
+
3
+ # Deep integerize keys
4
+ def deep_integerize_keys
5
+ if self.is_a?(::Hash)
6
+ self.each_with_object({}) { |(k, v), memo|
7
+ memo[k.to_i] = v.deep_integerize_keys
8
+ }
9
+ elsif self.is_a?(::Array)
10
+ self.each_with_object([]) { |v, memo|
11
+ memo << v.deep_integerize_keys
12
+ }
13
+ else
14
+ self
15
+ end
16
+ end
17
+
18
+ # Deep snake case keys
19
+ def deep_snake_keys
20
+ if self.is_a?(::Hash)
21
+ self.each_with_object({}) { |(k, v), memo|
22
+ memo[k.to_s.underscore] = v.deep_snake_keys
23
+ }
24
+ elsif self.is_a?(::Array)
25
+ self.each_with_object([]) { |v, memo|
26
+ memo << v.deep_snake_keys
27
+ }
28
+ else
29
+ self
30
+ end
31
+ end
32
+
33
+ # Deep camel case keys
34
+ def deep_camel_keys
35
+ if self.is_a?(::Hash)
36
+ self.each_with_object({}) { |(k, v), memo|
37
+ memo[k.to_s.camelize] = v.deep_camel_keys
38
+ }
39
+ elsif self.is_a?(::Array)
40
+ self.each_with_object([]) { |v, memo|
41
+ memo << v.deep_camel_keys
42
+ }
43
+ else
44
+ self
45
+ end
46
+ end
47
+
48
+ COMPACTABLE = [nil, [], {}].freeze
49
+
50
+ def deep_compact(compactable: COMPACTABLE)
51
+ if self.is_a?(::Array)
52
+ self.each_with_object([]) do |v, a|
53
+ v = v.deep_compact(compactable: compactable)
54
+ a << v unless compactable.include?(v)
55
+ end
56
+ elsif self.is_a?(::Hash)
57
+ self.each_with_object({}) do |(k, v), h|
58
+ v = v.deep_compact(compactable: compactable)
59
+ h[k] = v unless compactable.include?(v)
60
+ end
61
+ else
62
+ self
63
+ end
64
+ end
65
+
66
+ end
67
+
68
+ class Hash
69
+
70
+ # Convert all keys in hash into integers
71
+ def integerize_keys
72
+ self.each_with_object({}) { |(k, v), memo|
73
+ memo[k.to_i] = v
74
+ }
75
+ end
76
+
77
+ # Convert all keys in hash into snake case
78
+ def snake_keys
79
+ self.each_with_object({}) { |(k, v), memo|
80
+ memo[k.to_s.underscore] = v
81
+ }
82
+ end
83
+
84
+ # Convert all keys in hash into camel case
85
+ def camel_keys
86
+ self.each_with_object({}) { |(k, v), memo|
87
+ memo[k.to_s.camelize] = v
88
+ }
89
+ end
90
+
91
+ # Deep merging of hashes
92
+ # By Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
93
+ def deep_merge!(other_hash)
94
+ merger = proc { |_k, v1, v2| v1.is_a?(::Hash) && v2.is_a?(::Hash) ? v1.merge(v2, &merger) : v2 }
95
+ self.merge!(other_hash, &merger)
96
+ end
97
+
98
+ end
@@ -0,0 +1,36 @@
1
+ require 'jwt'
2
+ require 'json'
3
+
4
+ module Eluvia
5
+ module Jwt
6
+
7
+ def self.encode_private_jwt_token(exp = 1.hours.from_now)
8
+ payload = { token_type: 'private_token' }
9
+ encode_jwt_token(payload, exp)
10
+ end
11
+
12
+ def self.encode_public_jwt_token(user, exp = 1.hours.from_now)
13
+ payload = { token_type: 'access', user: JSON.parse(user.to_json) }
14
+ encode_jwt_token(payload, exp)
15
+ end
16
+
17
+ def self.encode_jwt_token(payload, exp = 1.hours.from_now)
18
+ payload[:exp] = exp.to_i
19
+ if Eluvia::Base::Config.secure_jwt
20
+ payload[:iat] = Time.now.to_i
21
+ payload[:jti] = SecureRandom.uuid
22
+ end
23
+ JWT.encode(payload, get_secret_key)
24
+ end
25
+
26
+ def self.decode_jwt_token(token)
27
+ decoded = JWT.decode(token, get_secret_key)[0]
28
+ HashWithIndifferentAccess.new(decoded)
29
+ end
30
+
31
+ def self.get_secret_key
32
+ Eluvia::Base::Config.private_api_key.to_s
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,31 @@
1
+ class String
2
+
3
+ def to_filename
4
+ result = self
5
+ result = I18n.transliterate(result)
6
+ result
7
+ .downcase
8
+ .gsub(/[^a-z0-9.\s,\-_]/, "")
9
+ .gsub(/[.\s,\-_]+/, "-")
10
+ .sub(/^-*/, "")
11
+ .sub(/-*$/, "")
12
+ end
13
+
14
+ # Remove characters from string on the left and right side
15
+ def trim(chars = "\s")
16
+ self
17
+ .sub(/^[#{Regexp.escape(chars)}]*/, "")
18
+ .sub(/[#{Regexp.escape(chars)}]*$/, "")
19
+ end
20
+
21
+ # Remove characters from string on the left side
22
+ def ltrim(chars = "\s")
23
+ self.sub(/^[#{Regexp.escape(chars)}]*/, "")
24
+ end
25
+
26
+ # Remove characters from string on the right side
27
+ def rtrim(chars = "\s")
28
+ self.sub(/[#{Regexp.escape(chars)}]*$/, "")
29
+ end
30
+
31
+ end
@@ -0,0 +1,21 @@
1
+ require 'consistent_hash'
2
+ require 'uuidtools'
3
+
4
+ module Eluvia
5
+ module Uuid
6
+
7
+ NAMESPACE = UUIDTools::UUID.parse(Eluvia::Base::Config.uuid_seed)
8
+
9
+ def self.str_to_uuid(str)
10
+ UUIDTools::UUID.sha1_create(NAMESPACE, str.to_s).to_s
11
+ end
12
+
13
+ def self.str_to_uuid_v2(str)
14
+ generator = Random.new(str.consistent_hash.abs)
15
+ ary = generator.bytes(16)
16
+ ary.setbyte(6, (ary.getbyte(6) & 0x0f) | 0x40)
17
+ ary.setbyte(8, (ary.getbyte(8) & 0x3f) | 0x80)
18
+ ary.unpack("H8H4H4H4H12").join('-')
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,79 @@
1
+ # Config
2
+ require 'eluvia/base/config'
3
+
4
+ # Version
5
+ require 'eluvia/base/version'
6
+
7
+ # Uploads
8
+ require 'eluvia/uploads'
9
+
10
+ # Active model
11
+ require 'eluvia/active_model/attributes'
12
+ require 'eluvia/active_model/amount_attribute'
13
+ require 'eluvia/active_model/array_attribute'
14
+ require 'eluvia/active_model/enum_attribute'
15
+ require 'eluvia/active_model/enum_array_attribute' # depends on enum_attribute and array_attribute
16
+ require 'eluvia/active_model/object_attribute'
17
+ require 'eluvia/active_model/range_attribute' # depends on object_attribute
18
+
19
+ # Active record
20
+ require 'eluvia/active_record/file_array_attribute'
21
+ require 'eluvia/active_record/file_attribute'
22
+ require 'eluvia/active_record/filtering'
23
+ require 'eluvia/active_record/filters_model'
24
+ require 'eluvia/active_record/ordering'
25
+
26
+ # Errors
27
+ require 'eluvia/errors/standard_error'
28
+ require 'eluvia/errors/bad_request'
29
+ require 'eluvia/errors/forbidden'
30
+ require 'eluvia/errors/not_found'
31
+ require 'eluvia/errors/service_unavailable'
32
+ require 'eluvia/errors/unauthorized'
33
+ require 'eluvia/errors/unprocessable_entity'
34
+
35
+ # Fieldset
36
+ require 'eluvia/fieldset'
37
+
38
+ # Helpers
39
+ require 'eluvia/helpers/attachment_helper'
40
+
41
+ # Handlers
42
+ require 'eluvia/handlers/error_handler'
43
+ require 'eluvia/handlers/pagination_handler'
44
+ require 'eluvia/handlers/params_handler'
45
+
46
+ # Integrations
47
+ require 'eluvia/integrations/eluvia_integration'
48
+
49
+ # Models
50
+ require 'eluvia/models/file'
51
+ require 'eluvia/models/file_wrapper'
52
+ require 'eluvia/models/image_wrapper'
53
+
54
+ # Services
55
+ require 'eluvia/services/health_service'
56
+
57
+ # Serializers
58
+ require 'eluvia/serializers/error_serializer'
59
+ require 'eluvia/serializers/fieldset_serializer'
60
+
61
+ # Utils
62
+ require 'eluvia/utils/hash_and_array'
63
+ require 'eluvia/utils/jwt'
64
+ require 'eluvia/utils/string'
65
+ require 'eluvia/utils/uuid'
66
+
67
+ module Eluvia
68
+ module Base
69
+
70
+ # ***************************************************************************
71
+ # Configuration
72
+ # ***************************************************************************
73
+
74
+ def self.setup
75
+ yield Eluvia::Base::Config
76
+ end
77
+
78
+ end
79
+ end
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: eluvia-base
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.37.1
5
+ platform: ruby
6
+ authors:
7
+ - Matěj Outlý
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-08-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '7.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '7.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: jwt
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.10'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.19'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.19'
69
+ - !ruby/object:Gem::Dependency
70
+ name: ostruct
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.6'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.6'
83
+ - !ruby/object:Gem::Dependency
84
+ name: consistent_hash
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: uuidtools
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ description: This library provides a set of Ruby on Rails customizations and other
112
+ helpers in order to meet common Eluvia standards for API communication and Eluvia
113
+ requirements for backend application behavior.
114
+ email:
115
+ - matej.outly@eluvia.com
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - LICENSE
121
+ - README.md
122
+ - lib/eluvia-base.rb
123
+ - lib/eluvia/active_model/amount_attribute.rb
124
+ - lib/eluvia/active_model/array_attribute.rb
125
+ - lib/eluvia/active_model/attributes.rb
126
+ - lib/eluvia/active_model/enum_array_attribute.rb
127
+ - lib/eluvia/active_model/enum_attribute.rb
128
+ - lib/eluvia/active_model/object_attribute.rb
129
+ - lib/eluvia/active_model/range_attribute.rb
130
+ - lib/eluvia/active_record/file_array_attribute.rb
131
+ - lib/eluvia/active_record/file_attribute.rb
132
+ - lib/eluvia/active_record/filtering.rb
133
+ - lib/eluvia/active_record/filters_model.rb
134
+ - lib/eluvia/active_record/ordering.rb
135
+ - lib/eluvia/base/config.rb
136
+ - lib/eluvia/base/version.rb
137
+ - lib/eluvia/errors/bad_request.rb
138
+ - lib/eluvia/errors/forbidden.rb
139
+ - lib/eluvia/errors/not_found.rb
140
+ - lib/eluvia/errors/service_unavailable.rb
141
+ - lib/eluvia/errors/standard_error.rb
142
+ - lib/eluvia/errors/unauthorized.rb
143
+ - lib/eluvia/errors/unprocessable_entity.rb
144
+ - lib/eluvia/fieldset.rb
145
+ - lib/eluvia/fieldset/rest_field.rb
146
+ - lib/eluvia/fieldset/rest_fieldset.rb
147
+ - lib/eluvia/handlers/error_handler.rb
148
+ - lib/eluvia/handlers/pagination_handler.rb
149
+ - lib/eluvia/handlers/params_handler.rb
150
+ - lib/eluvia/helpers/attachment_helper.rb
151
+ - lib/eluvia/integrations/eluvia_integration.rb
152
+ - lib/eluvia/models/file.rb
153
+ - lib/eluvia/models/file_wrapper.rb
154
+ - lib/eluvia/models/image_wrapper.rb
155
+ - lib/eluvia/serializers/error_serializer.rb
156
+ - lib/eluvia/serializers/fieldset_serializer.rb
157
+ - lib/eluvia/services/health_service.rb
158
+ - lib/eluvia/uploads.rb
159
+ - lib/eluvia/utils/hash_and_array.rb
160
+ - lib/eluvia/utils/jwt.rb
161
+ - lib/eluvia/utils/string.rb
162
+ - lib/eluvia/utils/uuid.rb
163
+ homepage: https://gitlab.eluvia.dev/libraries/ruby/eluvia-base
164
+ licenses:
165
+ - MIT
166
+ metadata: {}
167
+ post_install_message:
168
+ rdoc_options: []
169
+ require_paths:
170
+ - lib
171
+ required_ruby_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ required_rubygems_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ requirements: []
182
+ rubygems_version: 3.2.33
183
+ signing_key:
184
+ specification_version: 4
185
+ summary: Base library for Eluvia applications
186
+ test_files: []