ccp 0.2.4 → 0.2.5
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.
- data/README.rdoc +10 -0
- data/lib/ccp.rb +2 -0
- data/lib/ccp/commands/fixturable.rb +12 -0
- data/lib/ccp/fixtures.rb +1 -0
- data/lib/ccp/persistent/versioned.rb +9 -6
- data/lib/ccp/receivers/fixtures.rb +43 -13
- data/lib/ccp/version.rb +1 -1
- data/spec/commands/fixturable_spec.rb +8 -0
- data/spec/commands/fixturable_test_spec.rb +92 -0
- data/spec/persistent/versioned_spec.rb +6 -0
- metadata +5 -4
data/README.rdoc
CHANGED
|
@@ -265,3 +265,13 @@ Static options(hard code) are also available.
|
|
|
265
265
|
Cmd.execute(:a=>1)
|
|
266
266
|
|
|
267
267
|
This generates "tmp/stub.json", "tmp/mock.json".
|
|
268
|
+
|
|
269
|
+
=== Test
|
|
270
|
+
|
|
271
|
+
Once you got fixtures, call "test" method to test it.
|
|
272
|
+
|
|
273
|
+
Cmd.test
|
|
274
|
+
|
|
275
|
+
This automatically searchs fixtures when no fixture files are explicitly given.
|
|
276
|
+
The search algorithm is as same as 'fixture_save'.
|
|
277
|
+
|
data/lib/ccp.rb
CHANGED
|
@@ -5,6 +5,18 @@ module Ccp
|
|
|
5
5
|
base.class_eval do
|
|
6
6
|
include Ccp::Utils::Options
|
|
7
7
|
dsl_accessor :fixture, options(:stub, :mock, :fail, :save, :keys, :dir, :kvs, :ext)
|
|
8
|
+
|
|
9
|
+
extend Testable
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module Testable
|
|
14
|
+
def test(options = {})
|
|
15
|
+
c = new
|
|
16
|
+
c.receiver = options.delete(:receiver)
|
|
17
|
+
c.receiver.parse!(options)
|
|
18
|
+
c.receiver.test(c)
|
|
19
|
+
return c
|
|
8
20
|
end
|
|
9
21
|
end
|
|
10
22
|
end
|
data/lib/ccp/fixtures.rb
CHANGED
|
@@ -48,11 +48,14 @@ class Ccp::Persistent::Versioned
|
|
|
48
48
|
extend self
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
+
attr_reader :kvs
|
|
52
|
+
attr_reader :ext
|
|
53
|
+
|
|
51
54
|
def initialize(dir, options = {})
|
|
52
|
-
@path
|
|
53
|
-
@
|
|
54
|
-
@
|
|
55
|
-
@storages
|
|
55
|
+
@path = Pathname(dir)
|
|
56
|
+
@kvs = options[:kvs] || :dir
|
|
57
|
+
@ext = options[:ext] || :json
|
|
58
|
+
@storages = {}
|
|
56
59
|
|
|
57
60
|
@path.mkpath
|
|
58
61
|
end
|
|
@@ -80,11 +83,11 @@ class Ccp::Persistent::Versioned
|
|
|
80
83
|
|
|
81
84
|
# 指定したストレージを返す。存在しなければ作成して返す
|
|
82
85
|
def [](key)
|
|
83
|
-
storage = Storage.complete(key, path, @
|
|
86
|
+
storage = Storage.complete(key, path, @kvs, @ext)
|
|
84
87
|
@storages[storage.to_s] ||= storage.create
|
|
85
88
|
end
|
|
86
89
|
|
|
87
90
|
def inspect
|
|
88
|
-
"<Kvs::Versioned dir=#{path} kvs=#{@
|
|
91
|
+
"<Kvs::Versioned dir=#{path} kvs=#{@kvs} ext=#{@ext}>"
|
|
89
92
|
end
|
|
90
93
|
end
|
|
@@ -39,19 +39,34 @@ module Ccp
|
|
|
39
39
|
super
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
+
def test(cmd)
|
|
43
|
+
# set stub if exist
|
|
44
|
+
stub = fixture_versioned_for(cmd)["stub"].path
|
|
45
|
+
runtime_stubs[cmd] = stub if stub.exist?
|
|
46
|
+
|
|
47
|
+
# set mock
|
|
48
|
+
runtime_mocks[cmd] = fixture_versioned_for(cmd)["mock"].path
|
|
49
|
+
|
|
50
|
+
execute(cmd)
|
|
51
|
+
end
|
|
52
|
+
|
|
42
53
|
def fixture_stub(cmd)
|
|
43
|
-
path = cmd.class.stub or return
|
|
54
|
+
path = cmd.class.stub || runtime_stubs[cmd] or return
|
|
44
55
|
hash = Ccp::Persistent.load(path).read!
|
|
45
56
|
data.merge!(hash)
|
|
57
|
+
rescue Ccp::Persistent::NotFound => e
|
|
58
|
+
raise Ccp::Fixtures::NotFound, e.to_s
|
|
46
59
|
end
|
|
47
60
|
|
|
48
61
|
def fixture_mock(cmd)
|
|
49
|
-
path = cmd.class.mock or return
|
|
62
|
+
path = cmd.class.mock || runtime_mocks[cmd] or return
|
|
50
63
|
hash = Ccp::Persistent.load(path).read!
|
|
51
64
|
|
|
52
65
|
hash.keys.each do |key|
|
|
53
66
|
fixture_validate(cmd, key, data, hash)
|
|
54
67
|
end
|
|
68
|
+
rescue Ccp::Persistent::NotFound => e
|
|
69
|
+
raise Ccp::Fixtures::NotFound, e.to_s
|
|
55
70
|
end
|
|
56
71
|
|
|
57
72
|
def fixture_validate(cmd, key, data, hash)
|
|
@@ -71,12 +86,12 @@ module Ccp
|
|
|
71
86
|
|
|
72
87
|
def default_fixture_fail(cmd, key, exp, got)
|
|
73
88
|
if exp == nil and got == nil
|
|
74
|
-
raise "#{cmd.class} should write #{key} but not found"
|
|
89
|
+
raise Failed, "#{cmd.class} should write #{key} but not found"
|
|
75
90
|
end
|
|
76
91
|
|
|
77
92
|
exp_info = "%s(%s)" % [exp.inspect.truncate(200), Must::StructInfo.new(exp).compact.inspect]
|
|
78
93
|
got_info = "%s(%s)" % [got.inspect.truncate(200), Must::StructInfo.new(got).compact.inspect]
|
|
79
|
-
raise "%s should create %s for %s, but got %s" % [cmd.class, exp_info, key, got_info]
|
|
94
|
+
raise Failed, "%s should create %s for %s, but got %s" % [cmd.class, exp_info, key, got_info]
|
|
80
95
|
end
|
|
81
96
|
|
|
82
97
|
def fixture_save?(cmd)
|
|
@@ -98,21 +113,16 @@ module Ccp
|
|
|
98
113
|
end
|
|
99
114
|
|
|
100
115
|
def fixture_save(cmd, stub, mock)
|
|
101
|
-
|
|
102
|
-
path = Pathname(cmd.class.dir) + cmd.class.name.underscore if cmd.class.dir
|
|
103
|
-
|
|
116
|
+
versioned = fixture_versioned_for(cmd)
|
|
104
117
|
keys = cmd.class.keys || self[:fixture_keys]
|
|
105
|
-
kvs =
|
|
106
|
-
ext = cmd.class.ext || self[:fixture_ext]
|
|
107
|
-
|
|
108
|
-
versioned = Ccp::Persistent::Versioned.new(path, :kvs=>kvs, :ext=>ext)
|
|
118
|
+
kvs = Ccp::Persistent.lookup(versioned.kvs)
|
|
109
119
|
|
|
110
120
|
# stub
|
|
111
|
-
storage = cmd.class.stub ?
|
|
121
|
+
storage = cmd.class.stub ? kvs.new(cmd.class.stub, versioned.ext) : versioned["stub"]
|
|
112
122
|
storage.save(stub, fixture_keys_filter(keys, stub.keys))
|
|
113
123
|
|
|
114
124
|
# mock
|
|
115
|
-
storage = cmd.class.mock ?
|
|
125
|
+
storage = cmd.class.mock ? kvs.new(cmd.class.mock, versioned.ext) : versioned["mock"]
|
|
116
126
|
storage.save(mock, fixture_keys_filter(keys, mock.keys))
|
|
117
127
|
end
|
|
118
128
|
|
|
@@ -136,6 +146,26 @@ module Ccp
|
|
|
136
146
|
def default_fixture_path_for
|
|
137
147
|
proc{|cmd| settings.path(:fixture_dir) + cmd.class.name.underscore}
|
|
138
148
|
end
|
|
149
|
+
|
|
150
|
+
private
|
|
151
|
+
def runtime_stubs
|
|
152
|
+
@runtime_stubs ||= {} # key:cmd object, val:filename
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def runtime_mocks
|
|
156
|
+
@runtime_mocks ||= {} # key:cmd object, val:filename
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def fixture_versioned_for(cmd)
|
|
160
|
+
dir = cmd.class.dir
|
|
161
|
+
path = dir ? (Pathname(dir) + cmd.class.name.underscore) : self[:fixture_path_for].call(cmd)
|
|
162
|
+
|
|
163
|
+
kvs = cmd.class.kvs || self[:fixture_kvs]
|
|
164
|
+
ext = cmd.class.ext || self[:fixture_ext]
|
|
165
|
+
|
|
166
|
+
versioned = Ccp::Persistent::Versioned.new(path, :kvs=>kvs, :ext=>ext)
|
|
167
|
+
return versioned
|
|
168
|
+
end
|
|
139
169
|
end
|
|
140
170
|
end
|
|
141
171
|
end
|
data/lib/ccp/version.rb
CHANGED
|
@@ -19,6 +19,8 @@ describe Ccp::Commands::Fixturable do
|
|
|
19
19
|
it { should respond_to("ext") }
|
|
20
20
|
it { should respond_to("fixture") }
|
|
21
21
|
its(:fixture) { should respond_to("options") }
|
|
22
|
+
|
|
23
|
+
it { should respond_to("test") }
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
context "Ccp::Commands::Composite" do
|
|
@@ -33,6 +35,8 @@ describe Ccp::Commands::Fixturable do
|
|
|
33
35
|
it { should respond_to("ext") }
|
|
34
36
|
it { should respond_to("fixture") }
|
|
35
37
|
its(:fixture) { should respond_to("options") }
|
|
38
|
+
|
|
39
|
+
it { should respond_to("test") }
|
|
36
40
|
end
|
|
37
41
|
|
|
38
42
|
context "Ccp::Invokers::Base" do
|
|
@@ -47,6 +51,8 @@ describe Ccp::Commands::Fixturable do
|
|
|
47
51
|
it { should respond_to("ext") }
|
|
48
52
|
it { should respond_to("fixture") }
|
|
49
53
|
its(:fixture) { should respond_to("options") }
|
|
54
|
+
|
|
55
|
+
it { should respond_to("test") }
|
|
50
56
|
end
|
|
51
57
|
|
|
52
58
|
context "included class" do
|
|
@@ -61,6 +67,8 @@ describe Ccp::Commands::Fixturable do
|
|
|
61
67
|
it { should respond_to("ext") }
|
|
62
68
|
it { should respond_to("fixture") }
|
|
63
69
|
its(:fixture) { should respond_to("options") }
|
|
70
|
+
|
|
71
|
+
it { should respond_to("test") }
|
|
64
72
|
end
|
|
65
73
|
end
|
|
66
74
|
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Ccp::Commands::Fixturable do
|
|
4
|
+
before do
|
|
5
|
+
@stub = Pathname("tmp/fixtures/square_cmd/stub.json")
|
|
6
|
+
@mock = Pathname("tmp/fixtures/square_cmd/mock.json")
|
|
7
|
+
@stub.parent.mkpath
|
|
8
|
+
save_fixture(@stub, "x"=>10)
|
|
9
|
+
save_fixture(@mock, "x"=>100)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
after do
|
|
13
|
+
FileUtils.rm_rf("tmp/fixtures")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class SquareCmd
|
|
17
|
+
include Ccp::Commands::Core
|
|
18
|
+
def execute
|
|
19
|
+
data[:x] = data[:x] * data[:x]
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class SquareCmdPass < SquareCmd
|
|
24
|
+
stub "tmp/fixtures/square_cmd/stub.json"
|
|
25
|
+
mock "tmp/fixtures/square_cmd/mock.json"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class SquareCmdFail < SquareCmd
|
|
29
|
+
stub "tmp/fixtures/square_cmd/stub.json"
|
|
30
|
+
mock "tmp/fixtures/square_cmd/mock.json"
|
|
31
|
+
|
|
32
|
+
def execute
|
|
33
|
+
data[:x] = data[:x] + 1
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe ".test" do
|
|
38
|
+
it "should use stub automatically if exists" do
|
|
39
|
+
cmd = SquareCmd.test
|
|
40
|
+
cmd.data[:x].should == 100
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should use mock automatically" do
|
|
44
|
+
save_fixture(@mock, "x"=>1)
|
|
45
|
+
|
|
46
|
+
lambda {
|
|
47
|
+
SquareCmd.test
|
|
48
|
+
}.should raise_error(Ccp::Failed)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should raise Fixtures::NotFound if mock doesn't exist" do
|
|
52
|
+
@mock.unlink
|
|
53
|
+
|
|
54
|
+
lambda {
|
|
55
|
+
SquareCmd.test
|
|
56
|
+
}.should raise_error(Ccp::Fixtures::NotFound)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "(pass case)" do
|
|
60
|
+
it "should raise nothing" do
|
|
61
|
+
cmd = SquareCmdPass.test
|
|
62
|
+
cmd.data[:x].should == 100
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context "(fail case)" do
|
|
67
|
+
it "should raise RuntimeError" do
|
|
68
|
+
failed = nil
|
|
69
|
+
SquareCmdFail.stub @stub
|
|
70
|
+
SquareCmdFail.mock @mock
|
|
71
|
+
|
|
72
|
+
lambda {
|
|
73
|
+
SquareCmdFail.test
|
|
74
|
+
}.should raise_error(Ccp::Failed)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "should call fail handler if given" do
|
|
78
|
+
failed = nil
|
|
79
|
+
SquareCmdFail.stub @stub
|
|
80
|
+
SquareCmdFail.mock @mock
|
|
81
|
+
SquareCmdFail.fail {|cmd, key, expected, got|
|
|
82
|
+
failed = key
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
lambda {
|
|
86
|
+
SquareCmdFail.test
|
|
87
|
+
}.should_not raise_error
|
|
88
|
+
failed.should == "x"
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -10,6 +10,12 @@ describe Ccp::Persistent::Versioned do
|
|
|
10
10
|
root.mkpath
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
describe "(accessors)" do
|
|
14
|
+
subject { Ccp::Persistent::Versioned.new(root, :kvs=>"dir", :ext=>"yaml") }
|
|
15
|
+
its(:kvs) { should == "dir" }
|
|
16
|
+
its(:ext) { should == "yaml" }
|
|
17
|
+
end
|
|
18
|
+
|
|
13
19
|
describe "#latest" do
|
|
14
20
|
it "should return a kvs with the latest dated file" do
|
|
15
21
|
# create directories
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ccp
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 29
|
|
5
5
|
prerelease: false
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 2
|
|
9
|
-
-
|
|
10
|
-
version: 0.2.
|
|
9
|
+
- 5
|
|
10
|
+
version: 0.2.5
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- maiha
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2012-05-
|
|
18
|
+
date: 2012-05-15 00:00:00 +09:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies:
|
|
21
21
|
- !ruby/object:Gem::Dependency
|
|
@@ -145,6 +145,7 @@ files:
|
|
|
145
145
|
- spec/commands/core_spec.rb
|
|
146
146
|
- spec/commands/executable_spec.rb
|
|
147
147
|
- spec/commands/fixturable_spec.rb
|
|
148
|
+
- spec/commands/fixturable_test_spec.rb
|
|
148
149
|
- spec/fixtures/cmd1stub_mock/mock.json
|
|
149
150
|
- spec/fixtures/stub/breadcrumbs.json
|
|
150
151
|
- spec/invokers/base_spec.rb
|