stannum 0.1.0 → 0.2.0

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
  SHA256:
3
- metadata.gz: 8e4e097d69d42e93658309a2d4415742bdbeb66d48981f89a0a8b486c6935582
4
- data.tar.gz: 2fdf05503a9fd0e480c30fe45283c1e21dae6701cf79599a0a39ace8717d587f
3
+ metadata.gz: 74ab0240c5b4e242ba1f5dd6deb9724bb32ee6f310fbda553a2e0962fdfa7259
4
+ data.tar.gz: e2eac42708bd5b00dbd9a633ab8a9ecd13d4198a34754cd3149349a2d34c267d
5
5
  SHA512:
6
- metadata.gz: a650ec61bfc9997fef0ba824670b570c07e57089bde90c81a63fda2a5caaa3a6edfcf2075f2b4060bc25299858715bb8e97eca0548d4d729b9300a864c5cb141
7
- data.tar.gz: 50ed1712df35e1ac05d88c0661be728e10d77df2fecfd6b521e5b3a35c1045e54f4a88c0c9a715d14f24ea4ab5e6f9c25c17c5bf526abf3271a0a19bb1df5617
6
+ metadata.gz: f2fd1eada7dd26a9fa0f62a93b59c781c89d0aa638efe27869f45d1421fdf2e83a50bcd2c75ed86e4e3350907c00c86f499c4663a93082c599e38147a8ea39a7
7
+ data.tar.gz: 33060d922ae97025d104e372f1d42e6616bc30f03156eff19c904e407c9b4db56475d6acad7ff322edba6949616a163c3817c60cc7a539ef4d631a4a389bc99a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Constraints
6
+
7
+ - Implemented `Stannum::Constraints::Parameters::ExtraArguments`
8
+ - Implemented `Stannum::Constraints::Parameters::ExtraKeywords`
9
+
3
10
  ## 0.1.0
4
11
 
5
12
  Initial version.
data/config/locales/en.rb CHANGED
@@ -23,13 +23,27 @@
23
23
  is_not_equal_to: 'is not equal to',
24
24
  is_not_in_list: 'is not in the list',
25
25
  is_not_in_union: 'does not match any of the constraints',
26
- is_not_type: ->(_type, data) { "is not a #{data[:type]}" },
26
+ is_not_type: lambda do |_type, data|
27
+ if data[:required]
28
+ "is not a #{data[:type]}"
29
+ else
30
+ "is not a #{data[:type]} or nil"
31
+ end
32
+ end,
27
33
  is_not_value: 'is not the expected value',
28
- is_type: ->(_type, data) { "is a #{data[:type]}" },
34
+ is_type: lambda do |_type, data|
35
+ if data[:required]
36
+ "is a #{data[:type]}"
37
+ else
38
+ "is a #{data[:type]} or nil"
39
+ end
40
+ end,
29
41
  is_value: 'is the expected value',
30
42
  parameters: {
31
43
  extra_arguments: 'has extra arguments',
32
- extra_keywords: 'has extra keywords'
44
+ extra_keywords: 'has extra keywords',
45
+ no_extra_arguments: 'does not have extra arguments',
46
+ no_extra_keywords: 'does not have extra keywords'
33
47
  },
34
48
  tuples: {
35
49
  extra_items: 'has extra items',
@@ -74,6 +74,8 @@ module Stannum::Constraints
74
74
  #
75
75
  # constraint.does_not_match?(object) #=> true
76
76
  #
77
+ # @param actual [Object] The object to match.
78
+ #
77
79
  # @return [true, false] false if the object matches the expected properties
78
80
  # or behavior, otherwise true.
79
81
  #
@@ -143,6 +145,8 @@ module Stannum::Constraints
143
145
  # errors.class #=> Stannum::Errors
144
146
  # errors.to_a #=> [{ type: 'some_error', message: 'some error message' }]
145
147
  #
148
+ # @param actual [Object] The object to match.
149
+ #
146
150
  # @see #errors_for
147
151
  # @see #matches?
148
152
  def match(actual)
@@ -152,8 +156,12 @@ module Stannum::Constraints
152
156
  end
153
157
 
154
158
  # @overload matches?(actual)
159
+ # Checks that the given object matches the constraint.
160
+ #
161
+ # @param actual [Object] The object to match.
155
162
  #
156
- # Checks that the given object matches the constraint.
163
+ # @return [true, false] true if the object matches the expected properties
164
+ # or behavior, otherwise false.
157
165
  #
158
166
  # @example Checking a matching object.
159
167
  # constraint = CustomConstraint.new
@@ -167,9 +175,6 @@ module Stannum::Constraints
167
175
  #
168
176
  # constraint.matches?(object) #=> false
169
177
  #
170
- # @return [true, false] true if the object matches the expected properties
171
- # or behavior, otherwise false.
172
- #
173
178
  # @see #does_not_match?
174
179
  def matches?(_actual)
175
180
  false
@@ -221,6 +226,8 @@ module Stannum::Constraints
221
226
  # false and the generated errors for that object. If the object does not
222
227
  # match the constraint, #negated_match will return true.
223
228
  #
229
+ # @param actual [Object] The object to match.
230
+ #
224
231
  # @example Checking a matching object.
225
232
  # constraint = CustomConstraint.new
226
233
  # object = MatchingObject.new
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'stannum/constraints/hashes'
4
+ require 'stannum/support/coercion'
4
5
 
5
6
  module Stannum::Constraints::Hashes
6
7
  # Constraint for validating the keys of a hash-like object.
@@ -59,6 +60,8 @@ module Stannum::Constraints::Hashes
59
60
  end
60
61
 
61
62
  each_extra_key(actual) do |key, value|
63
+ key = Stannum::Support::Coercion.error_key(key)
64
+
62
65
  errors[key].add(type, value: value)
63
66
  end
64
67
 
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stannum/constraints/parameters'
4
+ require 'stannum/constraints/tuples/extra_items'
5
+
6
+ module Stannum::Constraints::Parameters
7
+ # Validates that the arguments passed to a method have no extra items.
8
+ #
9
+ # @example
10
+ # constraint = Stannum::Constraints::Parameters::ExtraArguments.new(3)
11
+ #
12
+ # constraint.matches?([]) #=> true
13
+ # constraint.matches?([1]) #=> true
14
+ # constraint.matches?([1, 2, 3]) #=> true
15
+ # constraint.matches?([1, 2, 3, 4]) #=> false
16
+ class ExtraArguments < Stannum::Constraints::Tuples::ExtraItems
17
+ # The :type of the error generated for a matching object.
18
+ NEGATED_TYPE = 'stannum.constraints.parameters.no_extra_arguments'
19
+
20
+ # The :type of the error generated for a non-matching object.
21
+ TYPE = 'stannum.constraints.parameters.extra_arguments'
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stannum/constraints/hashes/extra_keys'
4
+ require 'stannum/constraints/parameters'
5
+
6
+ module Stannum::Constraints::Parameters
7
+ # Validates that the keywords passed to a method have no extra keys.
8
+ #
9
+ # @example
10
+ # keys = %[fuel mass size]
11
+ # constraint = Stannum::Constraints::Parameters::ExpectedKeywords.new(keys)
12
+ #
13
+ # constraint.matches?({}) #=> true
14
+ # constraint.matches?({ fuel: 'Monopropellant' }) #=> true
15
+ # constraint.matches?({ electric: true, fuel: 'Xenon' }) #=> false
16
+ # constraint.matches?({ fuel: 'LF/O', mass: '1 ton', size: 'Medium' })
17
+ # #=> true
18
+ # constraint.matches?(
19
+ # { fuel: 'LF', mass: '2 tons', nuclear: true, size: 'Medium' }
20
+ # )
21
+ # #=> false
22
+ class ExtraKeywords < Stannum::Constraints::Hashes::ExtraKeys
23
+ # The :type of the error generated for a matching object.
24
+ NEGATED_TYPE = 'stannum.constraints.parameters.no_extra_keywords'
25
+
26
+ # The :type of the error generated for a non-matching object.
27
+ TYPE = 'stannum.constraints.parameters.extra_keywords'
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stannum/constraints'
4
+
5
+ module Stannum::Constraints
6
+ # Namespace for constraints that match method parameters.
7
+ module Parameters
8
+ autoload :ExtraArguments, 'stannum/constraints/parameters/extra_arguments'
9
+ autoload :ExtraKeywords, 'stannum/constraints/parameters/extra_keywords'
10
+ end
11
+ end
@@ -184,13 +184,17 @@ module Stannum::Constraints::Types
184
184
 
185
185
  def update_key_errors_for(actual:, errors:)
186
186
  non_matching_keys(actual).each do |key|
187
- key_type.errors_for(key, errors: errors[:keys][key])
187
+ mapped_key = Stannum::Support::Coercion.error_key(key)
188
+
189
+ key_type.errors_for(key, errors: errors[:keys][mapped_key])
188
190
  end
189
191
  end
190
192
 
191
193
  def update_value_errors_for(actual:, errors:)
192
194
  non_matching_values(actual).each do |key, value|
193
- value_type.errors_for(value, errors: errors[key])
195
+ mapped_key = Stannum::Support::Coercion.error_key(key)
196
+
197
+ value_type.errors_for(value, errors: errors[mapped_key])
194
198
  end
195
199
  end
196
200
 
@@ -15,6 +15,7 @@ module Stannum
15
15
  autoload :Hashes, 'stannum/constraints/hashes'
16
16
  autoload :Identity, 'stannum/constraints/identity'
17
17
  autoload :Nothing, 'stannum/constraints/nothing'
18
+ autoload :Parameters, 'stannum/constraints/parameters'
18
19
  autoload :Presence, 'stannum/constraints/presence'
19
20
  autoload :Signature, 'stannum/constraints/signature'
20
21
  autoload :Signatures, 'stannum/constraints/signatures'
@@ -121,6 +121,20 @@ module Stannum::Contracts
121
121
  options[:value_type]
122
122
  end
123
123
 
124
+ protected
125
+
126
+ def map_errors(errors, **options)
127
+ return super unless options[:property_type] == :key
128
+
129
+ property_name = options.fetch(:property_name, options[:property])
130
+ property_name = property_name.nil? ? [nil] : Array(property_name)
131
+ property_name = property_name.map do |key|
132
+ Stannum::Support::Coercion.error_key(key)
133
+ end
134
+
135
+ errors.dig(*property_name)
136
+ end
137
+
124
138
  private
125
139
 
126
140
  def add_type_constraint
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'stannum/constraints/parameters/extra_arguments'
3
4
  require 'stannum/contracts/parameters'
4
5
  require 'stannum/support/coercion'
5
6
 
@@ -8,9 +9,6 @@ module Stannum::Contracts::Parameters
8
9
  #
9
10
  # An ArgumentsContract constrains the arguments given for a method.
10
11
  class ArgumentsContract < Stannum::Contracts::TupleContract
11
- # The :type of the error generated for extra arguments.
12
- EXTRA_ARGUMENTS_TYPE = 'stannum.constraints.parameters.extra_arguments'
13
-
14
12
  # Value used when arguments array does not have a value for the given index.
15
13
  UNDEFINED = Object.new.freeze
16
14
 
@@ -154,10 +152,7 @@ module Stannum::Contracts::Parameters
154
152
  count = -> { expected_count }
155
153
 
156
154
  @variadic_constraint = Stannum::Constraints::Delegator.new(
157
- Stannum::Constraints::Tuples::ExtraItems.new(
158
- count,
159
- type: EXTRA_ARGUMENTS_TYPE
160
- )
155
+ Stannum::Constraints::Parameters::ExtraArguments.new(count)
161
156
  )
162
157
 
163
158
  add_constraint @variadic_constraint
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'stannum/constraints/parameters/extra_keywords'
3
4
  require 'stannum/contracts/indifferent_hash_contract'
4
5
  require 'stannum/contracts/parameters'
5
6
 
@@ -8,9 +9,6 @@ module Stannum::Contracts::Parameters
8
9
  #
9
10
  # A KeywordsContract constrains the keywords given for a method.
10
11
  class KeywordsContract < Stannum::Contracts::IndifferentHashContract
11
- # The :type of the error generated for extra keywords.
12
- EXTRA_KEYWORDS_TYPE = 'stannum.constraints.parameters.extra_keywords'
13
-
14
12
  # Value used when keywords hash does not have a value for the given key.
15
13
  UNDEFINED = Object.new.freeze
16
14
 
@@ -156,10 +154,7 @@ module Stannum::Contracts::Parameters
156
154
  keys = -> { expected_keys }
157
155
 
158
156
  @variadic_constraint = Stannum::Constraints::Delegator.new(
159
- Stannum::Constraints::Hashes::ExtraKeys.new(
160
- keys,
161
- type: EXTRA_KEYWORDS_TYPE
162
- )
157
+ Stannum::Constraints::Parameters::ExtraKeywords.new(keys)
163
158
  )
164
159
 
165
160
  add_constraint @variadic_constraint
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sleeping_king_studios/tools/toolbelt'
4
+ require 'yaml'
5
+
6
+ require 'stannum/messages'
7
+
8
+ module Stannum::Messages
9
+ # Loads and parses messages configuration files and merges configuration data.
10
+ class DefaultLoader
11
+ # @param file_paths [Array<String>] The directories from which to load the
12
+ # configuration files.
13
+ # @param locale [String] The name of the locale for which to load
14
+ # configuration.
15
+ def initialize(file_paths:, locale: 'en')
16
+ @file_paths = file_paths
17
+ @locale = locale
18
+ end
19
+
20
+ # @return [Array<String>] the directories from which to load the
21
+ # configuration files.
22
+ attr_reader :file_paths
23
+
24
+ # @return [String] the name of the locale for which to load configuration.
25
+ attr_reader :locale
26
+
27
+ # Loads and parses each file, then deep merges the data from each file.
28
+ #
29
+ # The configuration file should be either a Ruby file or a YAML file, with
30
+ # the filename of the format locale.extname, e.g. en.rb or en-gb.yml, and
31
+ # located in one of the directories defined in #file_paths.
32
+ #
33
+ # The contents of each file should be either a Ruby Hash or a YAML document
34
+ # containing an associative array, with a single key equal to the locale.
35
+ # The value of the key must be a Hash or associative array, which contains
36
+ # the scoped messages to load.
37
+ #
38
+ # Each file is read in order and parsed into a Hash. Each hash is then deep
39
+ # merged in sequence, with nested hashes merged together instead of
40
+ # overwritten.
41
+ #
42
+ # @return [Hash<Symbol, Object>] the merged configuration data.
43
+ def call
44
+ file_paths.reduce({}) do |config, file_path|
45
+ loaded = load_configuration_file(file_path)
46
+
47
+ deep_update(config, loaded)
48
+ end
49
+ end
50
+ alias load call
51
+
52
+ private
53
+
54
+ def deep_update(original, target)
55
+ target.each do |key, value|
56
+ if original[key].is_a?(Hash) && value.is_a?(Hash)
57
+ deep_update(original[key], value)
58
+ else
59
+ original[key] = value
60
+ end
61
+ end
62
+
63
+ original
64
+ end
65
+
66
+ def load_configuration_file(file_path)
67
+ ruby_file = File.join(file_path, "#{locale}.rb")
68
+
69
+ return read_ruby_file(ruby_file) if File.exist?(ruby_file)
70
+
71
+ yaml_file = File.join(file_path, "#{locale}.yml")
72
+
73
+ return read_yaml_file(yaml_file) if File.exist?(yaml_file)
74
+
75
+ {}
76
+ end
77
+
78
+ def read_ruby_file(filename)
79
+ ruby = File.read(filename)
80
+
81
+ eval(ruby, binding, filename) # rubocop:disable Security/Eval
82
+ end
83
+
84
+ def read_yaml_file(filename)
85
+ raw = File.read(filename)
86
+ yaml = YAML.safe_load(raw)
87
+
88
+ tools.hsh.convert_keys_to_symbols(yaml)
89
+ end
90
+
91
+ def tools
92
+ SleepingKingStudios::Tools::Toolbelt.instance
93
+ end
94
+ end
95
+ end
@@ -9,16 +9,28 @@ require 'stannum/messages'
9
9
  module Stannum::Messages
10
10
  # Strategy to generate error messages from gem configuration.
11
11
  class DefaultStrategy
12
+ # The default directories from which to load configured error messages.
13
+ DEFAULT_LOAD_PATHS = [Stannum::Messages.locales_path].freeze
14
+
15
+ # @return [Array<String>] The directories from which to load configured
16
+ # error messages.
17
+ def self.load_paths
18
+ @load_paths ||= DEFAULT_LOAD_PATHS.dup
19
+ end
20
+
12
21
  # @param configuration [Hash{Symbol, Object}] The configured messages.
13
- # @param load_path [Array<String>] The filenames for the configuration
14
- # file(s).
15
- def initialize(configuration: nil, load_path: nil)
16
- @load_path = load_path.nil? ? [default_filename] : Array(load_path)
22
+ # @param load_paths [Array<String>] The directories from which to load
23
+ # configured error messages.
24
+ # @param locale [String] The locale used to load and scope configured
25
+ # messages.
26
+ def initialize(configuration: nil, load_paths: nil, locale: 'en')
27
+ @load_paths = Array(load_paths) unless load_paths.nil?
28
+ @locale = locale
17
29
  @configuration = configuration
18
30
  end
19
31
 
20
- # @return [Array<String>] the filenames for the configuration file(s).
21
- attr_reader :load_path
32
+ # @return [String] The locale used to load and scope configured messages.
33
+ attr_reader :locale
22
34
 
23
35
  # @param error_type [String] The qualified path to the configured error
24
36
  # message.
@@ -34,6 +46,12 @@ module Stannum::Messages
34
46
  interpolate_message(message, options)
35
47
  end
36
48
 
49
+ # @return [Array<String>] The directories from which to load configured
50
+ # error messages.
51
+ def load_paths
52
+ @load_paths || self.class.load_paths
53
+ end
54
+
37
55
  # Reloads the configuration from the configured load_path.
38
56
  #
39
57
  # This can be useful when the load_path is updated after creating the
@@ -52,23 +70,9 @@ module Stannum::Messages
52
70
  @configuration ||= load_configuration
53
71
  end
54
72
 
55
- def deep_merge(source, target)
56
- hsh = tools.hash_tools.deep_dup(source)
57
-
58
- target.each do |key, value|
59
- hsh[key] = value.is_a?(Hash) ? deep_merge(hsh[key] || {}, value) : value
60
- end
61
-
62
- hsh
63
- end
64
-
65
- def default_filename
66
- File.join(Stannum::Messages.locales_path, 'en.rb')
67
- end
68
-
69
73
  def generate_message(error_type, options)
70
74
  path = error_type.to_s.split('.').map(&:intern)
71
- path.unshift(:en)
75
+ path.unshift(locale.intern)
72
76
 
73
77
  message = configuration.dig(*path)
74
78
 
@@ -90,35 +94,12 @@ module Stannum::Messages
90
94
  end
91
95
 
92
96
  def load_configuration
93
- load_path.reduce({}) do |config, filename|
94
- deep_merge(config, read_configuration(filename))
95
- end
96
- end
97
-
98
- def read_configuration(filename)
99
- case File.extname(filename)
100
- when '.rb'
101
- read_ruby_file(filename)
102
- when '.yml'
103
- read_yaml_file(filename)
104
- else
105
- raise "unable to load configuration file #{filename} with extension" \
106
- " #{File.extname(filename)}"
107
- end
108
- end
109
-
110
- def read_ruby_file(filename)
111
- eval(File.read(filename), binding, filename) # rubocop:disable Security/Eval
112
- end
113
-
114
- def read_yaml_file(filename)
115
- tools.hash_tools.convert_keys_to_symbols(
116
- YAML.safe_load(File.read(filename))
117
- )
118
- end
119
-
120
- def tools
121
- SleepingKingStudios::Tools::Toolbelt.instance
97
+ Stannum::Messages::DefaultLoader
98
+ .new(
99
+ file_paths: load_paths,
100
+ locale: locale
101
+ )
102
+ .call
122
103
  end
123
104
  end
124
105
  end
@@ -5,6 +5,7 @@ require 'stannum'
5
5
  module Stannum
6
6
  # Namespace for generating messages for Stannum::Errors.
7
7
  module Messages
8
+ autoload :DefaultLoader, 'stannum/messages/default_loader'
8
9
  autoload :DefaultStrategy, 'stannum/messages/default_strategy'
9
10
 
10
11
  # @return [String] the absolute path to the configured locales.
@@ -6,6 +6,7 @@ rescue NameError
6
6
  # Optional dependency.
7
7
  end
8
8
 
9
+ require 'stannum/constraints/parameters/extra_keywords'
9
10
  require 'stannum/rspec'
10
11
  require 'stannum/support/coercion'
11
12
 
@@ -313,9 +314,9 @@ module Stannum::RSpec
313
314
 
314
315
  def extra_parameter?
315
316
  extra_arguments_type =
316
- Stannum::Contracts::Parameters::ArgumentsContract::EXTRA_ARGUMENTS_TYPE
317
+ Stannum::Constraints::Parameters::ExtraArguments::TYPE
317
318
  extra_keywords_type =
318
- Stannum::Contracts::Parameters::KeywordsContract::EXTRA_KEYWORDS_TYPE
319
+ Stannum::Constraints::Parameters::ExtraKeywords::TYPE
319
320
 
320
321
  return false unless scoped_errors(indexed: true).any? do |error|
321
322
  error[:type] == extra_arguments_type ||
@@ -1,11 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'set'
4
+
3
5
  require 'stannum/support'
4
6
 
5
7
  module Stannum::Support
6
8
  # Shared functionality for coercing values to and from constraints.
7
9
  module Coercion
8
10
  class << self
11
+ ERROR_KEY_TYPES = Set.new([Integer, String, Symbol]).freeze
12
+ private_constant :ERROR_KEY_TYPES
13
+
14
+ # Coerces an arbitrary object into a valid Stannum::Errors key.
15
+ #
16
+ # If the value is an Integer, a String, or a Symbol, returns the value.
17
+ # Otherwise, returns the result of calling #inspect on the value.
18
+ #
19
+ # @param value [Object] The value to coerce.
20
+ #
21
+ # @return [Integer, String, Symbol] the value or result of #inspect.
22
+ def error_key(value)
23
+ return value if ERROR_KEY_TYPES.include?(value.class)
24
+
25
+ value.inspect
26
+ end
27
+
9
28
  # Coerce a Boolean value to a Presence constraint.
10
29
  #
11
30
  # @param present [true, false, Stannum::Constraints::Base, nil] The
@@ -10,7 +10,7 @@ module Stannum
10
10
  # Major version.
11
11
  MAJOR = 0
12
12
  # Minor version.
13
- MINOR = 1
13
+ MINOR = 2
14
14
  # Patch version.
15
15
  PATCH = 0
16
16
  # Prerelease version.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stannum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob "Merlin" Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-08 00:00:00.000000000 Z
11
+ date: 2021-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sleeping_king_studios-tools
@@ -133,6 +133,9 @@ files:
133
133
  - lib/stannum/constraints/hashes/indifferent_key.rb
134
134
  - lib/stannum/constraints/identity.rb
135
135
  - lib/stannum/constraints/nothing.rb
136
+ - lib/stannum/constraints/parameters.rb
137
+ - lib/stannum/constraints/parameters/extra_arguments.rb
138
+ - lib/stannum/constraints/parameters/extra_keywords.rb
136
139
  - lib/stannum/constraints/presence.rb
137
140
  - lib/stannum/constraints/signature.rb
138
141
  - lib/stannum/constraints/signatures.rb
@@ -175,6 +178,7 @@ files:
175
178
  - lib/stannum/contracts/tuple_contract.rb
176
179
  - lib/stannum/errors.rb
177
180
  - lib/stannum/messages.rb
181
+ - lib/stannum/messages/default_loader.rb
178
182
  - lib/stannum/messages/default_strategy.rb
179
183
  - lib/stannum/parameter_validation.rb
180
184
  - lib/stannum/rspec.rb