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 +7 -0
- data/.github/workflows/obvious.yml +19 -0
- data/.gitignore +0 -1
- data/Gemfile.lock +34 -0
- data/README.md +10 -8
- data/lib/generators/application_generator.rb +1 -1
- data/lib/obvious/contract.rb +131 -127
- data/lib/obvious/version.rb +1 -1
- data/obvious.gemspec +1 -1
- data/spec/contract_spec.rb +11 -11
- data/spec/entity_spec.rb +4 -4
- data/spec/obj_spec.rb +11 -11
- metadata +18 -17
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
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
|
data/lib/obvious/contract.rb
CHANGED
@@ -1,157 +1,161 @@
|
|
1
|
-
|
2
|
-
@@disable_override = false
|
1
|
+
module Obvious
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
def self.contract_list
|
7
|
-
[]
|
8
|
-
end
|
3
|
+
class Contract
|
4
|
+
@@disable_override = false
|
9
5
|
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
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
|
-
|
100
|
-
else
|
101
|
-
result = self.send method
|
55
|
+
contracts( *contract_list, method )
|
102
56
|
end
|
103
57
|
|
104
|
-
#
|
105
|
-
#
|
106
|
-
|
107
|
-
|
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
|
-
|
111
|
-
|
112
|
-
|
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
|
-
|
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
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
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
|
-
|
140
|
-
|
141
|
-
unless
|
142
|
-
raise ContractOutputError,
|
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
|
-
|
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:
|
167
|
+
# h.has_shape?(k1: Integer, k2: String)
|
164
168
|
# #=> true
|
165
169
|
# h.has_shape?(k1: Class, k2: String)
|
166
170
|
# #=> false
|
data/lib/obvious/version.rb
CHANGED
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 = "
|
12
|
+
gem.summary = "Clean Architecture framework"
|
13
13
|
gem.homepage = "http://obvious.retromocha.com/"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
data/spec/contract_spec.rb
CHANGED
@@ -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:
|
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).
|
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).
|
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}).
|
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:
|
28
|
-
output: { id:
|
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.
|
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.
|
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.
|
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,
|
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.
|
40
|
-
t.id.
|
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.
|
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,
|
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.
|
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.
|
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.
|
40
|
-
error.message.
|
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.
|
47
|
-
error.message.
|
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.
|
54
|
-
error.message.
|
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.
|
59
|
-
error.message.
|
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
|
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:
|
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:
|
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:
|
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
|
-
- .
|
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
|
-
|
79
|
-
rubygems_version: 1.8.17
|
81
|
+
rubygems_version: 3.0.3
|
80
82
|
signing_key:
|
81
|
-
specification_version:
|
82
|
-
summary:
|
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:
|