media_types 0.5.0 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 54061285d1504ab09d4fc7299bf242ad4e0a7529
4
- data.tar.gz: d1cff5bf120ff2f5cd570887f3e351117466e54e
3
+ metadata.gz: 60e6f4948af77b72e970849c287e89e9f1666470
4
+ data.tar.gz: 5f2e3f281075c813da57bfe85e391559b17fc02c
5
5
  SHA512:
6
- metadata.gz: 283abdbba4639fbabb39223ed943c495289a2a2f607055e1c00d1b789d6612d604d3de5b7bf4d4e5d644acd9e4d46316e2e92319354f71278059f0c42697b5eb
7
- data.tar.gz: 2a57915b68ebab50f5820ee472499aea29d9bbeaa17f5cab416419c8ab3acba7f094c1934c50e2458b9c3728f71c5c6f845de6ec6e6e55bac666143ff48030dd
6
+ metadata.gz: 22592d00055a373b235c543968cf88631becab9b7d97ee60c371661af5eca417c7a5e120f8f7fc2a7a0bea5fb21535b0fc94d89691a55f81dc229e5fa548b54e
7
+ data.tar.gz: cd4799ba03f74d0d10aa8c6de20dafb1cc836c85ca609ee273d34fdbea0266f174adbe29a6570099659d52ff551d8cd0b6bcf132fbc6f75a0e08984d626f94d9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 0.5.1
2
+
3
+ - Fix merging optional attributes
4
+ - Change `#inspect` to look like a tree
5
+
1
6
  # 0.5.0
2
7
 
3
8
  - Change internal representation of key to symbol
data/Gemfile.lock CHANGED
@@ -1,44 +1,44 @@
1
- PATH
2
- remote: .
3
- specs:
4
- media_types (0.5.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- ansi (1.5.0)
10
- awesome_print (1.8.0)
11
- builder (3.2.3)
12
- docile (1.3.1)
13
- json (2.1.0)
14
- minitest (5.11.3)
15
- minitest-ci (3.4.0)
16
- minitest (>= 5.0.6)
17
- minitest-reporters (1.3.4)
18
- ansi
19
- builder
20
- minitest (>= 5.0)
21
- ruby-progressbar
22
- rake (10.5.0)
23
- ruby-progressbar (1.10.0)
24
- simplecov (0.16.1)
25
- docile (~> 1.1)
26
- json (>= 1.8, < 3)
27
- simplecov-html (~> 0.10.0)
28
- simplecov-html (0.10.2)
29
-
30
- PLATFORMS
31
- x64-mingw32
32
-
33
- DEPENDENCIES
34
- awesome_print
35
- bundler (~> 1.16)
36
- media_types!
37
- minitest (~> 5.0)
38
- minitest-ci
39
- minitest-reporters
40
- rake (~> 10.0)
41
- simplecov
42
-
43
- BUNDLED WITH
44
- 1.16.4
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ media_types (0.5.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ansi (1.5.0)
10
+ awesome_print (1.8.0)
11
+ builder (3.2.3)
12
+ docile (1.3.1)
13
+ json (2.1.0)
14
+ minitest (5.11.3)
15
+ minitest-ci (3.4.0)
16
+ minitest (>= 5.0.6)
17
+ minitest-reporters (1.3.4)
18
+ ansi
19
+ builder
20
+ minitest (>= 5.0)
21
+ ruby-progressbar
22
+ rake (10.5.0)
23
+ ruby-progressbar (1.10.0)
24
+ simplecov (0.16.1)
25
+ docile (~> 1.1)
26
+ json (>= 1.8, < 3)
27
+ simplecov-html (~> 0.10.0)
28
+ simplecov-html (0.10.2)
29
+
30
+ PLATFORMS
31
+ x64-mingw32
32
+
33
+ DEPENDENCIES
34
+ awesome_print
35
+ bundler (~> 1.16)
36
+ media_types!
37
+ minitest (~> 5.0)
38
+ minitest-ci
39
+ minitest-reporters
40
+ rake (~> 10.0)
41
+ simplecov
42
+
43
+ BUNDLED WITH
44
+ 1.16.4
data/README.md CHANGED
@@ -37,6 +37,10 @@ You can define media types by inheriting from this base type, or create your own
37
37
  require 'media_types'
38
38
 
39
39
  class Venue < MediaTypes::Base
40
+ def self.base_format
41
+ 'application/vnd.mydomain.%<type>s.v%<version>.s%<view>s+%<suffix>s'
42
+ end
43
+
40
44
  media_type 'venue', defaults: { suffix: :json, version: 2 }
41
45
 
42
46
  validations do
@@ -85,10 +89,6 @@ class Venue < MediaTypes::Base
85
89
  suffix :json
86
90
  suffix :xml
87
91
  end
88
-
89
- def self.base_format
90
- 'application/vnd.mydomain.%<type>s.v%<version>.s%<view>s+%<suffix>s'
91
- end
92
92
  end
93
93
  ```
94
94
 
@@ -4,6 +4,18 @@ require 'delegate'
4
4
 
5
5
  module MediaTypes
6
6
  class Scheme
7
+ class << self
8
+ # noinspection RubyClassMethodNamingConvention
9
+ ##
10
+ # Allows the wrapped +klazz+ to be nil
11
+ #
12
+ # @param [Class] klazz the class that +it+ must be the if +it+ is not NilClass
13
+ # @return [CaseEqualityWithList]
14
+ def AllowNil(klazz) # rubocop:disable Naming/MethodName
15
+ AnyOf(NilClass, klazz)
16
+ end
17
+ end
18
+
7
19
  # noinspection RubyInstanceMethodNamingConvention
8
20
  ##
9
21
  # Allows the wrapped +klazz+ to be nil
@@ -11,7 +23,7 @@ module MediaTypes
11
23
  # @param [Class] klazz the class that +it+ must be the if +it+ is not NilClass
12
24
  # @return [CaseEqualityWithList]
13
25
  def AllowNil(klazz) # rubocop:disable Naming/MethodName
14
- AnyOf(NilClass, klazz)
26
+ self.class.AllowNil(klazz)
15
27
  end
16
28
  end
17
29
  end
@@ -16,6 +16,18 @@ module MediaTypes
16
16
  end
17
17
  end
18
18
 
19
+ class << self
20
+ # noinspection RubyClassMethodNamingConvention
21
+ ##
22
+ # Allows +it+ to be any of the wrapped +klazzes+
23
+ #
24
+ # @param [Array<Class>] klazzes the classes that are valid for +it+
25
+ # @return [CaseEqualityWithList]
26
+ def AnyOf(*klazzes) # rubocop:disable Naming/MethodName
27
+ CaseEqualityWithList.new(klazzes)
28
+ end
29
+ end
30
+
19
31
  # noinspection RubyInstanceMethodNamingConvention
20
32
  ##
21
33
  # Allows +it+ to be any of the wrapped +klazzes+
@@ -23,7 +35,7 @@ module MediaTypes
23
35
  # @param [Array<Class>] klazzes the classes that are valid for +it+
24
36
  # @return [CaseEqualityWithList]
25
37
  def AnyOf(*klazzes) # rubocop:disable Naming/MethodName
26
- CaseEqualityWithList.new(klazzes)
38
+ self.class.AnyOf(*klazzes)
27
39
  end
28
40
  end
29
41
  end
@@ -14,17 +14,12 @@ module MediaTypes
14
14
  # @param [TrueClass, FalseClass] allow_nil if true, nil? is allowed
15
15
  #
16
16
  def initialize(type, allow_nil: false)
17
- self.type = type
18
- self.allow_nil = allow_nil
17
+ self.type = allow_nil ? AllowNil(type) : type
19
18
 
20
19
  freeze
21
20
  end
22
21
 
23
22
  def validate!(output, options, **_opts)
24
- if output.nil?
25
- return true if allow_nil
26
- end
27
-
28
23
  return true if type === output # rubocop:disable Style/CaseEquality
29
24
  raise ValidationError,
30
25
  format(
@@ -36,7 +31,7 @@ module MediaTypes
36
31
  end
37
32
 
38
33
  def inspect
39
- "[Scheme::Attribute type=#{type} nil=#{allow_nil}]"
34
+ "[Scheme::Attribute of #{type.inspect}]"
40
35
  end
41
36
 
42
37
  private
@@ -12,13 +12,20 @@ module MediaTypes
12
12
 
13
13
  def raise_strict!(key:, backtrace:, strict_keys:)
14
14
  raise StrictValidationError, format(
15
- 'Unknown key %<key>s in output at [%<backtrace>s]. Expected one of: %<strict_keys>s',
15
+ "Unknown key %<key>s in data.\n" \
16
+ "\tFound at: %<backtrace>s\n" \
17
+ "\tExpected:\n\n" \
18
+ '%<strict_keys>s',
16
19
  key: key.inspect,
17
20
  backtrace: backtrace.join('->'),
18
- strict_keys: strict_keys
21
+ strict_keys: strict_keys.inspect(1)
19
22
  )
20
23
  end
21
24
 
25
+ def inspect
26
+ '((raise when strict))'
27
+ end
28
+
22
29
  end
23
30
  end
24
31
  end
@@ -8,7 +8,7 @@ module MediaTypes
8
8
  end
9
9
 
10
10
  def inspect
11
- '[Scheme::NotStrict]'
11
+ '((noop: not strict))'
12
12
  end
13
13
  end
14
14
  end
@@ -45,6 +45,14 @@ module MediaTypes
45
45
  self
46
46
  end
47
47
 
48
+ ##
49
+ # Returns the keys that are not options
50
+ #
51
+ # @see #add
52
+ # #see #merge
53
+ #
54
+ # @return [Array<Symbol>] required keys
55
+ #
48
56
  def required
49
57
  clone.tap do |cloned|
50
58
  optional_keys.each do |key|
@@ -59,13 +67,38 @@ module MediaTypes
59
67
  end
60
68
  end
61
69
 
70
+ ##
71
+ # Merges another set of rules into a clone of this one
72
+ #
73
+ # @param [Rules, ::Hash] the other rules
74
+ # @return [Rules] a clone
75
+ #
62
76
  def merge(rules)
63
- __getobj__.merge!(rules)
64
- self
77
+ clone.instance_exec do
78
+ __setobj__(__getobj__.merge(rules))
79
+ if rules.respond_to?(:optional_keys, true)
80
+ optional_keys.push(*rules.send(:optional_keys))
81
+ end
82
+
83
+ self
84
+ end
85
+ end
86
+
87
+ def inspect(indent = 0)
88
+ prefix = ' ' * indent
89
+ [
90
+ "#{prefix}[Rules n=#{keys.length} optional=#{optional_keys.length}]",
91
+ "#{prefix} #{inspect_format_attribute(indent, '*', default)}",
92
+ *keys.map { |key| "#{prefix} #{inspect_format_attribute(indent, key)}" },
93
+ "#{prefix}[/Rules]"
94
+ ].join("\n")
65
95
  end
66
96
 
67
- def inspect
68
- "[Scheme::Rules n=#{keys.length} default=#{default}]"
97
+ def inspect_format_attribute(indent, key, value = self[key])
98
+ [
99
+ [key.to_s, optional_keys.include?(key) && '(optional)' || nil].compact.join(' '),
100
+ value.is_a?(Scheme) || value.is_a?(Rules) ? "\n#{value.inspect(indent + 2)}" : value.inspect
101
+ ].join(': ')
69
102
  end
70
103
 
71
104
  alias get []
@@ -351,8 +351,13 @@ module MediaTypes
351
351
  end.link(*args, **opts, &block)
352
352
  end
353
353
 
354
- def inspect
355
- "[Scheme]#{rules}[/Scheme]"
354
+ def inspect(indentation = 0)
355
+ tabs = ' ' * indentation
356
+ [
357
+ "#{tabs}[Scheme]",
358
+ rules.inspect(indentation + 1),
359
+ "#{tabs}[/Scheme]"
360
+ ].join("\n")
356
361
  end
357
362
 
358
363
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MediaTypes
4
- VERSION = '0.5.0'
4
+ VERSION = '0.5.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: media_types
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derk-Jan Karrenbeld