pad 0.1 → 0.1.1
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 +4 -4
- data/.gitignore +2 -1
- data/.rbenv-gemsets +1 -0
- data/Gemfile +0 -1
- data/README.md +59 -12
- data/Rakefile +3 -2
- data/lib/pad.rb +5 -1
- data/lib/pad/configuration.rb +1 -2
- data/lib/pad/delegate_via.rb +38 -0
- data/lib/pad/services/logger.rb +23 -0
- data/lib/pad/version.rb +1 -1
- data/pad.gemspec +9 -2
- data/spec/lib/pad/configuration_spec.rb +0 -18
- data/spec/lib/pad/delegate_via_spec.rb +76 -0
- data/spec/lib/pad/services/logger_acceptance_spec.rb +12 -0
- data/spec/lib/pad/services/logger_spec.rb +77 -0
- data/spec/lib/pad_spec.rb +2 -2
- data/spec/shared/attribute_examples.rb +13 -5
- data/spec/shared/value_object_examples.rb +37 -8
- data/spec/spec_helper.rb +2 -0
- metadata +30 -11
- data/Gemfile.lock +0 -133
- data/lib/pad/repository/memory.rb +0 -25
- data/spec/lib/pad/repository/memory_spec.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be8e3f8388ad03d852a1356a6b5c99aee54c907d
|
4
|
+
data.tar.gz: dba6b05edc6d58a47dd7364af92f0a1b194dcdfc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe6c5734a0dd29eb4ea1e96328287bbfc4926fd40fa7fdc938130841569e0148a160d8d66294701a1d9126048cc3a62e08dc3c1bfb966e247554c9e3ed57992c
|
7
|
+
data.tar.gz: db95c2aceda6d694940664824e6f4b29b384f28d07b609c9a0253147d0334dcb4370a6655a9f0f1f8c2fb8ecdf56e8b3431000a2b9f487605ad843b93833e202
|
data/.gitignore
CHANGED
data/.rbenv-gemsets
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
-global
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -25,8 +25,48 @@ Or install it yourself as:
|
|
25
25
|
|
26
26
|
## Usage
|
27
27
|
|
28
|
+
### Models
|
29
|
+
You can create your own models and use Pad attributes by including ```Pad.model``` in your classes.
|
30
|
+
This will add an ```attribute``` method you can use to add attributes to your class.
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
require 'pad'
|
34
|
+
|
35
|
+
class Vehicle
|
36
|
+
include Pad.model
|
37
|
+
|
38
|
+
attribute :year
|
39
|
+
attribute :manufacturer
|
40
|
+
attribute :make
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
Attribute values can be passed into the constructor as a hash using a key of the attribute name.
|
45
|
+
```ruby
|
46
|
+
sienna = Vehicle.new year: 2006, manufacturer: 'Toyota', make: 'Sienna' # => #<Vehicle:0x007fcdacd2ff38 @year=2006, @manufacturer="Toyota", @make="Sienna">
|
47
|
+
```
|
48
|
+
|
49
|
+
And readers and writers are available for each attribute:
|
50
|
+
```ruby
|
51
|
+
sienna.year # => 2006
|
52
|
+
sienna.year = 2007
|
53
|
+
sienna # => #<Vehicle:0x007fcdacd2ff38 @year=2007, @manufacturer="Toyota", @make="Sienna">
|
54
|
+
```
|
55
|
+
|
56
|
+
You can set the type of an attribute
|
57
|
+
```ruby
|
58
|
+
attribute :name, String
|
59
|
+
```
|
60
|
+
|
61
|
+
You can set the visibility of attributes:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
attribute :private, String, reader: :private, writer: :private
|
65
|
+
attribute :protected, String, reader: :protected, writer: :protected
|
66
|
+
attribute :public, String, reader: :public, writer: :public
|
67
|
+
```
|
28
68
|
### Entities
|
29
|
-
You can create entities which
|
69
|
+
You can create entities which extend models with a built-in 'id' attribute which uniquely identifies the entity.
|
30
70
|
|
31
71
|
```ruby
|
32
72
|
require 'pad'
|
@@ -47,24 +87,31 @@ another_dave = Person.new id: 21
|
|
47
87
|
dave == another_dave # => true
|
48
88
|
```
|
49
89
|
|
50
|
-
###
|
51
|
-
You can create
|
90
|
+
### Value Objects
|
91
|
+
You can create value objects which have use read-only attribute values to denote equality.
|
92
|
+
Attribute values are passed into the constructor as a hash. Attributes to be considered
|
93
|
+
when checking equality are surrounded by a ```values``` block.
|
52
94
|
|
53
95
|
```ruby
|
54
96
|
require 'pad'
|
55
97
|
|
56
|
-
class
|
57
|
-
include Pad.
|
98
|
+
class Price
|
99
|
+
include Pad.value_object
|
58
100
|
|
59
|
-
|
60
|
-
|
61
|
-
|
101
|
+
values do
|
102
|
+
attribute :cost
|
103
|
+
attribute :currency
|
104
|
+
end
|
105
|
+
|
106
|
+
attribute :id
|
62
107
|
end
|
63
108
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
109
|
+
pen1 = Price.new id: 1, cost: 100, currency: 'CAD' # => ##<Price cost=100 currency="CAD">
|
110
|
+
pen2 = Price.new id: 2, cost: 100, currency: 'CAD' # => ##<Price cost=100 currency="CAD">
|
111
|
+
pen3 = Price.new id: 3, cost: 999, currency: 'CAD' # => ##<Price cost=100 currency="CAD">
|
112
|
+
|
113
|
+
pen1 == pen2 # => true
|
114
|
+
pen1 == pen3 # => false
|
68
115
|
```
|
69
116
|
|
70
117
|
## Contributing
|
data/Rakefile
CHANGED
data/lib/pad.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
require 'pad/virtus'
|
2
2
|
|
3
|
+
# TODO: Move to separate gem
|
4
|
+
require 'pad/delegate_via'
|
5
|
+
|
3
6
|
require 'pad/configuration'
|
4
7
|
require 'pad/version'
|
5
8
|
require 'pad/entity'
|
6
|
-
|
9
|
+
|
10
|
+
require 'pad/services/logger'
|
7
11
|
|
8
12
|
module Pad
|
9
13
|
class << self
|
data/lib/pad/configuration.rb
CHANGED
@@ -5,8 +5,7 @@ module Pad
|
|
5
5
|
|
6
6
|
# @api private
|
7
7
|
def initialize(options = {})
|
8
|
-
self.builder
|
9
|
-
self.repository = options.fetch(:repository, Pad::Repository::Memory)
|
8
|
+
self.builder = options.fetch(:builder, Pad::Virtus)
|
10
9
|
|
11
10
|
yield self if block_given?
|
12
11
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
module DelegateVia
|
3
|
+
class << self
|
4
|
+
def included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
11
|
+
def delegate_via(accessor_name, *method_names, &return_block)
|
12
|
+
options = method_names.last.is_a?(Hash) ? method_names.pop : {}
|
13
|
+
via_method = options.fetch(:via, :map)
|
14
|
+
|
15
|
+
mod = if const_defined?(:DelegateVia, false)
|
16
|
+
const_get(:DelegateVia)
|
17
|
+
else
|
18
|
+
new_mod = Module.new do
|
19
|
+
def self.to_s
|
20
|
+
"DelegateVia(#{instance_methods(false).join(', ')})"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
const_set(:DelegateVia, new_mod)
|
24
|
+
end
|
25
|
+
|
26
|
+
mod.module_eval do
|
27
|
+
method_names.each do |method_name|
|
28
|
+
define_method method_name do |*args, &block|
|
29
|
+
accessor = __send__(accessor_name)
|
30
|
+
result = accessor.__send__(via_method) { |service| service.__send__(method_name, *args, &block) }
|
31
|
+
return_block ? instance_exec(result, &return_block) : result
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
include mod
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Pad
|
4
|
+
module Services
|
5
|
+
class Logger
|
6
|
+
include DelegateVia
|
7
|
+
|
8
|
+
def register(*loggers)
|
9
|
+
self.loggers.concat(loggers)
|
10
|
+
end
|
11
|
+
|
12
|
+
def loggers
|
13
|
+
@loggers ||= []
|
14
|
+
end
|
15
|
+
|
16
|
+
delegate_via :loggers, :debug, :info, :warn, :error, :fatal, :unknown, &:any?
|
17
|
+
delegate_via :loggers, :debug?, :info?, :warn?, :error?, :fatal?, &:any?
|
18
|
+
|
19
|
+
delegate_via :loggers, :add, :log, &:any?
|
20
|
+
delegate_via :loggers, :<<, &:first
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/pad/version.rb
CHANGED
data/pad.gemspec
CHANGED
@@ -21,12 +21,19 @@ Gem::Specification.new do |gem|
|
|
21
21
|
|
22
22
|
gem.add_dependency 'virtus', '~> 1.0'
|
23
23
|
|
24
|
-
gem.add_development_dependency 'attribute_matcher', '~> 0.
|
24
|
+
gem.add_development_dependency 'attribute_matcher', '~> 0.3'
|
25
25
|
gem.add_development_dependency 'bundler', '~> 1.7'
|
26
26
|
gem.add_development_dependency 'coveralls', '~> 0.7'
|
27
|
-
gem.add_development_dependency 'delegate_matcher', '~> 0.
|
27
|
+
gem.add_development_dependency 'delegate_matcher', '~> 0.1'
|
28
28
|
gem.add_development_dependency 'guard', '~> 2.13'
|
29
29
|
gem.add_development_dependency 'guard-rspec', '~> 4.6'
|
30
|
+
|
31
|
+
if RUBY_VERSION =~ /2/
|
32
|
+
gem.add_development_dependency 'pry-byebug', '~> 3.3'
|
33
|
+
else
|
34
|
+
gem.add_development_dependency 'pry-debugger', '~> 0.2'
|
35
|
+
end
|
36
|
+
|
30
37
|
gem.add_development_dependency 'rake', '~> 10.0'
|
31
38
|
gem.add_development_dependency 'rspec', '~> 3.0'
|
32
39
|
gem.add_development_dependency 'rspec-its', '~> 1.1'
|
@@ -35,23 +35,5 @@ module Pad
|
|
35
35
|
expect(configuration.builder).to be builder
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
39
|
-
describe 'repository' do
|
40
|
-
let(:repository) { double 'repository' }
|
41
|
-
|
42
|
-
it 'should default to Pad::Repository::Memory' do
|
43
|
-
expect(subject.repository).to be Pad::Repository::Memory
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'should be settable' do
|
47
|
-
subject.repository = repository
|
48
|
-
expect(subject.repository).to be repository
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'should be settable via initialization' do
|
52
|
-
configuration = Configuration.new(repository: repository)
|
53
|
-
expect(configuration.repository).to be repository
|
54
|
-
end
|
55
|
-
end
|
56
38
|
end
|
57
39
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DelegateVia do
|
4
|
+
let(:klass) { Struct.new(:delegates) { include DelegateVia } }
|
5
|
+
let(:delegates) { [double('delegate1').as_null_object, double('delegate2').as_null_object] }
|
6
|
+
|
7
|
+
subject { klass.new }
|
8
|
+
|
9
|
+
before { subject.delegates = delegates }
|
10
|
+
before { klass.class_eval { delegate_via :delegates, :call } }
|
11
|
+
|
12
|
+
describe 'with arguments' do
|
13
|
+
it { should delegate(:call).with.to(*delegates) }
|
14
|
+
it { should delegate(:call).with('arg').to(*delegates) }
|
15
|
+
it { should delegate(:call).with('arg', 'arg2').to(*delegates) }
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'with multiple methods' do
|
19
|
+
before { klass.class_eval { delegate_via :delegates, :call2, :call3 } }
|
20
|
+
it { should delegate(:call2).to(*delegates) }
|
21
|
+
it { should delegate(:call3).to(*delegates) }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'blocks' do
|
25
|
+
it { should delegate(:call).to(*delegates).with_block }
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'via method' do
|
29
|
+
it 'should default to "map"' do
|
30
|
+
should delegate(:call).to(:delegates).as(:map)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should allow accessor method to be provided' do
|
34
|
+
klass.class_eval { delegate_via :delegates, :call, via: :each }
|
35
|
+
should delegate(:call).to(:delegates).as(:each)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'return value' do
|
40
|
+
it 'with no result block should return array of result values from delegates' do
|
41
|
+
expect(subject.call).to eq delegates
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should should set self to the delegator in the result block' do
|
45
|
+
block_self = nil
|
46
|
+
klass.class_eval { delegate_via(:delegates, :call) { block_self = self } }
|
47
|
+
|
48
|
+
subject.call
|
49
|
+
expect(block_self).to be subject
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should should pass delegate results to the result block' do
|
53
|
+
block_result = nil
|
54
|
+
klass.class_eval { delegate_via(:delegates, :call) { |result| block_result = result } }
|
55
|
+
|
56
|
+
subject.call
|
57
|
+
expect(block_result).to eq delegates
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should return value from the result block' do
|
61
|
+
klass.class_eval { delegate_via(:delegates, :call) { :return_value } }
|
62
|
+
expect(subject.call).to eq :return_value
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'to_s' do
|
67
|
+
it 'with a single delegation' do
|
68
|
+
expect(klass.ancestors[1].to_s).to eq 'DelegateVia(call)'
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'with multiple delegations' do
|
72
|
+
klass.class_eval { delegate_via :delegates, :call2, :call3 }
|
73
|
+
expect(klass.ancestors[1].to_s).to eq 'DelegateVia(call, call2, call3)'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Pad
|
4
|
+
module Services
|
5
|
+
describe Logger do
|
6
|
+
specify 'should log to console' do
|
7
|
+
subject.register ::Logger.new(STDOUT)
|
8
|
+
expect { subject.info 'test' }.to output(/^I.*INFO.*test$/).to_stdout_from_any_process
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Pad
|
4
|
+
module Services
|
5
|
+
describe Logger do
|
6
|
+
let(:logger1) { double('logger1') }
|
7
|
+
let(:logger2) { double('logger2') }
|
8
|
+
let(:loggers) { [logger1, logger2] }
|
9
|
+
|
10
|
+
before { subject.register logger1, logger2 }
|
11
|
+
|
12
|
+
[:debug, :info, :warn, :error, :fatal, :unknown].each do |method|
|
13
|
+
before do
|
14
|
+
allow(logger1).to receive(method) { true }
|
15
|
+
allow(logger2).to receive(method) { true }
|
16
|
+
end
|
17
|
+
|
18
|
+
it "#{method} should be delegated with a message" do
|
19
|
+
expect(subject).to delegate(method).to(*loggers).with('message').and_return true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "#{method} should be delegated without a message" do
|
23
|
+
expect(subject).to delegate(method).to(*loggers).and_return true
|
24
|
+
end
|
25
|
+
|
26
|
+
it "#{method} should be delegated with a block" do
|
27
|
+
expect(subject).to delegate(method).to(*loggers).with_block.and_return true
|
28
|
+
end
|
29
|
+
|
30
|
+
it "#{method} should return true if any logger returns true" do
|
31
|
+
allow(logger1).to receive(method) { true }
|
32
|
+
allow(logger2).to receive(method) { false }
|
33
|
+
expect(subject.send(method, 'message')).to be true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "#{method} should return false if all loggers return false" do
|
37
|
+
allow(logger1).to receive(method) { false }
|
38
|
+
allow(logger2).to receive(method) { false }
|
39
|
+
expect(subject.send(method, 'message')).to be false
|
40
|
+
end
|
41
|
+
|
42
|
+
next if method == :unknown
|
43
|
+
|
44
|
+
it "#{method}? should return true if any logger return true" do
|
45
|
+
allow(logger1).to receive("#{method}?") { true }
|
46
|
+
allow(logger2).to receive("#{method}?") { false }
|
47
|
+
expect(subject).to delegate("#{method}?").to(*loggers).and_return true
|
48
|
+
end
|
49
|
+
|
50
|
+
it "#{method}? should return false if all loggers return false" do
|
51
|
+
allow(logger1).to receive("#{method}?") { false }
|
52
|
+
allow(logger2).to receive("#{method}?") { false }
|
53
|
+
expect(subject).to delegate("#{method}?").to(*loggers).and_return false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it '<< should be delegated' do
|
58
|
+
allow(logger1).to receive(:<<) { 7 }
|
59
|
+
allow(logger2).to receive(:<<) { 35 }
|
60
|
+
expect(subject).to delegate(:<<).with('message').to(*loggers).and_return 7
|
61
|
+
end
|
62
|
+
|
63
|
+
[:add, :log].each do |method|
|
64
|
+
describe "#{method}" do
|
65
|
+
before do
|
66
|
+
allow(logger1).to receive(method) { false }
|
67
|
+
allow(logger2).to receive(method) { false }
|
68
|
+
end
|
69
|
+
|
70
|
+
it { should delegate(method).with(::Logger::INFO).to(*loggers).with_block.and_return false }
|
71
|
+
it { should delegate(method).with(::Logger::INFO, 'message').to(*loggers).and_return false }
|
72
|
+
it { should delegate(method).with(::Logger::INFO, 'message', 'progname').to(*loggers).and_return false }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/spec/lib/pad_spec.rb
CHANGED
@@ -3,8 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe Pad do
|
4
4
|
subject { Pad }
|
5
5
|
|
6
|
-
let(:options) { { some: :option }
|
7
|
-
let(:builder) { double
|
6
|
+
let(:options) { { some: :option } }
|
7
|
+
let(:builder) { double('builder').as_null_object }
|
8
8
|
let(:default_builder) { Pad.config.builder }
|
9
9
|
|
10
10
|
[:model, :entity, :value_object].each do |method|
|
@@ -17,25 +17,33 @@ module Pad
|
|
17
17
|
describe 'type' do
|
18
18
|
before do
|
19
19
|
klass.class_eval do
|
20
|
-
attribute :name, String
|
20
|
+
attribute :name, String
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
it { is_expected.to have_attribute(:name).of_type(String) }
|
25
25
|
end
|
26
26
|
|
27
|
-
describe '
|
27
|
+
describe 'options' do
|
28
28
|
before do
|
29
29
|
klass.class_eval do
|
30
30
|
attribute :private, String, reader: :private, writer: :private
|
31
31
|
attribute :protected, String, reader: :protected, writer: :protected
|
32
32
|
attribute :public, String, reader: :public, writer: :public
|
33
|
+
|
34
|
+
attribute :name, String, default: 'Joe'
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
|
38
|
+
describe 'visibility' do
|
39
|
+
it { is_expected.to have_attribute(:private). with_reader(:private). with_writer(:private) }
|
40
|
+
it { is_expected.to have_attribute(:protected).with_reader(:protected).with_writer(:protected) }
|
41
|
+
it { is_expected.to have_attribute(:public). with_reader(:public). with_writer(:public) }
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'default' do
|
45
|
+
it { is_expected.to have_attribute(:name).with_value('Joe') }
|
46
|
+
end
|
39
47
|
end
|
40
48
|
|
41
49
|
# TODO: add checks for mass assignment, constructor
|
@@ -6,19 +6,48 @@ module Pad
|
|
6
6
|
shared_examples 'a value object module' do |mod|
|
7
7
|
include_examples 'attribute examples', mod
|
8
8
|
|
9
|
-
|
10
|
-
subject { klass.new }
|
9
|
+
subject { klass.new }
|
11
10
|
|
12
|
-
|
13
|
-
|
11
|
+
let(:klass) do
|
12
|
+
Class.new do
|
13
|
+
include mod
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
attribute :default
|
15
|
+
values do
|
16
|
+
attribute :name
|
18
17
|
end
|
18
|
+
|
19
|
+
attribute :age
|
19
20
|
end
|
21
|
+
end
|
20
22
|
|
21
|
-
|
23
|
+
describe 'default visibility' do
|
24
|
+
it { is_expected.to have_attribute(:name).with_reader(:public).with_writer(:private) }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'equality' do
|
28
|
+
specify 'with value attributes all nil' do
|
29
|
+
joe1 = klass.new
|
30
|
+
joe2 = klass.new
|
31
|
+
expect(joe1).to eq joe2
|
32
|
+
end
|
33
|
+
|
34
|
+
specify 'with value attributes having same values' do
|
35
|
+
joe1 = klass.new name: 'Joe'
|
36
|
+
joe2 = klass.new name: 'Joe'
|
37
|
+
expect(joe1).to eq joe2
|
38
|
+
end
|
39
|
+
|
40
|
+
specify 'with non-value attributes having different values' do
|
41
|
+
joe1 = klass.new age: 22
|
42
|
+
joe2 = klass.new age: 99
|
43
|
+
expect(joe1).to eq joe2
|
44
|
+
end
|
45
|
+
|
46
|
+
specify 'with value attributes having different values' do
|
47
|
+
joe = klass.new name: 'Joe'
|
48
|
+
jane = klass.new name: 'Jane'
|
49
|
+
expect(jane).to_not eq joe
|
50
|
+
end
|
22
51
|
end
|
23
52
|
end
|
24
53
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Declan Whelan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0.
|
75
|
+
version: '0.1'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0.
|
82
|
+
version: '0.1'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: guard
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '4.6'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry-byebug
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '3.3'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '3.3'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rake
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -173,23 +187,26 @@ extensions: []
|
|
173
187
|
extra_rdoc_files: []
|
174
188
|
files:
|
175
189
|
- ".gitignore"
|
190
|
+
- ".rbenv-gemsets"
|
176
191
|
- ".rubocop.yml"
|
177
192
|
- ".travis.yml"
|
178
193
|
- Gemfile
|
179
|
-
- Gemfile.lock
|
180
194
|
- Guardfile
|
181
195
|
- LICENSE.txt
|
182
196
|
- README.md
|
183
197
|
- Rakefile
|
184
198
|
- lib/pad.rb
|
185
199
|
- lib/pad/configuration.rb
|
200
|
+
- lib/pad/delegate_via.rb
|
186
201
|
- lib/pad/entity.rb
|
187
|
-
- lib/pad/
|
202
|
+
- lib/pad/services/logger.rb
|
188
203
|
- lib/pad/version.rb
|
189
204
|
- lib/pad/virtus.rb
|
190
205
|
- pad.gemspec
|
191
206
|
- spec/lib/pad/configuration_spec.rb
|
192
|
-
- spec/lib/pad/
|
207
|
+
- spec/lib/pad/delegate_via_spec.rb
|
208
|
+
- spec/lib/pad/services/logger_acceptance_spec.rb
|
209
|
+
- spec/lib/pad/services/logger_spec.rb
|
193
210
|
- spec/lib/pad/version_spec.rb
|
194
211
|
- spec/lib/pad/virtus_spec.rb
|
195
212
|
- spec/lib/pad_spec.rb
|
@@ -218,14 +235,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
218
235
|
version: '0'
|
219
236
|
requirements: []
|
220
237
|
rubyforge_project:
|
221
|
-
rubygems_version: 2.
|
238
|
+
rubygems_version: 2.5.1
|
222
239
|
signing_key:
|
223
240
|
specification_version: 4
|
224
241
|
summary: A light weight framework for supporting Ports & Adapters designs with Domain
|
225
242
|
Driven Design
|
226
243
|
test_files:
|
227
244
|
- spec/lib/pad/configuration_spec.rb
|
228
|
-
- spec/lib/pad/
|
245
|
+
- spec/lib/pad/delegate_via_spec.rb
|
246
|
+
- spec/lib/pad/services/logger_acceptance_spec.rb
|
247
|
+
- spec/lib/pad/services/logger_spec.rb
|
229
248
|
- spec/lib/pad/version_spec.rb
|
230
249
|
- spec/lib/pad/virtus_spec.rb
|
231
250
|
- spec/lib/pad_spec.rb
|
data/Gemfile.lock
DELETED
@@ -1,133 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
pad (0.1)
|
5
|
-
virtus (~> 1.0)
|
6
|
-
|
7
|
-
GEM
|
8
|
-
remote: https://rubygems.org/
|
9
|
-
specs:
|
10
|
-
ast (2.1.0)
|
11
|
-
astrolabe (1.3.1)
|
12
|
-
parser (~> 2.2)
|
13
|
-
attribute_matcher (0.1)
|
14
|
-
axiom-types (0.1.1)
|
15
|
-
descendants_tracker (~> 0.0.4)
|
16
|
-
ice_nine (~> 0.11.0)
|
17
|
-
thread_safe (~> 0.3, >= 0.3.1)
|
18
|
-
coderay (1.1.0)
|
19
|
-
coercible (1.0.0)
|
20
|
-
descendants_tracker (~> 0.0.1)
|
21
|
-
coveralls (0.7.2)
|
22
|
-
multi_json (~> 1.3)
|
23
|
-
rest-client (= 1.6.7)
|
24
|
-
simplecov (>= 0.7)
|
25
|
-
term-ansicolor (= 1.2.2)
|
26
|
-
thor (= 0.18.1)
|
27
|
-
delegate_matcher (0.0.1)
|
28
|
-
descendants_tracker (0.0.4)
|
29
|
-
thread_safe (~> 0.3, >= 0.3.1)
|
30
|
-
diff-lcs (1.2.5)
|
31
|
-
docile (1.1.5)
|
32
|
-
equalizer (0.0.11)
|
33
|
-
ffi (1.9.10)
|
34
|
-
formatador (0.2.5)
|
35
|
-
guard (2.13.0)
|
36
|
-
formatador (>= 0.2.4)
|
37
|
-
listen (>= 2.7, <= 4.0)
|
38
|
-
lumberjack (~> 1.0)
|
39
|
-
nenv (~> 0.1)
|
40
|
-
notiffany (~> 0.0)
|
41
|
-
pry (>= 0.9.12)
|
42
|
-
shellany (~> 0.0)
|
43
|
-
thor (>= 0.18.1)
|
44
|
-
guard-compat (1.2.1)
|
45
|
-
guard-rspec (4.6.4)
|
46
|
-
guard (~> 2.1)
|
47
|
-
guard-compat (~> 1.1)
|
48
|
-
rspec (>= 2.99.0, < 4.0)
|
49
|
-
ice_nine (0.11.1)
|
50
|
-
listen (3.0.3)
|
51
|
-
rb-fsevent (>= 0.9.3)
|
52
|
-
rb-inotify (>= 0.9)
|
53
|
-
lumberjack (1.0.9)
|
54
|
-
method_source (0.8.2)
|
55
|
-
mime-types (2.4.3)
|
56
|
-
multi_json (1.10.1)
|
57
|
-
nenv (0.2.0)
|
58
|
-
notiffany (0.0.8)
|
59
|
-
nenv (~> 0.1)
|
60
|
-
shellany (~> 0.0)
|
61
|
-
parser (2.2.2.6)
|
62
|
-
ast (>= 1.1, < 3.0)
|
63
|
-
powerpack (0.1.1)
|
64
|
-
pry (0.10.2)
|
65
|
-
coderay (~> 1.1.0)
|
66
|
-
method_source (~> 0.8.1)
|
67
|
-
slop (~> 3.4)
|
68
|
-
rainbow (2.0.0)
|
69
|
-
rake (10.4.2)
|
70
|
-
rb-fsevent (0.9.6)
|
71
|
-
rb-inotify (0.9.5)
|
72
|
-
ffi (>= 0.5.0)
|
73
|
-
rest-client (1.6.7)
|
74
|
-
mime-types (>= 1.16)
|
75
|
-
rspec (3.3.0)
|
76
|
-
rspec-core (~> 3.3.0)
|
77
|
-
rspec-expectations (~> 3.3.0)
|
78
|
-
rspec-mocks (~> 3.3.0)
|
79
|
-
rspec-core (3.3.2)
|
80
|
-
rspec-support (~> 3.3.0)
|
81
|
-
rspec-expectations (3.3.1)
|
82
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
83
|
-
rspec-support (~> 3.3.0)
|
84
|
-
rspec-its (1.1.0)
|
85
|
-
rspec-core (>= 3.0.0)
|
86
|
-
rspec-expectations (>= 3.0.0)
|
87
|
-
rspec-mocks (3.3.2)
|
88
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
89
|
-
rspec-support (~> 3.3.0)
|
90
|
-
rspec-support (3.3.0)
|
91
|
-
rubocop (0.33.0)
|
92
|
-
astrolabe (~> 1.3)
|
93
|
-
parser (>= 2.2.2.5, < 3.0)
|
94
|
-
powerpack (~> 0.1)
|
95
|
-
rainbow (>= 1.99.1, < 3.0)
|
96
|
-
ruby-progressbar (~> 1.4)
|
97
|
-
ruby-progressbar (1.7.5)
|
98
|
-
shellany (0.0.1)
|
99
|
-
simplecov (0.9.1)
|
100
|
-
docile (~> 1.1.0)
|
101
|
-
multi_json (~> 1.0)
|
102
|
-
simplecov-html (~> 0.8.0)
|
103
|
-
simplecov-html (0.8.0)
|
104
|
-
slop (3.6.0)
|
105
|
-
term-ansicolor (1.2.2)
|
106
|
-
tins (~> 0.8)
|
107
|
-
thor (0.18.1)
|
108
|
-
thread_safe (0.3.5)
|
109
|
-
tins (0.13.2)
|
110
|
-
virtus (1.0.5)
|
111
|
-
axiom-types (~> 0.1)
|
112
|
-
coercible (~> 1.0)
|
113
|
-
descendants_tracker (~> 0.0, >= 0.0.3)
|
114
|
-
equalizer (~> 0.0, >= 0.0.9)
|
115
|
-
|
116
|
-
PLATFORMS
|
117
|
-
ruby
|
118
|
-
|
119
|
-
DEPENDENCIES
|
120
|
-
attribute_matcher (~> 0.1)
|
121
|
-
bundler (~> 1.7)
|
122
|
-
coveralls (~> 0.7)
|
123
|
-
delegate_matcher (~> 0.0)
|
124
|
-
guard (~> 2.13)
|
125
|
-
guard-rspec (~> 4.6)
|
126
|
-
pad!
|
127
|
-
rake (~> 10.0)
|
128
|
-
rspec (~> 3.0)
|
129
|
-
rspec-its (~> 1.1)
|
130
|
-
rubocop (~> 0.30)
|
131
|
-
|
132
|
-
BUNDLED WITH
|
133
|
-
1.10.6
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Pad
|
2
|
-
module Repository
|
3
|
-
class Memory
|
4
|
-
def initialize
|
5
|
-
self.repository = {}
|
6
|
-
end
|
7
|
-
|
8
|
-
def save(entity)
|
9
|
-
repository[entity.id] = entity
|
10
|
-
end
|
11
|
-
|
12
|
-
def find(id)
|
13
|
-
repository[id]
|
14
|
-
end
|
15
|
-
|
16
|
-
def delete(entity)
|
17
|
-
repository[entity.id] = nil
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
attr_accessor :repository
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Pad
|
4
|
-
module Repository
|
5
|
-
describe Memory do
|
6
|
-
let(:entity) { OpenStruct.new id: 42 }
|
7
|
-
|
8
|
-
describe 'find' do
|
9
|
-
it { should respond_to :find }
|
10
|
-
end
|
11
|
-
|
12
|
-
describe 'save' do
|
13
|
-
it 'should save' do
|
14
|
-
subject.save entity
|
15
|
-
expect(subject.find 42).to be entity
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe 'delete' do
|
20
|
-
it 'should delete' do
|
21
|
-
subject.save entity
|
22
|
-
subject.delete entity
|
23
|
-
expect(subject.find 42).to be_nil
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|