lou 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 51db60239346e259c7378b093d95fb361c6eda85
4
- data.tar.gz: f5615ce8a5d10e09edff99d390a7457664ab39c9
3
+ metadata.gz: 34aac868cb5bf73797d2b41155f717ee85ffe7fd
4
+ data.tar.gz: 5cc5bada947c03de042098b226b85179e394ed53
5
5
  SHA512:
6
- metadata.gz: 564ad4209e2dbfecc4e251a4d85008462110faed41f0fc85973179ef73c5da2984dacc7d947cf873061898c3ef67ce86192519962081155622a0a9f1a1591863
7
- data.tar.gz: 241c01bfa29c24bd457570534887aa1ba258918605b9480abff172adeb4d7dafd2b0dfc29c92d30e123461c79a7558f2ca9233b04fc5610bdbb224603513ebec
6
+ metadata.gz: c8d9d453b8dfd91ed8ad960a45086d042bedd7678d2231d99a9aa74ca5b587b825aa98c4447833a8672a0048744ac9670123524b0e788a1c5566bc9810a23984
7
+ data.tar.gz: 2451c3a54ea3c4ba91f5a3d031711882da48d34156e475e18cc1cc59bf9ed140a423630eeae252d4155b6eda5e8f095e2a40fd2721f8fb499f6fa13024310345
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'activesupport', '~> 3.0.0'
4
+ # Specify your gem's dependencies in ../lou.gemspec
5
+ gemspec path: '../'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'activesupport', '~> 3.1.0'
4
+ # Specify your gem's dependencies in ../lou.gemspec
5
+ gemspec path: '../'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'activesupport', '~> 3.2.0'
4
+ # Specify your gem's dependencies in ../lou.gemspec
5
+ gemspec path: '../'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'activesupport', '~> 4.0.0'
4
+ # Specify your gem's dependencies in ../lou.gemspec
5
+ gemspec path: '../'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'activesupport', '~> 4.1.0'
4
+ # Specify your gem's dependencies in ../lou.gemspec
5
+ gemspec path: '../'
data/.travis.yml CHANGED
@@ -5,3 +5,9 @@ rvm:
5
5
  - 2.1
6
6
  - jruby-1.7
7
7
  - rbx-2
8
+ gemfile:
9
+ - .gemfiles/activesupport3_0.gemfile
10
+ - .gemfiles/activesupport3_1.gemfile
11
+ - .gemfiles/activesupport3_2.gemfile
12
+ - .gemfiles/activesupport4_0.gemfile
13
+ - .gemfiles/activesupport4_1.gemfile
data/README.md CHANGED
@@ -15,16 +15,16 @@ You can define transformations in their own class like this:
15
15
  require 'lou'
16
16
 
17
17
  class HashTransformer
18
- extend Lou
18
+ extend Lou::Transformer
19
19
 
20
- transform.up do |x|
20
+ step.up do |x|
21
21
  x.merge(a_new_key: 'this is new')
22
22
  end.down do |x|
23
23
  x.delete(:a_new_key)
24
24
  x
25
25
  end
26
26
 
27
- transform.up do |x|
27
+ step.up do |x|
28
28
  x.flatten
29
29
  end.down do |x|
30
30
  Hash[*x]
@@ -41,9 +41,9 @@ original = HashTransformer.reverse(result)
41
41
  # {:an_old_key=>"this is old"}
42
42
  ~~~
43
43
 
44
- The transforms are applied in the order that they're defined using the ~apply~ function, with each transform receiving the result of the previous one. The process can be reversed using the ~reverse~ function.
44
+ The transforms are applied in the order that they're defined using the ~apply~ function, with each transform receiving the result of the previous one. The process can be reversed using the ~reverse~ function. Note that for each step, the input is the result of the previous step.
45
45
 
46
- Note that for each transform, the input is the result of the previous step.
46
+ Transformers inherit the steps of their parent class, so it's possible to reuse steps by using inheritance.
47
47
 
48
48
  Credits
49
49
  -------
@@ -0,0 +1,23 @@
1
+ module Lou
2
+ module Transformer
3
+ class Step
4
+ def up(&block)
5
+ @up = block
6
+ self
7
+ end
8
+
9
+ def down(&block)
10
+ @down = block
11
+ self
12
+ end
13
+
14
+ def apply(input)
15
+ @up.nil? ? input : @up.call(input)
16
+ end
17
+
18
+ def reverse(output)
19
+ @down.nil? ? output : @down.call(output)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,21 +1,33 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+ require 'lou/transformer/step'
3
+
1
4
  module Lou
2
- class Transformer
3
- def up(&block)
4
- @up = block
5
- self
5
+ module Transformer
6
+ def self.extended(base)
7
+ base.class_eval do
8
+ class_attribute(:steps)
9
+ self.steps = []
10
+ end
6
11
  end
7
12
 
8
- def down(&block)
9
- @down = block
10
- self
13
+ def step
14
+ Step.new.tap do |t|
15
+ steps << t
16
+ end
11
17
  end
12
18
 
13
19
  def apply(input)
14
- @up.nil? ? input : @up.call(input)
20
+ steps.each do |t|
21
+ input = t.apply(input)
22
+ end
23
+ input
15
24
  end
16
25
 
17
26
  def reverse(output)
18
- @down.nil? ? output : @down.call(output)
27
+ steps.reverse_each do |t|
28
+ output = t.reverse(output)
29
+ end
30
+ output
19
31
  end
20
32
  end
21
33
  end
data/lib/lou/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lou
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
data/lib/lou.rb CHANGED
@@ -2,35 +2,4 @@ require 'lou/version'
2
2
  require 'lou/transformer'
3
3
 
4
4
  module Lou
5
- def self.extended(base)
6
- base.class_eval do
7
- @transforms = []
8
- end
9
- end
10
-
11
- def transform
12
- Transformer.new.tap do |t|
13
- @transforms << t
14
- end
15
- end
16
-
17
- def apply(input)
18
- output = deep_clone(input)
19
- @transforms.each do |t|
20
- output = t.apply(output)
21
- end
22
- output
23
- end
24
-
25
- def reverse(output)
26
- input = deep_clone(output)
27
- @transforms.reverse_each do |t|
28
- input = t.reverse(input)
29
- end
30
- input
31
- end
32
-
33
- def deep_clone(obj)
34
- Marshal.load(Marshal.dump(obj))
35
- end
36
5
  end
data/lou.gemspec CHANGED
@@ -17,7 +17,11 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^spec/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
+ spec.required_ruby_version = '>= 1.9'
21
+
20
22
  spec.add_development_dependency "bundler", "~> 1.6"
21
23
  spec.add_development_dependency "rake"
22
24
  spec.add_development_dependency "rspec", ">= 3.0"
25
+
26
+ spec.add_dependency "activesupport", ">= 3.0"
23
27
  end
@@ -0,0 +1,114 @@
1
+ require 'lou/transformer'
2
+ require 'spec_helper'
3
+
4
+ module Lou
5
+ describe Transformer do
6
+ context 'with no steps defined' do
7
+ let(:klass) do
8
+ Class.new do
9
+ extend Lou::Transformer
10
+ end
11
+ end
12
+
13
+ describe '#apply' do
14
+ it 'returns the input' do
15
+ expect(klass.apply('this is the input')).to eq('this is the input')
16
+ end
17
+ end
18
+
19
+ describe '#reverse' do
20
+ it 'returns the input' do
21
+ expect(klass.reverse('this is the input')).to eq('this is the input')
22
+ end
23
+ end
24
+ end
25
+
26
+ context 'with one step' do
27
+ let(:klass) do
28
+ Class.new do
29
+ extend Lou::Transformer
30
+ step.up { |x| x.push 'world' }.down { |x| x.delete_if { |y| y == 'world' } }
31
+ end
32
+ end
33
+
34
+ describe '#apply' do
35
+ it 'applies the up step' do
36
+ expect(klass.apply(%w(hello))).to eq(%w(hello world))
37
+ end
38
+ end
39
+
40
+ describe '#reverse' do
41
+ it 'applies the down step' do
42
+ expect(klass.reverse(%w(hello world))).to eq(%w(hello))
43
+ end
44
+ end
45
+ end
46
+
47
+ context 'with two steps' do
48
+ let(:klass) do
49
+ Class.new do
50
+ extend Lou::Transformer
51
+ step.up { |x| x + ', or not to be' }.down { |x| x.gsub(/, or not to be$/, '') }
52
+ step.up { |x| x + ', that is the question.' }.down { |x| x.gsub(/, that is the question\.$/, '') }
53
+ end
54
+ end
55
+
56
+ describe '#apply' do
57
+ it 'applies all of the up steps in order' do
58
+ expect(klass.apply('To be')).to eq('To be, or not to be, that is the question.')
59
+ end
60
+ end
61
+
62
+ describe '#reverse' do
63
+ it 'applies all of the down steps in reverse order' do
64
+ expect(klass.reverse('To be, or not to be, that is the question.')).to eq('To be')
65
+ end
66
+ end
67
+ end
68
+
69
+ context 'when extended from another transformer' do
70
+ let(:parent) do
71
+ Class.new do
72
+ extend Lou::Transformer
73
+ step.up { |x| x.create; x }.down { |x| x.destroy; x }
74
+ end
75
+ end
76
+ let(:child) do
77
+ Class.new(parent) do
78
+ step.up { |x| x.create; x }.down { |x| x.destroy; x }
79
+ end
80
+ end
81
+ let(:grandchild) do
82
+ Class.new(child) do
83
+ step.up { |x| x.create; x }.down { |x| x.destroy; x }
84
+ end
85
+ end
86
+
87
+ let(:target) { instance_double('Target') }
88
+
89
+ describe '#apply' do
90
+ it 'applies the steps of the parent first, then the child' do
91
+ expect(target).to receive(:create).exactly(3).times
92
+ grandchild.apply(target)
93
+ end
94
+
95
+ it 'does not alter the up steps of the parent' do
96
+ expect(target).to receive(:create).exactly(1).times
97
+ parent.apply(target)
98
+ end
99
+ end
100
+
101
+ describe '#reverse' do
102
+ it 'reverses the steps of the child first, then the parent' do
103
+ expect(target).to receive(:destroy).exactly(3).times
104
+ grandchild.reverse(target)
105
+ end
106
+
107
+ it 'does not alter the down steps of the parent' do
108
+ expect(target).to receive(:destroy).exactly(1).times
109
+ parent.reverse(target)
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lou
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iain Beeston
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-06 00:00:00.000000000 Z
11
+ date: 2014-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
55
69
  description:
56
70
  email:
57
71
  - iain.beeston@gmail.com
@@ -59,6 +73,11 @@ executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
76
+ - .gemfiles/activesupport3_0.gemfile
77
+ - .gemfiles/activesupport3_1.gemfile
78
+ - .gemfiles/activesupport3_2.gemfile
79
+ - .gemfiles/activesupport4_0.gemfile
80
+ - .gemfiles/activesupport4_1.gemfile
62
81
  - .gitignore
63
82
  - .rspec
64
83
  - .travis.yml
@@ -68,9 +87,10 @@ files:
68
87
  - Rakefile
69
88
  - lib/lou.rb
70
89
  - lib/lou/transformer.rb
90
+ - lib/lou/transformer/step.rb
71
91
  - lib/lou/version.rb
72
92
  - lou.gemspec
73
- - spec/lou_spec.rb
93
+ - spec/lou/transformer_spec.rb
74
94
  - spec/spec_helper.rb
75
95
  homepage: ''
76
96
  licenses:
@@ -84,7 +104,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
84
104
  requirements:
85
105
  - - '>='
86
106
  - !ruby/object:Gem::Version
87
- version: '0'
107
+ version: '1.9'
88
108
  required_rubygems_version: !ruby/object:Gem::Requirement
89
109
  requirements:
90
110
  - - '>='
@@ -97,5 +117,5 @@ signing_key:
97
117
  specification_version: 4
98
118
  summary: Flexible and reversible transforms using a declarative dsl
99
119
  test_files:
100
- - spec/lou_spec.rb
120
+ - spec/lou/transformer_spec.rb
101
121
  - spec/spec_helper.rb
data/spec/lou_spec.rb DELETED
@@ -1,77 +0,0 @@
1
- require 'lou'
2
- require 'spec_helper'
3
-
4
- describe Lou do
5
- context 'with no transformations defined' do
6
- let(:klass) do
7
- Class.new do
8
- extend Lou
9
- end
10
- end
11
-
12
- describe '#apply' do
13
- it 'returns the input' do
14
- expect(klass.apply('this is the input')).to eq('this is the input')
15
- end
16
- end
17
-
18
- describe '#reverse' do
19
- it 'returns the input' do
20
- expect(klass.reverse('this is the input')).to eq('this is the input')
21
- end
22
- end
23
- end
24
-
25
- context 'with one transform' do
26
- let(:klass) do
27
- Class.new do
28
- extend Lou
29
- transform.up { |x| x.push 'world' }.down { |x| x.delete_if { |y| y == 'world' } }
30
- end
31
- end
32
-
33
- describe '#apply' do
34
- it 'applies the up transform' do
35
- expect(klass.apply(%w(hello))).to eq(%w(hello world))
36
- end
37
-
38
- it 'does not change the input object' do
39
- input = %w(hello)
40
- expect { klass.apply(input) }.to_not change { input }
41
- end
42
- end
43
-
44
- describe '#reverse' do
45
- it 'applies the down transform' do
46
- expect(klass.reverse(%w(hello world))).to eq(%w(hello))
47
- end
48
-
49
- it 'does not change the input object' do
50
- input = %w(hello world)
51
- expect { klass.reverse(input) }.to_not change { input }
52
- end
53
- end
54
- end
55
-
56
- context 'with two transforms' do
57
- let(:klass) do
58
- Class.new do
59
- extend Lou
60
- transform.up { |x| x + ', or not to be' }.down { |x| x.gsub(/, or not to be$/, '') }
61
- transform.up { |x| x + ', that is the question.' }.down { |x| x.gsub(/, that is the question\.$/, '') }
62
- end
63
- end
64
-
65
- describe '#apply' do
66
- it 'applies all of the up transforms in order' do
67
- expect(klass.apply('To be')).to eq('To be, or not to be, that is the question.')
68
- end
69
- end
70
-
71
- describe '#reverse' do
72
- it 'applies all of the down transforms in reverse order' do
73
- expect(klass.reverse('To be, or not to be, that is the question.')).to eq('To be')
74
- end
75
- end
76
- end
77
- end