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 +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:
|