restspec 0.2.6 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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