obvious 0.0.10 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4bf4de686eee48c524a3037620e21a154db8c75fce3ff8db780afc25dc376202
4
+ data.tar.gz: c4930e55f1420a9b40996fc042052f267548b3f6017055ad69355c44bad28f7e
5
+ SHA512:
6
+ metadata.gz: 377a83eba55eeadeb63bdadd1a12f72a81507b5d029486add3ffba65fd81c4de929936e435bc73ac0816185bab6dff2a0aa1b4ecfcf527fa36d4dbdc13abaf81
7
+ data.tar.gz: 6f7a51c4037baa95be253c62a801f1c8204e662b089bc45bd7f6db1df94f6c39d1130625fb745a7c558111662c5baeaf59372817a077f17d14faf7af2ce0b394
@@ -0,0 +1,19 @@
1
+ name: obvious
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ unit-tests:
7
+ strategy:
8
+ matrix:
9
+ ruby: [ 2.7, '3.0', 3.1 ]
10
+ name: Ruby ${{ matrix.ruby }} unit tests
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v2
14
+ - uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: ${{ matrix.ruby }}
17
+ bundler-cache: true
18
+ - run: |
19
+ bundle exec rspec
data/.gitignore CHANGED
@@ -4,7 +4,6 @@
4
4
  .bundle
5
5
  .config
6
6
  .yardoc
7
- Gemfile.lock
8
7
  InstalledFiles
9
8
  _yardoc
10
9
  coverage
data/Gemfile.lock ADDED
@@ -0,0 +1,34 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ obvious (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.5.0)
10
+ rspec (3.10.0)
11
+ rspec-core (~> 3.10.0)
12
+ rspec-expectations (~> 3.10.0)
13
+ rspec-mocks (~> 3.10.0)
14
+ rspec-core (3.10.1)
15
+ rspec-support (~> 3.10.0)
16
+ rspec-expectations (3.10.1)
17
+ diff-lcs (>= 1.2.0, < 2.0)
18
+ rspec-support (~> 3.10.0)
19
+ rspec-mocks (3.10.2)
20
+ diff-lcs (>= 1.2.0, < 2.0)
21
+ rspec-support (~> 3.10.0)
22
+ rspec-support (3.10.3)
23
+
24
+ PLATFORMS
25
+ ruby
26
+ x86_64-darwin-20
27
+ x86_64-linux
28
+
29
+ DEPENDENCIES
30
+ obvious!
31
+ rspec
32
+
33
+ BUNDLED WITH
34
+ 2.3.4
data/README.md CHANGED
@@ -6,6 +6,16 @@ independent of the app logic itself.
6
6
 
7
7
  You can get a full explanation of Obvious at http://obvious.retromocha.com
8
8
 
9
+
10
+ # Notice:
11
+
12
+ This project is no longer under active development is only made available for historical purposes.
13
+
14
+ Right now [Brian is working on a little of this](http://brianknapp.me/now/) and [Shawn is working on a little of that](http://shawnbaden.com/now/).
15
+
16
+ Most of our spare energy goes to the [Unbranded Pocket Notebook](https://www.amazon.com/dp/B00ZGE1914/) and the [Unbranded Pocket Journal](https://www.amazon.com/dp/B016LB2XYW).
17
+
18
+
9
19
  ## Installation
10
20
 
11
21
  Add this line to your application's Gemfile:
@@ -35,11 +45,3 @@ in the Obvious Status example app: https://github.com/RetroMocha/obvious_status.
35
45
  Currently the footprint of the Obvious library is quite small. The most important things defined so far are the Contract class
36
46
  and the Hash.has_shape? method. The rest of what makes an Obvious app interesting is the structure itself, not the libraries Obvious
37
47
  provides.
38
-
39
- ## Contributing
40
-
41
- 1. Fork it
42
- 2. Create your feature branch (`git checkout -b my-new-feature`)
43
- 3. Commit your changes (`git commit -am 'Add some feature'`)
44
- 4. Push to the branch (`git push origin my-new-feature`)
45
- 5. Create new Pull Request
@@ -146,7 +146,7 @@ end
146
146
 
147
147
  output = %Q{require 'obvious'
148
148
 
149
- class #{k}Contract < Contract
149
+ class #{k}Contract < Obvious::Contract
150
150
  #{contract_defs}
151
151
  end
152
152
  }
@@ -1,157 +1,161 @@
1
- class Contract
2
- @@disable_override = false
1
+ module Obvious
3
2
 
4
- # Provides a default empty array for method_added
5
- # Overriden by self.contracts
6
- def self.contract_list
7
- []
8
- end
3
+ class Contract
4
+ @@disable_override = false
9
5
 
10
- # Public: Sets the contracts
11
- #
12
- # contracts - a list of contracts, as String or as Symbols.
13
- #
14
- # Examples
15
- #
16
- # class FooJackContract < Contract
17
- # contracts :save, :get, :list
18
- #
19
- # end
20
- #
21
- # Returns Nothing.
22
- def self.contracts *contracts
23
- singleton_class.send :define_method, :contract_list do
24
- contracts
6
+ # Provides a default empty array for method_added
7
+ # Overriden by self.contracts
8
+ def self.contract_list
9
+ []
25
10
  end
26
- end
27
11
 
28
- # Public: Defines a contract for a method
29
- #
30
- # method - a symbol representing the method name
31
- # contract - a hash with the keys :input and :output holding the respective shapes.
32
- #
33
- # Examples
34
- #
35
- # class FooJackContract < Contract
36
- #
37
- # contract_for :save, {
38
- # :input => Foo.shape,
39
- # :output => Foo.shape,
40
- # }
41
- #
42
- # end
43
- #
44
- def self.contract_for method, contract
45
- method_alias = "#{method}_alias".to_sym
46
- method_contract = "#{method}_contract".to_sym
47
-
48
- define_method method_contract do |*args|
49
- input = args[0]
50
- call_method method_alias, input, contract[:input], contract[:output]
51
- end
52
-
53
- contracts( *contract_list, method )
54
- end
55
-
56
- # This method will move methods defined in @contracts into new methods.
57
- # Each entry in @contracts will cause the method with the same name to
58
- # become method_name_alias and for the original method to point to
59
- # method_name_contract.
60
- def self.method_added name
61
- unless @@disable_override
62
- self.contract_list.each do |method|
63
- if name == method.to_sym
64
- method_alias = "#{method}_alias".to_sym
65
- method_contract = "#{method}_contract".to_sym
66
-
67
- @@disable_override = true # to stop the new build method
68
- self.send :alias_method, method_alias, name
69
- self.send :remove_method, name
70
- self.send :alias_method, name, method_contract
71
-
72
- @@disable_override = false
73
- else
74
- # puts self.inspect
75
- # puts "defining other method #{name}"
76
- end
12
+ # Public: Sets the contracts
13
+ #
14
+ # contracts - a list of contracts, as String or as Symbols.
15
+ #
16
+ # Examples
17
+ #
18
+ # class FooJackContract < Contract
19
+ # contracts :save, :get, :list
20
+ #
21
+ # end
22
+ #
23
+ # Returns Nothing.
24
+ def self.contracts *contracts
25
+ singleton_class.send :define_method, :contract_list do
26
+ contracts
77
27
  end
78
28
  end
79
- end
80
29
 
81
- # This method is used as a shorthand to mak the contract method calling pattern more DRY
82
- # It starts by checking if you are sending in input and if so will check the input shape for
83
- # errors. If no errors are found it calls the method via the passed in symbol(method).
84
- #
85
- # Output checking is more complicated because of the types of output we check for. Nil is
86
- # never valid output. If we pass in the output shape of true, that means we are looking for
87
- # result to be the object True. If the output shape is an array, that is actually a shorthand
88
- # for telling our output check to look at the output as an array and compare it to the shape
89
- # stored in output_shape[0]. If we pass in the symbol :true_false it means we are looking for
90
- # the result to be either true or false. The default case will just check if result has the shape
91
- # of the output_shape.
92
- def call_method method, input, input_shape, output_shape
93
- if input != nil && input_shape != nil
94
- has_shape, error_field = input.has_shape? input_shape, true
95
- unless has_shape
96
- raise ContractInputError, "incorrect input data format field #{error_field}"
30
+ # Public: Defines a contract for a method
31
+ #
32
+ # method - a symbol representing the method name
33
+ # contract - a hash with the keys :input and :output holding the respective shapes.
34
+ #
35
+ # Examples
36
+ #
37
+ # class FooJackContract < Contract
38
+ #
39
+ # contract_for :save, {
40
+ # :input => Foo.shape,
41
+ # :output => Foo.shape,
42
+ # }
43
+ #
44
+ # end
45
+ #
46
+ def self.contract_for method, contract
47
+ method_alias = "#{method}_alias".to_sym
48
+ method_contract = "#{method}_contract".to_sym
49
+
50
+ define_method method_contract do |*args|
51
+ input = args[0]
52
+ call_method method_alias, input, contract[:input], contract[:output]
97
53
  end
98
54
 
99
- result = self.send method, input
100
- else
101
- result = self.send method
55
+ contracts( *contract_list, method )
102
56
  end
103
57
 
104
- # check output
105
- # output should never be nil
106
- if result == nil
107
- raise ContractOutputError, 'incorrect output data format'
58
+ # This method will move methods defined in @contracts into new methods.
59
+ # Each entry in @contracts will cause the method with the same name to
60
+ # become method_name_alias and for the original method to point to
61
+ # method_name_contract.
62
+ def self.method_added name
63
+ unless @@disable_override
64
+ self.contract_list.each do |method|
65
+ if name == method.to_sym
66
+ method_alias = "#{method}_alias".to_sym
67
+ method_contract = "#{method}_contract".to_sym
68
+
69
+ @@disable_override = true # to stop the new build method
70
+ self.send :alias_method, method_alias, name
71
+ self.send :remove_method, name
72
+ self.send :alias_method, name, method_contract
73
+
74
+ @@disable_override = false
75
+ else
76
+ # puts self.inspect
77
+ # puts "defining other method #{name}"
78
+ end
79
+ end
80
+ end
108
81
  end
109
82
 
110
- if result === {}
111
- raise DataNotFoundError, 'data was not found'
112
- end
83
+ # This method is used as a shorthand to mak the contract method calling pattern more DRY
84
+ # It starts by checking if you are sending in input and if so will check the input shape for
85
+ # errors. If no errors are found it calls the method via the passed in symbol(method).
86
+ #
87
+ # Output checking is more complicated because of the types of output we check for. Nil is
88
+ # never valid output. If we pass in the output shape of true, that means we are looking for
89
+ # result to be the object True. If the output shape is an array, that is actually a shorthand
90
+ # for telling our output check to look at the output as an array and compare it to the shape
91
+ # stored in output_shape[0]. If we pass in the symbol :true_false it means we are looking for
92
+ # the result to be either true or false. The default case will just check if result has the shape
93
+ # of the output_shape.
94
+ def call_method method, input, input_shape, output_shape
95
+ if input != nil && input_shape != nil
96
+ has_shape, error_field = input.has_shape? input_shape, true
97
+ unless has_shape
98
+ raise ContractInputError, "incorrect input data format field #{error_field}"
99
+ end
113
100
 
114
- # we are looking for result to be a True object
115
- if output_shape === true
116
- if output_shape == result
117
- return result
101
+ result = self.send method, input
118
102
  else
103
+ result = self.send method
104
+ end
105
+
106
+ # check output
107
+ # output should never be nil
108
+ if result == nil
119
109
  raise ContractOutputError, 'incorrect output data format'
120
110
  end
121
- end
122
111
 
123
- # we want to check the shape of each item in the result array
124
- if output_shape.class == Array
125
- if result.class == Array
126
- inner_shape = output_shape[0]
127
- result.each do |item|
128
- has_shape, error_field = item.has_shape? inner_shape, true
129
- unless has_shape
130
- raise ContractOutputError, "incorrect output data format field #{error_field}"
112
+ if result === {}
113
+ raise DataNotFoundError, 'data was not found'
114
+ end
115
+
116
+ # we are looking for result to be a True object
117
+ if output_shape === true
118
+ if output_shape == result
119
+ return result
120
+ else
121
+ raise ContractOutputError, 'incorrect output data format'
122
+ end
123
+ end
124
+
125
+ # we want to check the shape of each item in the result array
126
+ if output_shape.class == Array
127
+ if result.class == Array
128
+ inner_shape = output_shape[0]
129
+ result.each do |item|
130
+ has_shape, error_field = item.has_shape? inner_shape, true
131
+ unless has_shape
132
+ raise ContractOutputError, "incorrect output data format field #{error_field}"
133
+ end
131
134
  end
135
+
136
+ return result
137
+ end
138
+ raise ContractOutputError, 'incorrect output data format'
139
+ end
140
+
141
+ # we want result to be true or false
142
+ if output_shape == :true_false
143
+ unless result == true || result == false
144
+ raise ContractOutputError, 'incorrect output data format'
132
145
  end
133
146
 
134
147
  return result
135
148
  end
136
- raise ContractOutputError, 'incorrect output data format'
137
- end
138
149
 
139
- # we want result to be true or false
140
- if output_shape == :true_false
141
- unless result == true || result == false
142
- raise ContractOutputError, 'incorrect output data format'
150
+ # we want result to be output_shape's shape
151
+ has_shape, error_field = result.has_shape? output_shape, true
152
+ unless has_shape
153
+ raise ContractOutputError, "incorrect output data format field #{error_field}"
143
154
  end
144
155
 
145
- return result
146
- end
147
-
148
- # we want result to be output_shape's shape
149
- has_shape, error_field = result.has_shape? output_shape, true
150
- unless has_shape
151
- raise ContractOutputError, "incorrect output data format field #{error_field}"
156
+ result
152
157
  end
153
158
 
154
- result
155
159
  end
156
160
 
157
161
  end
@@ -160,7 +164,7 @@ end
160
164
  class Hash
161
165
  # Checks if a hash has a certain structure.
162
166
  # h = { k1: 1, k2: "1" }
163
- # h.has_shape?(k1: Fixnum, k2: String)
167
+ # h.has_shape?(k1: Integer, k2: String)
164
168
  # #=> true
165
169
  # h.has_shape?(k1: Class, k2: String)
166
170
  # #=> false
@@ -1,3 +1,3 @@
1
1
  module Obvious
2
- VERSION = "0.0.10"
2
+ VERSION = "0.1.0"
3
3
  end
data/obvious.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |gem|
9
9
  gem.authors = ["Brian Knapp"]
10
10
  gem.email = ["brianknapp@gmail.com"]
11
11
  gem.description = "A set of tools to build apps using the Obvious Architecture"
12
- gem.summary = "Isn't it Obvious?"
12
+ gem.summary = "Clean Architecture framework"
13
13
  gem.homepage = "http://obvious.retromocha.com/"
14
14
 
15
15
  gem.files = `git ls-files`.split($/)
@@ -5,27 +5,27 @@ require_relative '../lib/obvious/contract'
5
5
  describe Hash do
6
6
  describe '#has_shape?' do
7
7
  it 'should return true for a valid shape' do
8
- { id: 1 }.has_shape?(id: Fixnum).should be true
8
+ expect({ id: 1 }.has_shape?(id: Integer)).to be true
9
9
  end
10
10
 
11
11
  it 'should return false for an invalid shape' do
12
- { id: 1 }.has_shape?(id: String).should be false
12
+ expect({ id: 1 }.has_shape?(id: String)).to be false
13
13
  end
14
14
 
15
15
  it 'should retrn the invalid field if return_field flag is set' do
16
- { id: 1 }.has_shape?({id: String}, true).should eq [false, :id]
16
+ expect({ id: 1 }.has_shape?({id: String}, true)).to eq [false, :id]
17
17
  end
18
18
 
19
19
  it 'should allow for nil values to be returned' do
20
- { id: nil }.has_shape?({id: String}).should be true
20
+ expect({ id: nil }.has_shape?({id: String})).to be true
21
21
  end
22
22
  end
23
23
  end
24
24
 
25
- class TestContract < Contract
25
+ class TestContract < Obvious::Contract
26
26
  contract_for :test, {
27
- input: { id: Fixnum },
28
- output: { id: Fixnum, value: String }
27
+ input: { id: Integer },
28
+ output: { id: Integer, value: String }
29
29
  }
30
30
 
31
31
  def test input
@@ -33,13 +33,13 @@ class TestContract < Contract
33
33
  end
34
34
  end
35
35
 
36
- describe Contract do
36
+ describe Obvious::Contract do
37
37
 
38
38
  describe "#call_method" do
39
39
  it 'should return the correct output for valid input and output shapes' do
40
40
  tc = TestContract.new
41
41
  result = tc.test id: 1
42
- result.should eq id: 1, value: 'this is a test'
42
+ expect(result).to eq id: 1, value: 'this is a test'
43
43
  end
44
44
 
45
45
  it 'should raise a contract input error with bad input' do
@@ -49,13 +49,13 @@ describe Contract do
49
49
 
50
50
  it 'should raise a DataNotFound error if {} is returned' do
51
51
  tc = TestContract.new
52
- tc.should_receive(:test_alias).and_return({})
52
+ allow(tc).to receive(:test_alias).and_return({})
53
53
  expect { tc.test id: 1 }.to raise_error DataNotFoundError
54
54
  end
55
55
 
56
56
  it 'should raise a contract output error if nil is returned' do
57
57
  tc = TestContract.new
58
- tc.should_receive(:test_alias).and_return(nil)
58
+ allow(tc).to receive(:test_alias).and_return(nil)
59
59
  expect { tc.test id: 1 }.to raise_error ContractOutputError
60
60
  end
61
61
 
data/spec/entity_spec.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require_relative '../lib/obvious/entity'
2
2
 
3
3
  class Thing < Obvious::Entity
4
- value :id, Fixnum
4
+ value :id, Integer
5
5
  value :name, String
6
6
  end
7
7
 
@@ -36,8 +36,8 @@ describe Thing do
36
36
  it 'should create a valid object with valid input' do
37
37
  input = { name: 'Thing', id: 1 }
38
38
  t = Thing.new input
39
- t.name.should eq 'Thing'
40
- t.id.should eq 1
39
+ expect(t.name).to eq 'Thing'
40
+ expect(t.id).to eq 1
41
41
  end
42
42
 
43
43
  it 'should raise an error with invalid input types' do
@@ -59,7 +59,7 @@ describe Thing do
59
59
  it 'should return a hash representation of the object' do
60
60
  input = { name: 'Thing', id: 1 }
61
61
  t = Thing.new input
62
- t.to_hash.should eq input
62
+ expect(t.to_hash).to eq input
63
63
  end
64
64
  end
65
65
 
data/spec/obj_spec.rb CHANGED
@@ -7,7 +7,7 @@ class TestObj
7
7
  @local = 'set!'
8
8
  end
9
9
 
10
- define :defined_method, with_foo: [:foo, String], also_bar: [:bar, Fixnum] do |input|
10
+ define :defined_method, with_foo: [:foo, String], also_bar: [:bar, Integer] do |input|
11
11
  input
12
12
  end
13
13
 
@@ -26,37 +26,37 @@ describe Obvious::Obj do
26
26
  describe 'self.define' do
27
27
  it 'should do the right thing with correct input' do
28
28
  result = @test.defined_method with_foo: 'hello', also_bar: 12
29
- result.should eq foo: 'hello', bar: 12
29
+ expect(result).to eq foo: 'hello', bar: 12
30
30
  end
31
31
 
32
32
  it 'should have access to instance variables' do
33
33
  result = @test.defined_local
34
- result.should eq 'set!'
34
+ expect(result).to eq 'set!'
35
35
  end
36
36
 
37
37
  it 'should raise an error for missing parameters' do
38
38
  expect { @test.defined_method with_foo: 'hello' }.to raise_error { |error|
39
- error.should be_a ArgumentError
40
- error.message.should eq 'missing input field also_bar'
39
+ expect(error).to be_a ArgumentError
40
+ expect(error.message).to eq 'missing input field also_bar'
41
41
  }
42
42
  end
43
43
 
44
44
  it 'should raise an error for extra parameters' do
45
45
  expect { @test.defined_method with_foo: 'hello', also_bar: 12, and_extra: 'this is extra!' }.to raise_error { |error|
46
- error.should be_a ArgumentError
47
- error.message.should eq 'invalid input field and_extra'
46
+ expect(error).to be_a ArgumentError
47
+ expect(error.message).to eq 'invalid input field and_extra'
48
48
  }
49
49
  end
50
50
 
51
51
  it 'should raise an error for invalid types' do
52
52
  expect { @test.defined_method with_foo: 1, also_bar: 12 }.to raise_error { |error|
53
- error.should be_a ArgumentError
54
- error.message.should eq 'invalid type for with_foo expected String'
53
+ expect(error).to be_a ArgumentError
54
+ expect(error.message).to eq 'invalid type for with_foo expected String'
55
55
  }
56
56
 
57
57
  expect {@test.defined_method with_foo: 'hello', also_bar: nil }.to raise_error { |error|
58
- error.should be_a ArgumentError
59
- error.message.should eq 'invalid type for also_bar expected Fixnum'
58
+ expect(error).to be_a ArgumentError
59
+ expect(error.message).to eq 'invalid type for also_bar expected Integer'
60
60
  }
61
61
  end
62
62
  end
metadata CHANGED
@@ -1,27 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: obvious
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Brian Knapp
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-29 00:00:00.000000000 Z
11
+ date: 2022-01-26 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rspec
16
- requirement: &70261718685980 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
- version_requirements: *70261718685980
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
25
27
  description: A set of tools to build apps using the Obvious Architecture
26
28
  email:
27
29
  - brianknapp@gmail.com
@@ -30,8 +32,10 @@ executables:
30
32
  extensions: []
31
33
  extra_rdoc_files: []
32
34
  files:
33
- - .gitignore
35
+ - ".github/workflows/obvious.yml"
36
+ - ".gitignore"
34
37
  - Gemfile
38
+ - Gemfile.lock
35
39
  - LICENSE.txt
36
40
  - README.md
37
41
  - Rakefile
@@ -58,28 +62,26 @@ files:
58
62
  - spec/spec_helper.rb
59
63
  homepage: http://obvious.retromocha.com/
60
64
  licenses: []
65
+ metadata: {}
61
66
  post_install_message:
62
67
  rdoc_options: []
63
68
  require_paths:
64
69
  - lib
65
70
  required_ruby_version: !ruby/object:Gem::Requirement
66
- none: false
67
71
  requirements:
68
- - - ! '>='
72
+ - - ">="
69
73
  - !ruby/object:Gem::Version
70
74
  version: '0'
71
75
  required_rubygems_version: !ruby/object:Gem::Requirement
72
- none: false
73
76
  requirements:
74
- - - ! '>='
77
+ - - ">="
75
78
  - !ruby/object:Gem::Version
76
79
  version: '0'
77
80
  requirements: []
78
- rubyforge_project:
79
- rubygems_version: 1.8.17
81
+ rubygems_version: 3.0.3
80
82
  signing_key:
81
- specification_version: 3
82
- summary: Isn't it Obvious?
83
+ specification_version: 4
84
+ summary: Clean Architecture framework
83
85
  test_files:
84
86
  - spec/.spec_helper.rb.swp
85
87
  - spec/contract_spec.rb
@@ -87,4 +89,3 @@ test_files:
87
89
  - spec/generators/descriptor_spec.rb
88
90
  - spec/obj_spec.rb
89
91
  - spec/spec_helper.rb
90
- has_rdoc: