obvious 0.0.10 → 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 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: