media_types 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/debian.yml +43 -43
  3. data/.github/workflows/publish-bookworm.yml +33 -0
  4. data/.github/workflows/publish-sid.yml +33 -0
  5. data/.github/workflows/ruby.yml +22 -22
  6. data/.gitignore +20 -10
  7. data/.rubocop.yml +29 -29
  8. data/CHANGELOG.md +175 -164
  9. data/Gemfile +6 -6
  10. data/LICENSE +21 -21
  11. data/README.md +666 -664
  12. data/Rakefile +12 -12
  13. data/bin/console +15 -15
  14. data/bin/setup +8 -8
  15. data/lib/media_types/constructable.rb +161 -160
  16. data/lib/media_types/dsl/errors.rb +18 -18
  17. data/lib/media_types/dsl.rb +172 -172
  18. data/lib/media_types/errors.rb +25 -19
  19. data/lib/media_types/formatter.rb +56 -56
  20. data/lib/media_types/hash.rb +21 -21
  21. data/lib/media_types/object.rb +35 -35
  22. data/lib/media_types/scheme/allow_nil.rb +30 -30
  23. data/lib/media_types/scheme/any_of.rb +41 -41
  24. data/lib/media_types/scheme/attribute.rb +46 -46
  25. data/lib/media_types/scheme/enumeration_context.rb +18 -18
  26. data/lib/media_types/scheme/enumeration_of_type.rb +80 -80
  27. data/lib/media_types/scheme/errors.rb +87 -87
  28. data/lib/media_types/scheme/links.rb +54 -54
  29. data/lib/media_types/scheme/missing_validation.rb +41 -41
  30. data/lib/media_types/scheme/not_strict.rb +15 -15
  31. data/lib/media_types/scheme/output_empty_guard.rb +45 -45
  32. data/lib/media_types/scheme/output_iterator_with_predicate.rb +66 -66
  33. data/lib/media_types/scheme/output_type_guard.rb +39 -39
  34. data/lib/media_types/scheme/rules.rb +186 -173
  35. data/lib/media_types/scheme/rules_exhausted_guard.rb +73 -73
  36. data/lib/media_types/scheme/validation_options.rb +44 -43
  37. data/lib/media_types/scheme.rb +535 -513
  38. data/lib/media_types/testing/assertions.rb +20 -20
  39. data/lib/media_types/validations.rb +118 -105
  40. data/lib/media_types/version.rb +5 -5
  41. data/lib/media_types/views.rb +12 -12
  42. data/lib/media_types.rb +73 -73
  43. data/media_types.gemspec +33 -33
  44. metadata +8 -6
@@ -1,20 +1,20 @@
1
- # frozen_string_literal: true
2
-
3
- module MediaTypes
4
- module Testing
5
- module Assertions
6
- def assert_media_type_format(media_type, output, **opts)
7
- return pass unless media_type.validatable?
8
-
9
- assert media_type.validate!(output, **opts)
10
- end
11
-
12
- def assert_mediatype(mediatype)
13
- mediatype.assert_sane!
14
- assert mediatype.media_type_validations.scheme.asserted_sane?
15
- rescue MediaTypes::AssertionError => e
16
- flunk e.message
17
- end
18
- end
19
- end
20
- end
1
+ # frozen_string_literal: true
2
+
3
+ module MediaTypes
4
+ module Testing
5
+ module Assertions
6
+ def assert_media_type_format(media_type, output, **opts)
7
+ return pass unless media_type.validatable?
8
+
9
+ assert media_type.validate!(output, **opts)
10
+ end
11
+
12
+ def assert_mediatype(mediatype)
13
+ mediatype.assert_sane!
14
+ assert mediatype.media_type_validations.scheme.asserted_sane?
15
+ rescue MediaTypes::AssertionError => e
16
+ flunk e.message
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,105 +1,118 @@
1
- # frozen_string_literal: true
2
-
3
- require 'media_types/scheme'
4
-
5
- module MediaTypes
6
- ##
7
- # Takes care of registering validations for a media type. It allows for nested schemes and registers each one so it
8
- # can be looked up at a later time.
9
- #
10
- # @see MediaType::Dsl
11
- # @see Scheme
12
- #
13
- class Validations
14
-
15
- attr_reader :scheme
16
-
17
- ##
18
- # Creates a new stack of validations
19
- #
20
- # @param [Constructable] media_type a Constructable media type
21
- # @param [Hash] registry the registry reference, or nil if top level
22
- # @param [Scheme] scheme the current scheme or nil if top level
23
- #
24
- # @see MediaTypes::Dsl
25
- # @see Constructable
26
- # @see Scheme
27
- #
28
- def initialize(media_type, registry = {}, scheme = Scheme.new, &block)
29
- self.media_type = media_type
30
- self.registry = registry.merge!(media_type.as_key => scheme)
31
- self.scheme = scheme
32
-
33
- instance_exec(&block) if block_given?
34
- end
35
-
36
- ##
37
- # Looks up the validations for Constructable
38
- #
39
- # @param [String, Constructable] media_type
40
- # @param [lambda] default the lambda if nothing can be found
41
- # @return [Scheme] the scheme for the given +media_type+
42
- #
43
- def find(media_type, default = -> { Scheme.new(allow_empty: true) { not_strict } })
44
- registry.fetch(media_type.as_key) do
45
- default.call
46
- end
47
- end
48
-
49
-
50
- if Gem::Version.new(RUBY_VERSION) > Gem::Version.new('2.7.0')
51
- def method_missing(method_name, *arguments, **kwargs, &block)
52
- if scheme.respond_to?(method_name)
53
- media_type.__getobj__.media_type_combinations ||= Set.new
54
- media_type.__getobj__.media_type_combinations.add(media_type.as_key)
55
-
56
- return scheme.send(method_name, *arguments, **kwargs, &block)
57
- end
58
-
59
- super
60
- end
61
- else
62
- def method_missing(method_name, *arguments, &block)
63
- if scheme.respond_to?(method_name)
64
- media_type.__getobj__.media_type_combinations ||= Set.new
65
- media_type.__getobj__.media_type_combinations.add(media_type.as_key)
66
-
67
- return scheme.send(method_name, *arguments, &block)
68
- end
69
-
70
- super
71
- end
72
- end
73
-
74
- def respond_to_missing?(method_name, include_private = false)
75
- scheme.respond_to?(method_name) || super
76
- end
77
-
78
- private
79
-
80
- attr_accessor :media_type, :registry
81
- attr_writer :scheme
82
-
83
- ##
84
- # Switches the inner block to a specific version
85
- #
86
- # @param [Numeric] version the version to switch to
87
- #
88
- def version(version, &block)
89
- Validations.new(media_type.version(version), registry, &block)
90
- end
91
-
92
- ##
93
- # Switches the inner block to a specific view
94
- #
95
- # @param [String, Symbol] view the view to switch to
96
- #
97
- def view(view, &block)
98
- Validations.new(media_type.view(view), registry, &block)
99
- end
100
-
101
- def suffix(name)
102
- scheme.type_attributes[:suffix] = name
103
- end
104
- end
105
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'media_types/scheme'
4
+
5
+ module MediaTypes
6
+ ##
7
+ # Takes care of registering validations for a media type. It allows for nested schemes and registers each one so it
8
+ # can be looked up at a later time.
9
+ #
10
+ # @see MediaType::Dsl
11
+ # @see Scheme
12
+ #
13
+ class Validations
14
+
15
+ attr_reader :scheme
16
+
17
+ ##
18
+ # Creates a new stack of validations
19
+ #
20
+ # @param [Constructable] media_type a Constructable media type
21
+ # @param [Hash] registry the registry reference, or nil if top level
22
+ # @param [Scheme] scheme the current scheme or nil if top level
23
+ #
24
+ # @see MediaTypes::Dsl
25
+ # @see Constructable
26
+ # @see Scheme
27
+ #
28
+ def initialize(media_type, registry = {}, scheme = Scheme.new(registry: registry, current_type: media_type), &block)
29
+ self.media_type = media_type
30
+ self.registry = registry.merge!(media_type.as_key => scheme)
31
+ self.scheme = scheme
32
+
33
+ instance_exec(&block) if block_given?
34
+ end
35
+
36
+ ##
37
+ # Looks up the validations for Constructable
38
+ #
39
+ # @param [String, Constructable] media_type
40
+ # @param [lambda] default the lambda if nothing can be found
41
+ # @return [Scheme] the scheme for the given +media_type+
42
+ #
43
+ def find(media_type, default = -> { Scheme.new(allow_empty: true) { not_strict } })
44
+ registry.fetch(media_type.as_key) do
45
+ default.call
46
+ end
47
+ end
48
+
49
+
50
+ if Gem::Version.new(RUBY_VERSION) > Gem::Version.new('2.7.0')
51
+ def method_missing(method_name, *arguments, **kwargs, &block)
52
+ if scheme.respond_to?(method_name)
53
+ media_type.__getobj__.media_type_combinations ||= Set.new
54
+ media_type.__getobj__.media_type_combinations.add(media_type.as_key)
55
+
56
+ return scheme.send(method_name, *arguments, **kwargs, &block)
57
+ end
58
+
59
+ super
60
+ end
61
+ else
62
+ def method_missing(method_name, *arguments, &block)
63
+ if scheme.respond_to?(method_name)
64
+ media_type.__getobj__.media_type_combinations ||= Set.new
65
+ media_type.__getobj__.media_type_combinations.add(media_type.as_key)
66
+
67
+ return scheme.send(method_name, *arguments, &block)
68
+ end
69
+
70
+ super
71
+ end
72
+ end
73
+
74
+ def respond_to_missing?(method_name, include_private = false)
75
+ scheme.respond_to?(method_name) || super
76
+ end
77
+
78
+ private
79
+
80
+ attr_accessor :media_type, :registry
81
+ attr_writer :scheme
82
+
83
+ ##
84
+ # Switches the inner block to a specific version
85
+ #
86
+ # @param [Numeric] version the version to switch to
87
+ #
88
+ def version(version, &block)
89
+ Validations.new(media_type.version(version), registry, &block)
90
+ end
91
+
92
+ ##
93
+ # Runs the block for multiple versions
94
+ #
95
+ # @param [Array] list of versions to run this on
96
+ #
97
+ def versions(versions, &block)
98
+ versions.each do |v|
99
+ Validations.new(media_type.version(v), registry) do
100
+ block(v)
101
+ end
102
+ end
103
+ end
104
+
105
+ ##
106
+ # Switches the inner block to a specific view
107
+ #
108
+ # @param [String, Symbol] view the view to switch to
109
+ #
110
+ def view(view, &block)
111
+ Validations.new(media_type.view(view), registry, &block)
112
+ end
113
+
114
+ def suffix(name)
115
+ scheme.type_attributes[:suffix] = name
116
+ end
117
+ end
118
+ end
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- module MediaTypes
4
- VERSION = '2.2.0'
5
- end
1
+ # frozen_string_literal: true
2
+
3
+ module MediaTypes
4
+ VERSION = '2.3.0'
5
+ end
@@ -1,12 +1,12 @@
1
- # frozen_string_literal: true
2
-
3
- module MediaTypes
4
- # Shortcut used by #collection to #view('collection')
5
- COLLECTION_VIEW = 'collection'
6
-
7
- # Shortcut used by #index to #view('index')
8
- INDEX_VIEW = 'index'
9
-
10
- # Shortcut used by #create to #view('create')
11
- CREATE_VIEW = 'create'
12
- end
1
+ # frozen_string_literal: true
2
+
3
+ module MediaTypes
4
+ # Shortcut used by #collection to #view('collection')
5
+ COLLECTION_VIEW = 'collection'
6
+
7
+ # Shortcut used by #index to #view('index')
8
+ INDEX_VIEW = 'index'
9
+
10
+ # Shortcut used by #create to #view('create')
11
+ CREATE_VIEW = 'create'
12
+ end
data/lib/media_types.rb CHANGED
@@ -1,73 +1,73 @@
1
- # frozen_string_literal: true
2
-
3
- require 'delegate'
4
-
5
- require 'media_types/version'
6
- require 'media_types/hash'
7
- require 'media_types/object'
8
- require 'media_types/scheme'
9
- require 'media_types/dsl'
10
- require 'media_types/errors'
11
-
12
- require 'media_types/views'
13
-
14
- module MediaTypes
15
- def self.set_organisation(mod, organisation)
16
- @organisation_prefixes ||= {}
17
- @organisation_prefixes[mod.name] = organisation
18
- end
19
-
20
- def self.expect_string_keys(mod)
21
- set_key_expectation(mod, false)
22
- end
23
-
24
- def self.expect_symbol_keys(mod)
25
- set_key_expectation(mod, true)
26
- end
27
-
28
- # Keep track of modules setting their key expectations
29
- def self.set_key_expectation(mod, expect_symbol_keys)
30
- @key_expectations ||= {}
31
- @key_expectations_used ||= {}
32
-
33
- raise KeyExpectationSetError.new(mod: mod) unless @key_expectations[mod.name].nil?
34
- raise KeyExpectationUsedError.new(mod: mod) if @key_expectations_used[mod.name]
35
-
36
- @key_expectations[mod.name] = expect_symbol_keys
37
- end
38
-
39
- SYMBOL_KEYS_DEFAULT = true
40
-
41
- def self.get_key_expectation(mod)
42
- @key_expectations ||= {}
43
- @key_expectations_used ||= {}
44
-
45
- expect_symbol = find_key_expectation(mod)
46
-
47
- expect_symbol.nil? ? SYMBOL_KEYS_DEFAULT : expect_symbol
48
- end
49
-
50
- def self.find_key_expectation(mod)
51
- modules = mod.name.split('::')
52
- expect_symbol = nil
53
-
54
- while modules.any? && expect_symbol.nil?
55
- current_module = modules.join('::')
56
- expect_symbol = @key_expectations[current_module]
57
- @key_expectations_used[current_module] = true
58
- modules.pop
59
- end
60
-
61
- expect_symbol
62
- end
63
-
64
- def self.get_organisation(mod)
65
- name = mod.name
66
- prefixes = @organisation_prefixes.keys.select { |p| name.start_with? p }
67
- return nil unless prefixes.any?
68
-
69
- best = prefixes.max_by { |p| p.length }
70
-
71
- @organisation_prefixes[best]
72
- end
73
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'delegate'
4
+
5
+ require 'media_types/version'
6
+ require 'media_types/hash'
7
+ require 'media_types/object'
8
+ require 'media_types/scheme'
9
+ require 'media_types/dsl'
10
+ require 'media_types/errors'
11
+
12
+ require 'media_types/views'
13
+
14
+ module MediaTypes
15
+ def self.set_organisation(mod, organisation)
16
+ @organisation_prefixes ||= {}
17
+ @organisation_prefixes[mod.name] = organisation
18
+ end
19
+
20
+ def self.expect_string_keys(mod)
21
+ set_key_expectation(mod, false)
22
+ end
23
+
24
+ def self.expect_symbol_keys(mod)
25
+ set_key_expectation(mod, true)
26
+ end
27
+
28
+ # Keep track of modules setting their key expectations
29
+ def self.set_key_expectation(mod, expect_symbol_keys)
30
+ @key_expectations ||= {}
31
+ @key_expectations_used ||= {}
32
+
33
+ raise KeyExpectationSetError.new(mod: mod) unless @key_expectations[mod.name].nil?
34
+ raise KeyExpectationUsedError.new(mod: mod) if @key_expectations_used[mod.name]
35
+
36
+ @key_expectations[mod.name] = expect_symbol_keys
37
+ end
38
+
39
+ SYMBOL_KEYS_DEFAULT = true
40
+
41
+ def self.get_key_expectation(mod)
42
+ @key_expectations ||= {}
43
+ @key_expectations_used ||= {}
44
+
45
+ expect_symbol = find_key_expectation(mod)
46
+
47
+ expect_symbol.nil? ? SYMBOL_KEYS_DEFAULT : expect_symbol
48
+ end
49
+
50
+ def self.find_key_expectation(mod)
51
+ modules = mod.name.split('::')
52
+ expect_symbol = nil
53
+
54
+ while modules.any? && expect_symbol.nil?
55
+ current_module = modules.join('::')
56
+ expect_symbol = @key_expectations[current_module]
57
+ @key_expectations_used[current_module] = true
58
+ modules.pop
59
+ end
60
+
61
+ expect_symbol
62
+ end
63
+
64
+ def self.get_organisation(mod)
65
+ name = mod.name
66
+ prefixes = @organisation_prefixes.keys.select { |p| name.start_with? p }
67
+ return nil unless prefixes.any?
68
+
69
+ best = prefixes.max_by { |p| p.length }
70
+
71
+ @organisation_prefixes[best]
72
+ end
73
+ end
data/media_types.gemspec CHANGED
@@ -1,33 +1,33 @@
1
- # frozen_string_literal: true
2
-
3
- lib = File.expand_path('lib', __dir__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'media_types/version'
6
-
7
- Gem::Specification.new do |spec|
8
- spec.name = 'media_types'
9
- spec.version = MediaTypes::VERSION
10
- spec.authors = ['Derk-Jan Karrenbeld', 'Max Maton']
11
- spec.email = ['derk-jan+github@karrenbeld.info', 'info@maxmaton.nl']
12
-
13
- spec.summary = 'Library to create media type definitions, schemes and validations'
14
- spec.description = 'Media Types as mime types are not easily supported by frameworks such as rails. '
15
- spec.homepage = 'https://github.com/SleeplessByte/media-types-ruby'
16
-
17
- # Specify which files should be added to the gem when it is released.
18
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
20
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
- end
22
- spec.bindir = 'exe'
23
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
- spec.require_paths = ['lib']
25
-
26
- spec.add_development_dependency 'awesome_print'
27
- spec.add_development_dependency 'bundler', '>= 2'
28
- spec.add_development_dependency 'minitest'
29
- spec.add_development_dependency 'minitest-reporters'
30
- spec.add_development_dependency 'oj'
31
- spec.add_development_dependency 'rake'
32
- spec.add_development_dependency 'simplecov'
33
- end
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'media_types/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'media_types'
9
+ spec.version = MediaTypes::VERSION
10
+ spec.authors = ['Derk-Jan Karrenbeld', 'Max Maton']
11
+ spec.email = ['derk-jan+github@karrenbeld.info', 'info@maxmaton.nl']
12
+
13
+ spec.summary = 'Library to create media type definitions, schemes and validations'
14
+ spec.description = 'Media Types as mime types are not easily supported by frameworks such as rails. '
15
+ spec.homepage = 'https://github.com/SleeplessByte/media-types-ruby'
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+ spec.bindir = 'exe'
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ['lib']
25
+
26
+ spec.add_development_dependency 'awesome_print'
27
+ spec.add_development_dependency 'bundler', '>= 2'
28
+ spec.add_development_dependency 'minitest'
29
+ spec.add_development_dependency 'minitest-reporters'
30
+ spec.add_development_dependency 'oj'
31
+ spec.add_development_dependency 'rake'
32
+ spec.add_development_dependency 'simplecov'
33
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: media_types
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derk-Jan Karrenbeld
8
8
  - Max Maton
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-03-24 00:00:00.000000000 Z
12
+ date: 2023-08-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: awesome_print
@@ -119,6 +119,8 @@ extensions: []
119
119
  extra_rdoc_files: []
120
120
  files:
121
121
  - ".github/workflows/debian.yml"
122
+ - ".github/workflows/publish-bookworm.yml"
123
+ - ".github/workflows/publish-sid.yml"
122
124
  - ".github/workflows/ruby.yml"
123
125
  - ".gitignore"
124
126
  - ".rubocop.yml"
@@ -162,7 +164,7 @@ files:
162
164
  homepage: https://github.com/SleeplessByte/media-types-ruby
163
165
  licenses: []
164
166
  metadata: {}
165
- post_install_message:
167
+ post_install_message:
166
168
  rdoc_options: []
167
169
  require_paths:
168
170
  - lib
@@ -177,8 +179,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
177
179
  - !ruby/object:Gem::Version
178
180
  version: '0'
179
181
  requirements: []
180
- rubygems_version: 3.1.6
181
- signing_key:
182
+ rubygems_version: 3.2.5
183
+ signing_key:
182
184
  specification_version: 4
183
185
  summary: Library to create media type definitions, schemes and validations
184
186
  test_files: []