json-spec 0.1.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 +7 -0
- data/.gitignore +3 -0
- data/.gitmodules +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +960 -0
- data/Rakefile +10 -0
- data/api_documentation.md +611 -0
- data/cachivache/.gitignore +1 -0
- data/cachivache/Gemfile +4 -0
- data/cachivache/README.md +247 -0
- data/cachivache/Rakefile +19 -0
- data/cachivache/Vagrantfile +70 -0
- data/cachivache/cachivache.rb +59 -0
- data/cachivache/lib/let-behaviour.rb +27 -0
- data/cachivache/lib/rake-helper.rb +131 -0
- data/cachivache/lib/sh-file-context.rb +39 -0
- data/cachivache/lib/sh-if-context.rb +31 -0
- data/cachivache/stuff/.gitkeep +0 -0
- data/cachivache/stuff/ruby-json-spec.rb +22 -0
- data/examples/example-1-simple.rb +66 -0
- data/examples/example-2-default-expectations.rb +63 -0
- data/examples/example-3-each-field.rb +104 -0
- data/examples/example-4-to-be-as-defined-in.rb +117 -0
- data/examples/example-5-custom-expectations.rb +153 -0
- data/examples/example-6-custom-messages.rb +36 -0
- data/examples/example-7-full-example.rb +231 -0
- data/examples/fixtures.rb +77 -0
- data/examples/validation-printer.rb +47 -0
- data/json-spec.gemspec +29 -0
- data/lib/cabeza-de-termo/json-spec/errors/error.rb +6 -0
- data/lib/cabeza-de-termo/json-spec/errors/expectation-not-found-error.rb +8 -0
- data/lib/cabeza-de-termo/json-spec/errors/modifier-not-found-error.rb +8 -0
- data/lib/cabeza-de-termo/json-spec/errors/unkown-json-type-error.rb +8 -0
- data/lib/cabeza-de-termo/json-spec/errors/validation-error.rb +8 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/default-expectations/default-expectation-builder.rb +29 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/default-expectations/default-expectations-mapping.rb +54 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/expectation-builders/block-expectation-definition.rb +16 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/expectation-builders/class-expectation-definition.rb +15 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/expectation-builders/expectation-definition.rb +19 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/expectation-builders/expectations-definition-builder.rb +136 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/expectation-builders/expecting-all-of-expectation-definition.rb +23 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/expectation-builders/expecting-any-of-expectation-definition.rb +23 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/expectation-builders/expecting-expectation-definition.rb +17 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/expectation-builders/negating-expectation-definition.rb +16 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/expectation-library-definition-builder.rb +35 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/modifier-builders/class-modifier-definition.rb +15 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/modifier-builders/composing-modifiers-definition.rb +28 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/modifier-builders/modifier-definition.rb +13 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/definition-builders/modifier-builders/modifiers-definition-builder.rb +73 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/expectations-library.rb +150 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/initializers/default-library-initializer.rb +265 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/initializers/library-initializer.rb +9 -0
- data/lib/cabeza-de-termo/json-spec/expectations-library/messages/expectation-messages-mapping.rb +27 -0
- data/lib/cabeza-de-termo/json-spec/expectations/abstract-expectation.rb +39 -0
- data/lib/cabeza-de-termo/json-spec/expectations/all-expectations-composite.rb +33 -0
- data/lib/cabeza-de-termo/json-spec/expectations/any-expectation-composite.rb +33 -0
- data/lib/cabeza-de-termo/json-spec/expectations/block-expectation.rb +28 -0
- data/lib/cabeza-de-termo/json-spec/expectations/expectation.rb +51 -0
- data/lib/cabeza-de-termo/json-spec/expectations/is-email-expectation.rb +16 -0
- data/lib/cabeza-de-termo/json-spec/expectations/is-scalar-expectation.rb +17 -0
- data/lib/cabeza-de-termo/json-spec/expectations/is-url-expectation.rb +21 -0
- data/lib/cabeza-de-termo/json-spec/expectations/negated-expectation.rb +31 -0
- data/lib/cabeza-de-termo/json-spec/expectations/runner/abstract-expectations-runner.rb +27 -0
- data/lib/cabeza-de-termo/json-spec/expectations/runner/can-be-absent-expectations-runner.rb +50 -0
- data/lib/cabeza-de-termo/json-spec/expectations/runner/can-be-null-expectations-runner.rb +48 -0
- data/lib/cabeza-de-termo/json-spec/expectations/runner/expectations-runner.rb +43 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-any-of.rb +62 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-anything.rb +16 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-each-field.rb +58 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-each.rb +58 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-expression.rb +314 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-field-name.rb +16 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-field.rb +76 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-list.rb +40 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-object.rb +82 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-scalar.rb +20 -0
- data/lib/cabeza-de-termo/json-spec/expressions/json-spec.rb +174 -0
- data/lib/cabeza-de-termo/json-spec/instantiators/abstract-instantiator.rb +9 -0
- data/lib/cabeza-de-termo/json-spec/instantiators/all-expectations-composite-instantiator.rb +12 -0
- data/lib/cabeza-de-termo/json-spec/instantiators/any-expectation-composite-instantiator.rb +12 -0
- data/lib/cabeza-de-termo/json-spec/instantiators/block-expectation-instantiator.rb +16 -0
- data/lib/cabeza-de-termo/json-spec/instantiators/composite-instantiator.rb +45 -0
- data/lib/cabeza-de-termo/json-spec/instantiators/modifier-composite-instantiator.rb +12 -0
- data/lib/cabeza-de-termo/json-spec/instantiators/negated-expectation-instantiator.rb +20 -0
- data/lib/cabeza-de-termo/json-spec/instantiators/patial-application-instantiator.rb +26 -0
- data/lib/cabeza-de-termo/json-spec/json-spec.rb +2 -0
- data/lib/cabeza-de-termo/json-spec/message-formatters/block-message-formatter.rb +15 -0
- data/lib/cabeza-de-termo/json-spec/message-formatters/erb-message-formatter.rb +60 -0
- data/lib/cabeza-de-termo/json-spec/message-formatters/message-formatter.rb +9 -0
- data/lib/cabeza-de-termo/json-spec/metaprogramming/message-send.rb +37 -0
- data/lib/cabeza-de-termo/json-spec/metaprogramming/message.rb +37 -0
- data/lib/cabeza-de-termo/json-spec/metaprogramming/object-method.rb +14 -0
- data/lib/cabeza-de-termo/json-spec/modifiers/can-be-absent-modifier.rb +13 -0
- data/lib/cabeza-de-termo/json-spec/modifiers/can-be-null-modifier.rb +13 -0
- data/lib/cabeza-de-termo/json-spec/modifiers/expression-modifier.rb +9 -0
- data/lib/cabeza-de-termo/json-spec/modifiers/modifier-composite.rb +27 -0
- data/lib/cabeza-de-termo/json-spec/signals/signal.rb +6 -0
- data/lib/cabeza-de-termo/json-spec/signals/skip-branch-signal.rb +8 -0
- data/lib/cabeza-de-termo/json-spec/utilities/bind.rb +20 -0
- data/lib/cabeza-de-termo/json-spec/utilities/range.rb +70 -0
- data/lib/cabeza-de-termo/json-spec/value-holders/accessors-chain.rb +27 -0
- data/lib/cabeza-de-termo/json-spec/value-holders/missing-value.rb +21 -0
- data/lib/cabeza-de-termo/json-spec/value-holders/value-holder.rb +135 -0
- data/lib/cabeza-de-termo/json-spec/version.rb +5 -0
- data/lib/cabeza-de-termo/json-spec/walkers/expression-walker.rb +66 -0
- data/lib/cabeza-de-termo/json-spec/walkers/json-expectations-runner.rb +214 -0
- data/lib/cabeza-de-termo/json-spec/walkers/json-expression-explainer.rb +183 -0
- data/lib/cabeza-de-termo/json-spec/walkers/reporter/expectation-report.rb +63 -0
- data/lib/cabeza-de-termo/json-spec/walkers/reporter/json-expectations-reporter.rb +111 -0
- data/lib/cabeza-de-termo/json-spec/walkers/validator/json-validator-error.rb +29 -0
- data/lib/cabeza-de-termo/json-spec/walkers/validator/json-validator.rb +133 -0
- data/lib/cabeza-de-termo/json-spec/walkers/value-holders-stack-behaviour.rb +57 -0
- metadata +242 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative "expectation-definition"
|
|
2
|
+
require "cabeza-de-termo/json-spec/instantiators/patial-application-instantiator"
|
|
3
|
+
|
|
4
|
+
module CabezaDeTermo
|
|
5
|
+
module JsonSpec
|
|
6
|
+
class ExpectingExpectationDefinition < ExpectationDefinition
|
|
7
|
+
def expect(expectation_method, *args)
|
|
8
|
+
@expectation_instantiator = expectation_instantiator_for(expectation_method)
|
|
9
|
+
@args = args
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def expectation_instantiator()
|
|
13
|
+
PartialApplicationInstantiator.new(@expectation_instantiator, @args)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require_relative "expectation-definition"
|
|
2
|
+
require "cabeza-de-termo/json-spec/instantiators/negated-expectation-instantiator"
|
|
3
|
+
|
|
4
|
+
module CabezaDeTermo
|
|
5
|
+
module JsonSpec
|
|
6
|
+
class NegatingExpectationDefinition < ExpectationDefinition
|
|
7
|
+
def negate(expectation_method)
|
|
8
|
+
@expectation_instantiator = expectation_instantiator_for(expectation_method)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def expectation_instantiator()
|
|
12
|
+
NegatedExpectationInstantiator.new(@expectation_instantiator)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require_relative "modifier-builders/modifiers-definition-builder"
|
|
2
|
+
require_relative "expectation-builders/expectations-definition-builder"
|
|
3
|
+
|
|
4
|
+
module CabezaDeTermo
|
|
5
|
+
module JsonSpec
|
|
6
|
+
class ExpectationLibraryDefinitionBuilder
|
|
7
|
+
# Initializing
|
|
8
|
+
|
|
9
|
+
def initialize(expectations_library)
|
|
10
|
+
@expectations_library = expectations_library
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Accessing
|
|
14
|
+
|
|
15
|
+
def expectations_library
|
|
16
|
+
@expectations_library
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def expectations(&block)
|
|
20
|
+
ExpectationsDefinitionBuilder.for(expectations_library, &block)
|
|
21
|
+
self
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def modifiers(&block)
|
|
25
|
+
ModifiersDefinitionBuilder.for(expectations_library, &block)
|
|
26
|
+
self
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def default_expectations(&block)
|
|
30
|
+
Bind.evaluation of: block, to: expectations_library.default_expectations
|
|
31
|
+
self
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require_relative "modifier-definition"
|
|
2
|
+
require "cabeza-de-termo/json-spec/instantiators/modifier-composite-instantiator"
|
|
3
|
+
require "cabeza-de-termo/json-spec/instantiators/patial-application-instantiator"
|
|
4
|
+
|
|
5
|
+
module CabezaDeTermo
|
|
6
|
+
module JsonSpec
|
|
7
|
+
class ComposingModifiersDefinition < ModifierDefinition
|
|
8
|
+
def initialize(expectations_library)
|
|
9
|
+
super(expectations_library)
|
|
10
|
+
|
|
11
|
+
@modifier_instantiators = []
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def with(modifier_method, *args)
|
|
15
|
+
@modifier_instantiators << PartialApplicationInstantiator.new(modifier_instantiator_for(modifier_method), args)
|
|
16
|
+
self
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def modifier_instantiator
|
|
20
|
+
ModifierCompositeInstantiator.with_all(@modifier_instantiators)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def modifier_instantiator_for(method_name)
|
|
24
|
+
@expectations_library.modifier_instantiator_for(method_name)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
require_relative "class-modifier-definition"
|
|
2
|
+
require_relative "composing-modifiers-definition"
|
|
3
|
+
|
|
4
|
+
module CabezaDeTermo
|
|
5
|
+
module JsonSpec
|
|
6
|
+
class ModifiersDefinitionBuilder
|
|
7
|
+
def self.for(expectations_library, &block)
|
|
8
|
+
new(expectations_library, &block)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def initialize(expectations_library, &block)
|
|
12
|
+
@expectations_library = expectations_library
|
|
13
|
+
|
|
14
|
+
Bind.evaluation of: block, to: self
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Accessing
|
|
18
|
+
|
|
19
|
+
def expectations_library
|
|
20
|
+
@expectations_library
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def method_name
|
|
24
|
+
@method_name
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def definition
|
|
28
|
+
@definition
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Building definition
|
|
32
|
+
|
|
33
|
+
def reset_current_definition
|
|
34
|
+
@method_name = nil
|
|
35
|
+
@definition = nil
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def define(method_name, &block)
|
|
39
|
+
@method_name = method_name.to_sym
|
|
40
|
+
|
|
41
|
+
block.call
|
|
42
|
+
|
|
43
|
+
define_modifier_in_library
|
|
44
|
+
reset_current_definition
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def with_class(klass)
|
|
48
|
+
@definition = ClassModifierDefinition.new(expectations_library)
|
|
49
|
+
@definition.klass klass
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def composing(modifier)
|
|
53
|
+
@definition = ComposingModifiersDefinition.new(expectations_library)
|
|
54
|
+
@definition.with modifier
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def define_modifier_in_library
|
|
58
|
+
expectations_library.define_modifier(method_name, modifier_instantiator)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def modifier_instantiator
|
|
62
|
+
definition.modifier_instantiator
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Messages delegation
|
|
66
|
+
|
|
67
|
+
# Delegate every method to the current definition builder
|
|
68
|
+
def method_missing(method_name, *args, &block)
|
|
69
|
+
@definition.send(method_name, *args, &block)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
require_relative "initializers/default-library-initializer"
|
|
2
|
+
require_relative "messages/expectation-messages-mapping"
|
|
3
|
+
require_relative "default-expectations/default-expectations-mapping"
|
|
4
|
+
|
|
5
|
+
require_relative "definition-builders/expectation-library-definition-builder"
|
|
6
|
+
|
|
7
|
+
require "cabeza-de-termo/json-spec/errors/expectation-not-found-error"
|
|
8
|
+
require "cabeza-de-termo/json-spec/errors/modifier-not-found-error"
|
|
9
|
+
|
|
10
|
+
module CabezaDeTermo
|
|
11
|
+
module JsonSpec
|
|
12
|
+
class ExpectationsLibrary
|
|
13
|
+
@current = nil
|
|
14
|
+
@default_library_initializer = nil
|
|
15
|
+
|
|
16
|
+
# Instance accessing
|
|
17
|
+
|
|
18
|
+
def self.current()
|
|
19
|
+
@current = new_default if @current.nil?
|
|
20
|
+
@current
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.set_current(expectations_library)
|
|
24
|
+
to_be_replaced = current
|
|
25
|
+
@current = expectations_library
|
|
26
|
+
|
|
27
|
+
to_be_replaced
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.define(&block)
|
|
31
|
+
current.define(&block)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.reset()
|
|
35
|
+
@current = nil
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Initializing
|
|
39
|
+
|
|
40
|
+
def self.default_library_initializer()
|
|
41
|
+
set_default_library_initializer(new_default_library_initializer) if @default_library_initializer.nil?
|
|
42
|
+
|
|
43
|
+
@default_library_initializer
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.set_default_library_initializer(library_initializer)
|
|
47
|
+
to_be_replaced = @default_library_initializer
|
|
48
|
+
@default_library_initializer = library_initializer
|
|
49
|
+
|
|
50
|
+
to_be_replaced
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.new_default_library_initializer()
|
|
54
|
+
DefaultLibraryInitializer.new
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.new_default()
|
|
58
|
+
default_library_initializer.new_library
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Instance methods
|
|
62
|
+
|
|
63
|
+
def initialize()
|
|
64
|
+
@expectations = {}
|
|
65
|
+
@modifiers = {}
|
|
66
|
+
@expectation_messages_mapping = new_expectations_messages_mapping
|
|
67
|
+
@default_expectations_mapping = new_default_expectations_mapping
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Accessing
|
|
71
|
+
|
|
72
|
+
def default_expectations()
|
|
73
|
+
@default_expectations_mapping
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Defining
|
|
77
|
+
|
|
78
|
+
def define(&block)
|
|
79
|
+
Bind.evaluation of: block, to: ExpectationLibraryDefinitionBuilder.new(self)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Expectation messages
|
|
83
|
+
|
|
84
|
+
def has_message_formatter_for?(expectation_method)
|
|
85
|
+
@expectation_messages_mapping.has_message_formatter_for?(expectation_method)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def message_formatter_for(expectation_method)
|
|
89
|
+
@expectation_messages_mapping.message_formatter_for(expectation_method)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def define_message_formatter_for(expectation_method, message_block)
|
|
93
|
+
@expectation_messages_mapping.define_message_formatter_for(expectation_method, message_block)
|
|
94
|
+
|
|
95
|
+
self
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Expectations
|
|
99
|
+
|
|
100
|
+
def define_expectation(expectation_method, expectation_instantiator)
|
|
101
|
+
@expectations[expectation_method.to_sym] = expectation_instantiator
|
|
102
|
+
self
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def has_expectation_for?(expectation_method)
|
|
106
|
+
@expectations.key?(expectation_method.to_sym)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def expectation_instantiator_for(expectation_method)
|
|
110
|
+
return @expectations[expectation_method.to_sym] if has_expectation_for?(expectation_method)
|
|
111
|
+
raise ExpectationNotFoundError.new("The Expectation method '#{expectation_method}' was not found.")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def new_expectation_from_message(message)
|
|
115
|
+
expectation_instantiator_for( message.method_name ).new( *message.args )
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Modifiers
|
|
119
|
+
|
|
120
|
+
def define_modifier(expectation_method, modifier_instantiator)
|
|
121
|
+
@modifiers[expectation_method.to_sym] = modifier_instantiator
|
|
122
|
+
|
|
123
|
+
self
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def has_modifier_for?(expectation_method)
|
|
127
|
+
@modifiers.key?(expectation_method.to_sym)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def modifier_instantiator_for(method_name)
|
|
131
|
+
return @modifiers[method_name.to_sym] if has_modifier_for?(method_name)
|
|
132
|
+
raise ModifierNotFoundError.new("The modifier method '#{method_name}' was not found.")
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def new_modifier_from_message(message)
|
|
136
|
+
modifier_instantiator_for(message.method_name).new( *message.args )
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Helpers
|
|
140
|
+
|
|
141
|
+
def new_expectations_messages_mapping()
|
|
142
|
+
ExpectationMessagesMapping.new
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def new_default_expectations_mapping()
|
|
146
|
+
DefaultExpectationsMapping.new
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
data/lib/cabeza-de-termo/json-spec/expectations-library/initializers/default-library-initializer.rb
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
require_relative "library-initializer"
|
|
2
|
+
|
|
3
|
+
require "cabeza-de-termo/json-spec/expectations/is-scalar-expectation"
|
|
4
|
+
require "cabeza-de-termo/json-spec/expectations/is-url-expectation"
|
|
5
|
+
require "cabeza-de-termo/json-spec/expectations/is-email-expectation"
|
|
6
|
+
|
|
7
|
+
require "cabeza-de-termo/json-spec/modifiers/can-be-absent-modifier"
|
|
8
|
+
require "cabeza-de-termo/json-spec/modifiers/can-be-null-modifier"
|
|
9
|
+
|
|
10
|
+
module CabezaDeTermo
|
|
11
|
+
module JsonSpec
|
|
12
|
+
class DefaultLibraryInitializer < LibraryInitializer
|
|
13
|
+
def new_library()
|
|
14
|
+
library = ExpectationsLibrary.new
|
|
15
|
+
define_library(library)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def define_library(library)
|
|
19
|
+
library.define do
|
|
20
|
+
|
|
21
|
+
# Define expectations
|
|
22
|
+
expectations do
|
|
23
|
+
define :to_exist do
|
|
24
|
+
with_block { |value_holder, expected_value| value_holder.not_missing_value? }
|
|
25
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' exists."
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
define :to_be_absent do
|
|
29
|
+
negating :to_exist
|
|
30
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is absent."
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
define :to_be_kind_of do
|
|
34
|
+
with_block { |value_holder, expected_class| value_holder.value.kind_of? expected_class }
|
|
35
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is a <%= expectation.args[0] %>."
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
define :to_be_true do
|
|
39
|
+
expecting :to_be_kind_of, ::TrueClass
|
|
40
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is true."
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
define :to_be_false do
|
|
44
|
+
expecting :to_be_kind_of, ::FalseClass
|
|
45
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is false."
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
define :to_be_boolean do
|
|
49
|
+
expecting_any_of :to_be_true
|
|
50
|
+
or_also :to_be_true
|
|
51
|
+
|
|
52
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is a boolean."
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
define :to_be_float do
|
|
56
|
+
expecting :to_be_kind_of, ::Float
|
|
57
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is a float."
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
define :to_be_integer do
|
|
61
|
+
expecting :to_be_kind_of, ::Integer
|
|
62
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is an integer."
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
define :to_be_list do
|
|
66
|
+
expecting :to_be_kind_of, ::Array
|
|
67
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is a list."
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
define :to_be_number do
|
|
71
|
+
expecting :to_be_kind_of, ::Numeric
|
|
72
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is a number."
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
define :to_be_scalar do
|
|
76
|
+
with_class IsScalarExpectation
|
|
77
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is a scalar."
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
define :to_be_object do
|
|
81
|
+
expecting :to_be_kind_of, ::Hash
|
|
82
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is an object."
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
define :to_be_string do
|
|
86
|
+
expecting :to_be_kind_of, ::String
|
|
87
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is a string."
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
define :to_be_null do
|
|
91
|
+
with_block { |value_holder, expected_value| value_holder.value.nil? }
|
|
92
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is null."
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
define :not_null do
|
|
96
|
+
negating :to_be_null
|
|
97
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is not null."
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
define :to_be_defined do
|
|
101
|
+
expecting_all_of :to_exist
|
|
102
|
+
and_also :not_null
|
|
103
|
+
|
|
104
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is defined."
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
define :not_defined do
|
|
108
|
+
negating :to_be_defined
|
|
109
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is not defined."
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
define :to_be_empty do
|
|
113
|
+
with_block { |value_holder, expected_value| value_holder.is_empty? }
|
|
114
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is empty."
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
define :not_empty do
|
|
118
|
+
negating :to_be_empty
|
|
119
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is not empty."
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
define :_to_be_blank do
|
|
123
|
+
with_block { |value_holder, expected_value| value_holder.value.strip.empty? }
|
|
124
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is blank."
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
define :to_be_blank do
|
|
128
|
+
expecting_all_of :to_be_string
|
|
129
|
+
and_also :_to_be_blank
|
|
130
|
+
|
|
131
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is blank."
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
define :not_blank do
|
|
135
|
+
negating :to_be_blank
|
|
136
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is not blank."
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
define :to_be_equal_to do
|
|
140
|
+
with_block { |value_holder, expected_value| expected_value == value_holder.value }
|
|
141
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is equal to '<%= expectation.args[0] %>'."
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
define :not_equal_to do
|
|
145
|
+
negating :to_be_equal_to
|
|
146
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is not equal to '<%= expectation.args[0] %>'."
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
define :_to_match do
|
|
150
|
+
with_block do |value_holder, expected_regex|
|
|
151
|
+
expected_regex.match(value_holder.value) != nil
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' matches '<%= expectation.args[0] %>'."
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
define :to_match do
|
|
158
|
+
expecting_all_of :to_be_string
|
|
159
|
+
and_also :_to_match
|
|
160
|
+
|
|
161
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' matches '<%= expectation.child_expectations[1].args[0] %>'."
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
define :not_to_match do
|
|
165
|
+
negating :to_match
|
|
166
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' does not match '<%= expectation.child_expectations[1].args[0] %>'."
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
define :to_be_string_as_integer do
|
|
170
|
+
expecting :to_match, /^[-+]?\d+$/
|
|
171
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' has a valid integer format."
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
define :to_be_string_as_float do
|
|
175
|
+
expecting :to_match, /^[-+]?[0-9]*\.?[0-9]+$/
|
|
176
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' has a valid float format."
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
define :to_be_in do
|
|
180
|
+
with_block do |value_holder, possible_values|
|
|
181
|
+
possible_values.include?( value_holder.value )
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is equal to any of <%= expectation.args[0] %>."
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
define :not_in do
|
|
188
|
+
negating :to_be_in
|
|
189
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is not equal to any of <%= expectation.args[0] %>."
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
define :to_be_email do
|
|
193
|
+
with_class IsEmailExpectation
|
|
194
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is an email."
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
define :to_be_url do
|
|
198
|
+
with_class IsUrlExpectation
|
|
199
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is an url."
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
define :to_be_in_range do
|
|
203
|
+
with_block do |value_holder, expectedRange|
|
|
204
|
+
expectedRange.includes?( value_holder.value )
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is in range <%= expectation.args[0] %>."
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
define :not_in_range do
|
|
211
|
+
negating :to_be_in_range
|
|
212
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is not in range <%= expectation.args[0] %>."
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
define :to_be_between do
|
|
216
|
+
with_block do |value_holder, min, max|
|
|
217
|
+
Range::new_from('[', min, max, ']').includes?( value_holder.value )
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is between <%= Range.new(expectation.args[0], expectation.args[1]).to_s %>."
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
define :not_between do
|
|
224
|
+
negating :to_be_between
|
|
225
|
+
message "Failed asserting that the field '<%= field %>' with value = '<%= format value %>' is not between <%= Range.new(expectation.args[0], expectation.args[1]).to_s %>."
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# Define modifiers
|
|
230
|
+
modifiers do
|
|
231
|
+
define :can_be_absent do
|
|
232
|
+
with_class CanBeAbsentModifier
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
define :can_be_null do
|
|
236
|
+
with_class CanBeNullModifier
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
define :can_be_undefined do
|
|
240
|
+
composing :can_be_null
|
|
241
|
+
with :can_be_absent
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
# Define default expectations
|
|
246
|
+
default_expectations do
|
|
247
|
+
for_every_object do
|
|
248
|
+
to_be_object
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
for_every_list do
|
|
252
|
+
to_be_list
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
for_every_scalar do
|
|
256
|
+
to_be_scalar
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
library
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
end
|