media_types 1.0.0 → 2.1.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 (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