media_types 1.0.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/debian.yml +43 -0
  3. data/.github/workflows/ruby.yml +3 -0
  4. data/.gitignore +10 -10
  5. data/CHANGELOG.md +80 -54
  6. data/Gemfile +6 -6
  7. data/Gemfile.lock +43 -114
  8. data/LICENSE +21 -0
  9. data/README.md +278 -85
  10. data/Rakefile +12 -12
  11. data/lib/media_types.rb +46 -3
  12. data/lib/media_types/constructable.rb +15 -9
  13. data/lib/media_types/dsl.rb +66 -31
  14. data/lib/media_types/dsl/errors.rb +18 -0
  15. data/lib/media_types/errors.rb +19 -0
  16. data/lib/media_types/scheme.rb +127 -13
  17. data/lib/media_types/scheme/errors.rb +66 -0
  18. data/lib/media_types/scheme/links.rb +15 -0
  19. data/lib/media_types/scheme/missing_validation.rb +12 -4
  20. data/lib/media_types/scheme/output_empty_guard.rb +5 -4
  21. data/lib/media_types/scheme/output_iterator_with_predicate.rb +13 -2
  22. data/lib/media_types/scheme/output_type_guard.rb +1 -1
  23. data/lib/media_types/scheme/rules.rb +53 -1
  24. data/lib/media_types/scheme/rules_exhausted_guard.rb +15 -4
  25. data/lib/media_types/scheme/validation_options.rb +17 -5
  26. data/lib/media_types/testing/assertions.rb +20 -0
  27. data/lib/media_types/validations.rb +29 -7
  28. data/lib/media_types/version.rb +1 -1
  29. data/media_types.gemspec +4 -7
  30. metadata +19 -63
  31. data/.travis.yml +0 -19
  32. data/lib/media_types/.dsl.rb.swp +0 -0
  33. data/lib/media_types/defaults.rb +0 -31
  34. data/lib/media_types/integrations.rb +0 -32
  35. data/lib/media_types/integrations/actionpack.rb +0 -21
  36. data/lib/media_types/integrations/http.rb +0 -47
  37. data/lib/media_types/minitest/assert_media_type_format.rb +0 -10
  38. data/lib/media_types/minitest/assert_media_types_registered.rb +0 -166
  39. data/lib/media_types/registrar.rb +0 -148
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MediaTypes
4
- VERSION = '1.0.0'
4
+ VERSION = '2.1.1'
5
5
  end
data/media_types.gemspec CHANGED
@@ -7,8 +7,8 @@ require 'media_types/version'
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'media_types'
9
9
  spec.version = MediaTypes::VERSION
10
- spec.authors = ['Derk-Jan Karrenbeld']
11
- spec.email = ['derk-jan+github@karrenbeld.info']
10
+ spec.authors = ['Derk-Jan Karrenbeld', 'Max Maton']
11
+ spec.email = ['derk-jan+github@karrenbeld.info', 'info@maxmaton.nl']
12
12
 
13
13
  spec.summary = 'Library to create media type definitions, schemes and validations'
14
14
  spec.description = 'Media Types as mime types are not easily supported by frameworks such as rails. '
@@ -23,14 +23,11 @@ Gem::Specification.new do |spec|
23
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  spec.require_paths = ['lib']
25
25
 
26
- spec.add_development_dependency 'actionpack'
27
26
  spec.add_development_dependency 'awesome_print'
28
- spec.add_development_dependency 'bundler', '~> 2'
29
- spec.add_development_dependency 'http'
27
+ spec.add_development_dependency 'bundler', '>= 2'
30
28
  spec.add_development_dependency 'minitest', '~> 5.0'
31
- spec.add_development_dependency 'minitest-ci'
32
29
  spec.add_development_dependency 'minitest-reporters'
33
30
  spec.add_development_dependency 'oj'
34
- spec.add_development_dependency 'rake', '~> 13.0'
31
+ spec.add_development_dependency 'rake', '>= 12.0'
35
32
  spec.add_development_dependency 'simplecov'
36
33
  end
metadata CHANGED
@@ -1,29 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: media_types
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derk-Jan Karrenbeld
8
- autorequire:
8
+ - Max Maton
9
+ autorequire:
9
10
  bindir: exe
10
11
  cert_chain: []
11
- date: 2020-01-21 00:00:00.000000000 Z
12
+ date: 2021-08-19 00:00:00.000000000 Z
12
13
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: actionpack
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
14
  - !ruby/object:Gem::Dependency
28
15
  name: awesome_print
29
16
  requirement: !ruby/object:Gem::Requirement
@@ -40,32 +27,18 @@ dependencies:
40
27
  version: '0'
41
28
  - !ruby/object:Gem::Dependency
42
29
  name: bundler
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '2'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '2'
55
- - !ruby/object:Gem::Dependency
56
- name: http
57
30
  requirement: !ruby/object:Gem::Requirement
58
31
  requirements:
59
32
  - - ">="
60
33
  - !ruby/object:Gem::Version
61
- version: '0'
34
+ version: '2'
62
35
  type: :development
63
36
  prerelease: false
64
37
  version_requirements: !ruby/object:Gem::Requirement
65
38
  requirements:
66
39
  - - ">="
67
40
  - !ruby/object:Gem::Version
68
- version: '0'
41
+ version: '2'
69
42
  - !ruby/object:Gem::Dependency
70
43
  name: minitest
71
44
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +53,6 @@ dependencies:
80
53
  - - "~>"
81
54
  - !ruby/object:Gem::Version
82
55
  version: '5.0'
83
- - !ruby/object:Gem::Dependency
84
- name: minitest-ci
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
56
  - !ruby/object:Gem::Dependency
98
57
  name: minitest-reporters
99
58
  requirement: !ruby/object:Gem::Requirement
@@ -126,16 +85,16 @@ dependencies:
126
85
  name: rake
127
86
  requirement: !ruby/object:Gem::Requirement
128
87
  requirements:
129
- - - "~>"
88
+ - - ">="
130
89
  - !ruby/object:Gem::Version
131
- version: '13.0'
90
+ version: '12.0'
132
91
  type: :development
133
92
  prerelease: false
134
93
  version_requirements: !ruby/object:Gem::Requirement
135
94
  requirements:
136
- - - "~>"
95
+ - - ">="
137
96
  - !ruby/object:Gem::Version
138
- version: '13.0'
97
+ version: '12.0'
139
98
  - !ruby/object:Gem::Dependency
140
99
  name: simplecov
141
100
  requirement: !ruby/object:Gem::Requirement
@@ -154,35 +113,31 @@ description: 'Media Types as mime types are not easily supported by frameworks s
154
113
  as rails. '
155
114
  email:
156
115
  - derk-jan+github@karrenbeld.info
116
+ - info@maxmaton.nl
157
117
  executables: []
158
118
  extensions: []
159
119
  extra_rdoc_files: []
160
120
  files:
121
+ - ".github/workflows/debian.yml"
161
122
  - ".github/workflows/ruby.yml"
162
123
  - ".gitignore"
163
124
  - ".rubocop.yml"
164
- - ".travis.yml"
165
125
  - CHANGELOG.md
166
126
  - Gemfile
167
127
  - Gemfile.lock
128
+ - LICENSE
168
129
  - README.md
169
130
  - Rakefile
170
131
  - bin/console
171
132
  - bin/setup
172
133
  - lib/media_types.rb
173
- - lib/media_types/.dsl.rb.swp
174
134
  - lib/media_types/constructable.rb
175
- - lib/media_types/defaults.rb
176
135
  - lib/media_types/dsl.rb
136
+ - lib/media_types/dsl/errors.rb
137
+ - lib/media_types/errors.rb
177
138
  - lib/media_types/formatter.rb
178
139
  - lib/media_types/hash.rb
179
- - lib/media_types/integrations.rb
180
- - lib/media_types/integrations/actionpack.rb
181
- - lib/media_types/integrations/http.rb
182
- - lib/media_types/minitest/assert_media_type_format.rb
183
- - lib/media_types/minitest/assert_media_types_registered.rb
184
140
  - lib/media_types/object.rb
185
- - lib/media_types/registrar.rb
186
141
  - lib/media_types/scheme.rb
187
142
  - lib/media_types/scheme/allow_nil.rb
188
143
  - lib/media_types/scheme/any_of.rb
@@ -199,6 +154,7 @@ files:
199
154
  - lib/media_types/scheme/rules.rb
200
155
  - lib/media_types/scheme/rules_exhausted_guard.rb
201
156
  - lib/media_types/scheme/validation_options.rb
157
+ - lib/media_types/testing/assertions.rb
202
158
  - lib/media_types/validations.rb
203
159
  - lib/media_types/version.rb
204
160
  - lib/media_types/views.rb
@@ -206,7 +162,7 @@ files:
206
162
  homepage: https://github.com/SleeplessByte/media-types-ruby
207
163
  licenses: []
208
164
  metadata: {}
209
- post_install_message:
165
+ post_install_message:
210
166
  rdoc_options: []
211
167
  require_paths:
212
168
  - lib
@@ -221,8 +177,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
177
  - !ruby/object:Gem::Version
222
178
  version: '0'
223
179
  requirements: []
224
- rubygems_version: 3.0.3
225
- signing_key:
180
+ rubygems_version: 3.1.6
181
+ signing_key:
226
182
  specification_version: 4
227
183
  summary: Library to create media type definitions, schemes and validations
228
184
  test_files: []
data/.travis.yml DELETED
@@ -1,19 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.4
6
- - 2.5
7
- - 2.6
8
- - rbx-3
9
- - ruby-head
10
- matrix:
11
- allow_failures:
12
- - rvm: ruby-head
13
- - rvm: rbx-3
14
- - rvm: 2.6
15
- before_install:
16
- - gem update --system
17
- - gem --version
18
- install:
19
- - bundle install --with development --jobs=3 --retry=3 --path=${BUNDLE_PATH:-vendor/bundle}
Binary file
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MediaTypes
4
- class Defaults
5
- def initialize(media_type, &block)
6
- self.media_type = media_type
7
-
8
- instance_exec(&block) if block_given?
9
- end
10
-
11
- def method_missing(method_name, *arguments, &block)
12
- if media_type.respond_to?(method_name)
13
- return self.media_type = media_type.send(method_name, *arguments, &block)
14
- end
15
-
16
- super
17
- end
18
-
19
- def respond_to_missing?(method_name, include_private = false)
20
- media_type.respond_to?(method_name) || super
21
- end
22
-
23
- def to_constructable
24
- media_type
25
- end
26
-
27
- private
28
-
29
- attr_accessor :media_type
30
- end
31
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MediaTypes
4
- INTEGRATION_METHODS = %i[register].freeze
5
-
6
- module_function
7
-
8
- def integrate(integration)
9
- INTEGRATION_METHODS.each do |method|
10
- next unless integration.respond_to?(method)
11
- self.integrations = (integrations || {}).tap do |x|
12
- x.merge!(method => (x[method] || []).concat([integration]))
13
- end
14
- end
15
- end
16
-
17
- # @!method register(registerable)
18
- INTEGRATION_METHODS.each do |method|
19
- define_singleton_method method do |*args, &block|
20
- (integrations || {}).fetch(method) { [] }.each do |integration|
21
- integration.send(method, *args, &block)
22
- end
23
- end
24
-
25
- end
26
-
27
- class << self
28
- private
29
-
30
- attr_accessor :integrations
31
- end
32
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'action_dispatch/http/mime_type'
4
-
5
- module MediaTypes
6
- module ActionPackIntegration
7
-
8
- module_function
9
-
10
- def register(registerable)
11
- mime_type = registerable.to_s
12
- symbol = registerable.to_sym
13
- synonyms = registerable.aliases
14
-
15
- Mime::Type.register(mime_type, symbol, synonyms)
16
- end
17
- end
18
-
19
- integrate ActionPackIntegration
20
- end
21
-
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'http/mime_type'
4
- require 'oj'
5
-
6
- module MediaTypes
7
- module HttpIntegration
8
-
9
- module_function
10
-
11
- def register(registerable)
12
- mime_type = registerable.to_s
13
-
14
- HTTP::MimeType.register_adapter mime_type, AdapterFor(registerable.media_type)
15
- HTTP::MimeType.register_alias mime_type, registerable.to_sym
16
-
17
- registerable.aliases.each do |alias_mime_type|
18
- HTTP::MimeType.register_alias mime_type, alias_mime_type
19
- end
20
- end
21
-
22
- class << self
23
- private
24
-
25
- # noinspection RubyInstanceMethodNamingConvention
26
- def AdapterFor(media_type) # rubocop:disable Naming/MethodName
27
- adapter_name = media_type.split(%r{[./_+-]}).map(&:capitalize).join('').tr('^A-z0-9', '_')
28
-
29
- adapter = MediaTypes::HttpIntegration.const_set(adapter_name, Module.new)
30
- adapter.define_singleton_method('encode') do |obj|
31
- media_type.validate!(obj)
32
- Oj.dump(obj, mode: :compat)
33
- end
34
-
35
- adapter.define_singleton_method('decode') do |str|
36
- Oj.load(str, mode: :strict).tap do |result|
37
- media_type.validate!(result)
38
- end
39
- end
40
-
41
- adapter
42
- end
43
- end
44
- end
45
-
46
- integrate HttpIntegration
47
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MediaTypes
4
- module Assertions
5
- def assert_media_type_format(media_type, output, **opts)
6
- return pass unless media_type.validatable?
7
- assert media_type.validate!(output, **opts)
8
- end
9
- end
10
- end
@@ -1,166 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'minitest/mock'
4
-
5
- module MediaTypes
6
- module Assertions
7
- class << self
8
- def block_exec_instance(instance, &block)
9
- case block.arity
10
- when 1, -1
11
- instance.instance_exec(instance, &block)
12
- else
13
- instance.instance_exec(&block)
14
- end
15
- end
16
- end
17
-
18
- def assert_media_types_registered(media_type, &block)
19
- collector = Collector.new(media_type)
20
- Assertions.block_exec_instance(collector, &block)
21
- assert_registered_types(media_type, collector.prepare_verify)
22
- end
23
-
24
- class Collector
25
- def initialize(media_type)
26
- self.media_type = media_type
27
- self.registers = {}
28
- end
29
-
30
- def mime_type(mime_type, symbol:, synonyms: [])
31
- registers[mime_type] = { symbol: symbol, synonyms: synonyms }
32
- end
33
-
34
- def formatted_mime_type(mime_type_format, &block)
35
- collector = FormattedCollector.new(mime_type_format, {})
36
- Assertions.block_exec_instance(collector, &block)
37
- registers.merge!(collector.to_h)
38
- end
39
-
40
- def prepare_verify
41
- expected_types_hash = registers.dup
42
- expected_types_hash.each do |key, value|
43
- expected_types_hash[key] = [value[:symbol], Array(value[:synonyms])]
44
- end
45
-
46
- expected_types_hash
47
- end
48
-
49
- private
50
-
51
- attr_accessor :media_type, :registers
52
- end
53
-
54
- class FormattedCollector
55
- def initialize(format, args = {})
56
- self.mime_type_format = format
57
- self.format_args = args
58
- self.registers = {}
59
- end
60
-
61
- def version(version, **opts, &block)
62
- new_format_args = format_args.merge(version: version)
63
- register(new_format_args, **opts, &block)
64
- end
65
-
66
- def view(view, **opts, &block)
67
- new_format_args = format_args.merge(view: view)
68
- register(new_format_args, **opts, &block)
69
- end
70
-
71
- def create(**opts, &block)
72
- view(CREATE_VIEW, **opts, &block)
73
- end
74
-
75
- def collection(**opts, &block)
76
- view(COLLECTION_VIEW, **opts, &block)
77
- end
78
-
79
- def index(**opts, &block)
80
- view(INDEX_VIEW, **opts, &block)
81
- end
82
-
83
- def to_h
84
- Hash(registers)
85
- end
86
-
87
- private
88
-
89
- attr_accessor :mime_type_format, :registers, :format_args
90
-
91
- def register(new_format_args, symbol: nil, synonyms: [], &block)
92
- if block_given?
93
- collector = FormattedCollector.new(mime_type_format, new_format_args)
94
- Assertions.block_exec_instance(collector, &block)
95
- registers.merge!(collector.to_h)
96
- else
97
- formatted_mime_type_format = format(mime_type_format, **new_format_args)
98
- registers[formatted_mime_type_format] = { symbol: symbol, synonyms: synonyms }
99
- end
100
- end
101
- end
102
-
103
- # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
104
- def assert_registered_types(media_type, expected_types_hash)
105
- mock = Minitest::Mock.new
106
- uncalled = expected_types_hash.dup
107
-
108
- failed = []
109
-
110
- uncalled.length.times do
111
- mock.expect(:call, nil) do |registerable|
112
- type = registerable.to_s
113
- symbol = registerable.to_sym
114
- synonyms = registerable.synonyms
115
-
116
- options = uncalled.delete(type)
117
- return true if options && options == [symbol, synonyms] && pass
118
-
119
- failed <<
120
- MockExpectationError.new(
121
- format(
122
- 'Call failed to match expectations:' + "\n"\
123
- '+++ actual [type: %<type>s, symbol: %<symbol>s, synonyms: %<synonyms>s]' + "\n"\
124
- '--- expected [type: %<type>s, symbol: %<resolved_symbol>s, synonyms: %<resolved_synonyms>s]',
125
- type: type,
126
- symbol: symbol,
127
- synonyms: synonyms,
128
- resolved_symbol: options&.first,
129
- resolved_synonyms: options&.last
130
- )
131
- )
132
- end
133
-
134
- false
135
- end
136
-
137
- MediaTypes.stub(:register, mock) do
138
- if block_given?
139
- yield media_type
140
- else
141
- media_type.register.flatten
142
- end
143
- end
144
-
145
- messages = failed.map(&:message)
146
- uncalled.each do |type, options|
147
- messages << format(
148
- 'Call did not occur:' + "\n"\
149
- '--- expected: [type: %<type>s, symbol: %<resolved_symbol>s, synonyms: %<resolved_synonyms>s]',
150
- type: type,
151
- resolved_symbol: options&.first,
152
- resolved_synonyms: options&.last
153
- )
154
- end
155
-
156
- if messages.length.positive?
157
- flunk messages.join(",\n")
158
- else
159
- pass
160
- end
161
-
162
- assert mock
163
- end
164
- # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
165
- end
166
- end