restspec 0.2.6 → 0.3.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
  SHA1:
3
- metadata.gz: d1403eca3180dfa8f249ce3fead22bb161ff7d20
4
- data.tar.gz: d0570bf19544f321eb35109802e8366d87cbc466
3
+ metadata.gz: 4d41fb030fd5379b0d4b7ebfa5b11f4ca75bdfbe
4
+ data.tar.gz: c911b0e8737d4101434572e183124c1cc556d694
5
5
  SHA512:
6
- metadata.gz: beff9885cf2d3aa080a65c65eb93926bb69f8c61d2c48fe93bfdb5b1a3e85b9ee7ff8a4e0da032d55b1a7bd423810415532247283c285b5dc0ce3891e4c67950
7
- data.tar.gz: a8181a79efd09bf428094c34ac7f5c184cab60c2222e897f1416768b25e1e7ef80a15830dbc9d76f601602223add6384e19abb24c63a1cb575797c9f490513c3
6
+ metadata.gz: 12f39219a3aab6c2d7bbddafc5c13ef0d61ce689d34305363a46fbb9d75134c790f4f1ddd0cf4bdd62b988c43d485b881e9e2ca2cd8641ca862e438927584b4a
7
+ data.tar.gz: 4517a6136fe97b44156ece0da456fccc122be6bfcaa9fa04217ba255ced88709ef69df7dbaa634b2d63bdea5fd175743ebd0e173c4dee0e4751adf79dd0b2109
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ~/dev/projects/ruby/restspec
3
3
  specs:
4
- restspec (0.2.4)
4
+ restspec (0.2.6)
5
5
  activesupport (~> 4.0)
6
6
  faker (~> 1.4)
7
7
  hashie (~> 3.3)
@@ -24,6 +24,11 @@ module Restspec
24
24
  # @raise NoObjectError if parameter passed is not a hash.
25
25
  def check!(object)
26
26
  raise NoObjectError.new(object) unless object.is_a?(Hash)
27
+ raise NoRootFoundError.new(object, schema) if schema.root? && !object.has_key?(schema.root_name)
28
+
29
+ if schema.root?
30
+ object = object.fetch(schema.root_name)
31
+ end
27
32
 
28
33
  schema.attributes.each do |_, attribute|
29
34
  if attribute.can_be_checked?
@@ -129,6 +134,19 @@ module Restspec
129
134
  end
130
135
  end
131
136
 
137
+ class NoRootFoundError < StandardError
138
+ attr_accessor :object, :schema
139
+
140
+ def initialize(object, schema)
141
+ self.object = object
142
+ self.schema = schema
143
+ end
144
+
145
+ def to_s
146
+ "The object #{object}:#{object.class} does not contain a root called #{schema.root_name}"
147
+ end
148
+ end
149
+
132
150
  class NoObjectError < StandardError
133
151
  attr_accessor :object
134
152
 
@@ -11,16 +11,17 @@ module Restspec
11
11
  # instance for further definitions.
12
12
  #
13
13
  # @example
14
- # schema :book do
14
+ # schema :book, root: true do
15
15
  # puts self.class # SingleSchemaDSL
16
16
  # puts self.schema.class # Schema
17
17
  # end
18
18
  #
19
19
  # @param name {Symbol} the schema's name
20
+ # @param options {Hash} a set of options for {Schema#initialize}
20
21
  # @param definition A block that will be executed inside the context
21
22
  # of a {SingleSchemaDSL} object.
22
- def schema(name, &definition)
23
- dsl = SingleSchemaDSL.new(name, mixins)
23
+ def schema(name, options = {}, &definition)
24
+ dsl = SingleSchemaDSL.new(name, options, mixins)
24
25
  dsl.instance_eval(&definition)
25
26
  Restspec::SchemaStore.store(dsl.schema)
26
27
  end
@@ -66,8 +67,8 @@ module Restspec
66
67
  # @return {Schema} the current schema
67
68
  attr_reader :schema
68
69
 
69
- def initialize(name, mixins = {})
70
- self.schema = Schema.new(name)
70
+ def initialize(name, options = {}, mixins = {})
71
+ self.schema = Schema.new(name, options)
71
72
  self.mixins = mixins
72
73
  end
73
74
 
@@ -10,15 +10,22 @@ module Restspec
10
10
  # The set of attributes that conforms the schema.
11
11
  attr_reader :attributes
12
12
 
13
+ # The root raw value
14
+ attr_reader :root
15
+
13
16
  # TODO: Document
14
17
  attr_accessor :intention
15
18
  attr_accessor :original_schema
16
19
 
17
20
  # @param name [Symbol] The name of the schema
21
+ # @param options [Hash] Some options:
22
+ # - root: If the schema should have a root `{ schema: }` around the object. If this
23
+ # attribute is a symbol or string, that will be the schema root to use.
18
24
  # @return a new {Restspec::Schema::Schema Schema} object
19
- def initialize(name)
25
+ def initialize(name, options = {})
20
26
  self.name = name
21
27
  self.attributes = {}
28
+ self.root = options[:root]
22
29
  end
23
30
 
24
31
  # @param without [Array] An array of attributes that should be removed from the schema.
@@ -37,9 +44,19 @@ module Restspec
37
44
  end
38
45
  end
39
46
 
47
+ #
48
+ # @return [true, false] if the schema must include a root.
49
+ def root?
50
+ !!root
51
+ end
52
+
53
+ def root_name
54
+ root == true ? name.to_sym : root.to_sym
55
+ end
56
+
40
57
  private
41
58
 
42
- attr_writer :name, :attributes
59
+ attr_writer :name, :attributes, :root
43
60
  end
44
61
  end
45
62
  end
@@ -15,9 +15,15 @@ module Restspec
15
15
  # It returns the generated example.
16
16
  # @return [Restspec::Values::SuperHash] generated example.
17
17
  def value
18
- attributes.inject({}) do |sample, (_, attribute)|
18
+ example_attributes = attributes.inject({}) do |sample, (_, attribute)|
19
19
  sample.merge(attribute.name => AttributeExample.new(attribute).value)
20
20
  end.merge(extensions)
21
+
22
+ if schema.root?
23
+ wrap_in_root(example_attributes)
24
+ else
25
+ example_attributes
26
+ end
21
27
  end
22
28
 
23
29
  private
@@ -25,6 +31,10 @@ module Restspec
25
31
  def attributes
26
32
  schema.attributes_for_intention
27
33
  end
34
+
35
+ def wrap_in_root(hash)
36
+ { schema.root_name => hash }
37
+ end
28
38
  end
29
39
  end
30
40
  end
@@ -1,3 +1,3 @@
1
1
  module Restspec
2
- VERSION = "0.2.6"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -3,8 +3,9 @@ require 'spec_helper'
3
3
  include Restspec::Schema
4
4
 
5
5
  describe Checker do
6
+ let(:options) { {} }
6
7
  let(:schema) do
7
- Schema.new(:product).tap do |schema|
8
+ Schema.new(:product, options).tap do |schema|
8
9
  schema.attributes[:name] = Attribute.new(:name, Types::StringType.new)
9
10
  end
10
11
  end
@@ -20,6 +21,26 @@ describe Checker do
20
21
  end
21
22
  end
22
23
 
24
+ context 'when the schema is root?' do
25
+ let(:options) { { root: 'monkey' } }
26
+
27
+ context 'when no root is present' do
28
+ it 'raises a Checker::NoRootFoundError' do
29
+ expect do
30
+ checker.check!(age: 10)
31
+ end.to raise_error(Checker::NoRootFoundError, /monkey/)
32
+ end
33
+ end
34
+
35
+ context 'when the root is present' do
36
+ it 'does not raises a Checker::NoRootFoundError' do
37
+ expect do
38
+ checker.check!(monkey: { name: 'Apu' })
39
+ end.to_not raise_error
40
+ end
41
+ end
42
+ end
43
+
23
44
  context 'when no attribute is present' do
24
45
  it 'raises a Checker::NoAttributeError' do
25
46
  expect do
@@ -7,12 +7,10 @@ describe DSL do
7
7
 
8
8
  describe '#schema' do
9
9
  let(:single_dsl) { double }
10
- let(:schema) { double(name: 'name') }
10
+ let(:schema) { Schema.new(name: 'name') }
11
11
 
12
12
  before do
13
- allow(SingleSchemaDSL).to receive(:new).and_return(single_dsl)
14
- allow(single_dsl).to receive(:instance_eval).and_return(single_dsl)
15
- allow(single_dsl).to receive(:schema).and_return(schema)
13
+ allow(SingleSchemaDSL).to receive(:new).and_call_original
16
14
  end
17
15
 
18
16
  it 'creates a SingleSchemaDSL with the given name' do
@@ -24,6 +22,18 @@ describe DSL do
24
22
  dsl.schema('name') { }
25
23
  expect(Restspec::SchemaStore.get('name')).to be_present
26
24
  end
25
+
26
+ it 'stores a schema with the root attribute set to false' do
27
+ dsl.schema('dog') { }
28
+ expect(Restspec::SchemaStore.get('name').root?).to eq(false)
29
+ end
30
+
31
+ context 'with the root option set to true' do
32
+ it 'creates a schema with the root option set to true' do
33
+ dsl.schema('dog', root: true) { }
34
+ expect(Restspec::SchemaStore.get('dog').root?).to eq(true)
35
+ end
36
+ end
27
37
  end
28
38
  end
29
39
 
@@ -54,7 +64,7 @@ describe SingleSchemaDSL do
54
64
 
55
65
  describe '#include_attributes' do
56
66
  let(:main_dsl) { DSL.new }
57
- let(:schema_dsl) { SingleSchemaDSL.new(:name, main_dsl.send(:mixins)) }
67
+ let(:schema_dsl) { SingleSchemaDSL.new(:name, {}, main_dsl.send(:mixins)) }
58
68
 
59
69
  before do
60
70
  main_dsl.mixin :test_mixin do
@@ -15,6 +15,28 @@ describe SchemaExample do
15
15
  schema.attributes['age'] = Attribute.new(:age, integer_type)
16
16
  end
17
17
 
18
+ describe 'root cases' do
19
+ let(:schema_example) { SchemaExample.new(schema) }
20
+
21
+ context 'with a schema that root? with a value' do
22
+ let(:schema) { Schema.new(:dog, root: 'monkey') }
23
+
24
+ it 'generates an example wrapped in the root value' do
25
+ expect(schema_example.value).to have_key(:monkey)
26
+ expect(schema_example.value[:monkey]).to have_key(:name)
27
+ expect(schema_example.value[:monkey]).to have_key(:age)
28
+ end
29
+ end
30
+
31
+ context 'with a schema that root? with true' do
32
+ let(:schema) { Schema.new(:dog, root: true) }
33
+
34
+ it 'generates an example wrapped in the schema name' do
35
+ expect(schema_example.value).to have_key(:dog)
36
+ end
37
+ end
38
+ end
39
+
18
40
  context 'without extensions' do
19
41
  let(:schema_example) { SchemaExample.new(schema) }
20
42
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - juliogarciag
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-02 00:00:00.000000000 Z
11
+ date: 2015-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake