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
data/Rakefile CHANGED
@@ -1,12 +1,12 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bundler/gem_tasks'
4
- require 'rake/testtask'
5
-
6
- Rake::TestTask.new(:test) do |t|
7
- t.libs << 'test'
8
- t.libs << 'lib'
9
- t.test_files = FileList['test/**/*_test.rb']
10
- end
11
-
12
- task default: :test
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << 'test'
8
+ t.libs << 'lib'
9
+ t.test_files = FileList['test/**/*_test.rb']
10
+ end
11
+
12
+ task default: :test
data/bin/console CHANGED
@@ -1,15 +1,15 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require 'bundler/setup'
5
- require 'media_types'
6
-
7
- # You can add fixtures and/or initialization code here to make experimenting
8
- # with your gem easier. You can also use a different console, if you like.
9
-
10
- # (If you use this, don't forget to add pry to your Gemfile!)
11
- # require "pry"
12
- # Pry.start
13
-
14
- require 'irb'
15
- IRB.start(__FILE__)
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'media_types'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require 'irb'
15
+ IRB.start(__FILE__)
data/bin/setup CHANGED
@@ -1,8 +1,8 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -1,160 +1,161 @@
1
- # frozen_string_literal: true
2
-
3
- require 'delegate'
4
- require 'singleton'
5
-
6
- require 'media_types/formatter'
7
-
8
- module MediaTypes
9
- class Constructable < SimpleDelegator
10
-
11
- def initialize(klazz, **opts)
12
- super klazz
13
- self.opts = opts
14
- end
15
-
16
- def type(name = NO_ARG)
17
- return opts[:type] if name == NO_ARG
18
- with(type: name)
19
- end
20
-
21
- def version(version = NO_ARG)
22
- return opts[:version] if version == NO_ARG
23
- with(version: version)
24
- end
25
-
26
- def view(view = NO_ARG)
27
- return opts[:view] if view == NO_ARG
28
- with(view: view)
29
- end
30
-
31
- def collection
32
- view(COLLECTION_VIEW)
33
- end
34
-
35
- def collection?
36
- opts[:view] == COLLECTION_VIEW
37
- end
38
-
39
- def create
40
- view(CREATE_VIEW)
41
- end
42
-
43
- def create?
44
- opts[:view] == CREATE_VIEW
45
- end
46
-
47
- def index
48
- view(INDEX_VIEW)
49
- end
50
-
51
- def index?
52
- opts[:view] == INDEX_VIEW
53
- end
54
-
55
- def ===(other)
56
- to_str.send(:===, other)
57
- end
58
-
59
- def ==(other)
60
- to_str.send(:==, other)
61
- end
62
-
63
- def +(other)
64
- to_str + other
65
- end
66
-
67
- def split(pattern = nil, *limit)
68
- to_str.split(pattern, *limit)
69
- end
70
-
71
- def as_key
72
- [type, view&.to_s, version]
73
- end
74
-
75
- def hash
76
- as_key.hash
77
- end
78
-
79
- def override_suffix(suffix)
80
- with(suffix: suffix)
81
- end
82
-
83
- def suffix
84
- return opts[:suffix] if opts.key?(:suffix)
85
-
86
- schema = schema_for(self)
87
- schema.type_attributes.fetch(:suffix, 'json')
88
- end
89
-
90
- def to_str(qualifier = nil)
91
- qualified(
92
- qualifier,
93
- __getobj__.media_type_name_for.call(
94
- type: opts[:type],
95
- view: opts[:view],
96
- version: opts[:version],
97
- suffix: suffix
98
- )
99
- )
100
- end
101
-
102
- def available_validations
103
- return [] if !validatable?
104
- [self]
105
- end
106
-
107
- def valid?(output, **validation_opts)
108
- raise ArgumentError, "Unable to validate #{to_s} type without a corresponding validation. Please mark objects that should be empty with 'empty'." unless validatable?
109
-
110
- __getobj__.valid_unsafe?(
111
- output,
112
- self,
113
- **validation_opts
114
- )
115
- end
116
-
117
- def validate!(output, **validation_opts)
118
- raise ArgumentError, "Unable to validate #{to_s} type without a corresponding validation. Please mark objects that should be empty with 'empty'." unless validatable?
119
-
120
- __getobj__.validate_unsafe!(
121
- output,
122
- self,
123
- **validation_opts
124
- )
125
- end
126
-
127
- def validatable?
128
- return false unless media_type_combinations.include? as_key
129
-
130
- __getobj__.validatable?(self)
131
- end
132
-
133
- alias inspect to_str
134
- alias to_s to_str
135
- alias identifier to_str
136
-
137
- private
138
-
139
- class NoArgumentGiven
140
- include Singleton
141
- end
142
-
143
- NO_ARG = NoArgumentGiven.instance
144
-
145
- attr_accessor :opts
146
-
147
- def with(more_opts)
148
- merged_options = Kernel::Hash(opts).clone.tap do |cloned|
149
- cloned.merge!(more_opts)
150
- end
151
-
152
- Constructable.new(__getobj__, **merged_options)
153
- end
154
-
155
- def qualified(qualifier, media_type)
156
- return media_type unless qualifier
157
- format('%<media_type>s; q=%<q>s', media_type: media_type, q: qualifier)
158
- end
159
- end
160
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'delegate'
4
+ require 'singleton'
5
+
6
+ require 'media_types/formatter'
7
+
8
+ module MediaTypes
9
+ class Constructable < SimpleDelegator
10
+
11
+ def initialize(klazz, **opts)
12
+ super klazz
13
+ self.opts = opts
14
+ end
15
+
16
+ def type(name = NO_ARG)
17
+ return opts[:type] if name == NO_ARG
18
+ with(type: name)
19
+ end
20
+
21
+ def version(version = NO_ARG)
22
+ return opts[:version] if version == NO_ARG
23
+ with(version: version)
24
+ end
25
+
26
+ def view(view = NO_ARG)
27
+ return opts[:view] if view == NO_ARG
28
+ with(view: view)
29
+ end
30
+
31
+ def collection
32
+ view(COLLECTION_VIEW)
33
+ end
34
+
35
+ def collection?
36
+ opts[:view] == COLLECTION_VIEW
37
+ end
38
+
39
+ def create
40
+ view(CREATE_VIEW)
41
+ end
42
+
43
+ def create?
44
+ opts[:view] == CREATE_VIEW
45
+ end
46
+
47
+ def index
48
+ view(INDEX_VIEW)
49
+ end
50
+
51
+ def index?
52
+ opts[:view] == INDEX_VIEW
53
+ end
54
+
55
+ def ===(other)
56
+ to_str.send(:===, other)
57
+ end
58
+
59
+ def ==(other)
60
+ to_str.send(:==, other)
61
+ end
62
+
63
+ def +(other)
64
+ to_str + other
65
+ end
66
+
67
+ def split(pattern = nil, *limit)
68
+ to_str.split(pattern, *limit)
69
+ end
70
+
71
+ def as_key
72
+ [type, view&.to_s, version]
73
+ end
74
+
75
+ def hash
76
+ as_key.hash
77
+ end
78
+
79
+ def override_suffix(suffix)
80
+ with(suffix: suffix)
81
+ end
82
+
83
+ def suffix
84
+ return opts[:suffix] if opts.key?(:suffix)
85
+
86
+ schema = schema_for(self)
87
+ schema.type_attributes.fetch(:suffix, 'json')
88
+ end
89
+
90
+ def to_str(qualifier = nil)
91
+ qualified(
92
+ qualifier,
93
+ __getobj__.media_type_name_for.call(
94
+ type: opts[:type],
95
+ view: opts[:view],
96
+ version: opts[:version],
97
+ suffix: suffix
98
+ )
99
+ )
100
+ end
101
+
102
+ def available_validations
103
+ return [] if !validatable?
104
+ [self]
105
+ end
106
+
107
+ def valid?(output, **validation_opts)
108
+ raise ArgumentError, "Unable to validate #{to_s} type without a corresponding validation. Please mark objects that should be empty with 'empty'." unless validatable?
109
+
110
+ __getobj__.valid_unsafe?(
111
+ output,
112
+ self,
113
+ **validation_opts
114
+ )
115
+ end
116
+
117
+ def validate!(output, **validation_opts)
118
+ raise ArgumentError, "Unable to validate #{to_s} type without a corresponding validation. Please mark objects that should be empty with 'empty'." unless validatable?
119
+
120
+ __getobj__.validate_unsafe!(
121
+ output,
122
+ self,
123
+ **validation_opts
124
+ )
125
+ end
126
+
127
+ def validatable?
128
+ return false if media_type_combinations.nil?
129
+ return false unless media_type_combinations.include? as_key
130
+
131
+ __getobj__.validatable?(self)
132
+ end
133
+
134
+ alias inspect to_str
135
+ alias to_s to_str
136
+ alias identifier to_str
137
+
138
+ private
139
+
140
+ class NoArgumentGiven
141
+ include Singleton
142
+ end
143
+
144
+ NO_ARG = NoArgumentGiven.instance
145
+
146
+ attr_accessor :opts
147
+
148
+ def with(more_opts)
149
+ merged_options = Kernel::Hash(opts).clone.tap do |cloned|
150
+ cloned.merge!(more_opts)
151
+ end
152
+
153
+ Constructable.new(__getobj__, **merged_options)
154
+ end
155
+
156
+ def qualified(qualifier, media_type)
157
+ return media_type unless qualifier
158
+ format('%<media_type>s; q=%<q>s', media_type: media_type, q: qualifier)
159
+ end
160
+ end
161
+ end
@@ -1,18 +1,18 @@
1
- # frozen_string_literal: true
2
-
3
- module MediaTypes
4
- module Dsl
5
- class UninitializedConstructable < RuntimeError
6
- def message
7
- 'Unable to generate constructable without a name, make sure to have called `use_name(name)` before.'
8
- end
9
- end
10
-
11
- # Raised when an error occurs during setting expected key type
12
- class KeyTypeExpectationError < StandardError; end
13
-
14
- class MissingValidationError < StandardError; end
15
-
16
- class OrganisationNotSetError < StandardError; end
17
- end
18
- end
1
+ # frozen_string_literal: true
2
+
3
+ module MediaTypes
4
+ module Dsl
5
+ class UninitializedConstructable < RuntimeError
6
+ def message
7
+ 'Unable to generate constructable without a name, make sure to have called `use_name(name)` before.'
8
+ end
9
+ end
10
+
11
+ # Raised when an error occurs during setting expected key type
12
+ class KeyTypeExpectationError < StandardError; end
13
+
14
+ class MissingValidationError < StandardError; end
15
+
16
+ class OrganisationNotSetError < StandardError; end
17
+ end
18
+ end