ccp 0.1.5 → 0.1.7

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/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem 'typed', '>= 0.1.1'
4
- gem 'dsl_accessor', '>= 0.4.0'
3
+ gemspec
@@ -95,17 +95,91 @@ Just call a "execute" instance method.
95
95
 
96
96
  === invokers
97
97
 
98
- Invokers::Base can be used as a top level composite command.
98
+ Invokers::Base is a top level composite command.
99
+ It acts same as composite except some special options.
100
+ Those are profile, comment, logger.
99
101
 
100
102
  class SomeOperation < Ccp::Invokers::Base
101
- command FetchData
103
+ command FetchData # same as composite
104
+ command Calculate # same as composite
102
105
  ...
103
106
 
107
+ profile true # default false
108
+ comment false # default true
109
+ ...
104
110
 
105
- Its "benchmark" method generates profile information.
111
+ This profile option prints benchmarks of commands.
106
112
 
107
- ruby -r some_operation -e 'SomeOperation.new.benchmark'
113
+ ruby -r some_operation -e 'SomeOperation.execute'
108
114
  [43.3%] 2.5834830 FetchData#execute
109
115
  [35.9%] 2.0710440 Calculate#execute
110
116
  ...
111
117
 
118
+
119
+ == Fixtures
120
+
121
+ Let's imagine a following command that just read :a and write :x.
122
+
123
+ class TSFC # TestSaveFixtureCmd
124
+ include Ccp::Commands::Core
125
+
126
+ def execute
127
+ data[:a] # read
128
+ data[:x] = 10 # write
129
+ end
130
+ end
131
+
132
+ This may be a part of sequncial commands.
133
+ When we want to test only this command, usually we should prepare
134
+ some fixture data for the 'data' object.
135
+
136
+ === Generating fixtures
137
+
138
+ Ccp can automatically generate fixture data for each commands.
139
+ Pass :save_fixture option to 'execute' class method to enable it.
140
+
141
+ * save_fixture : enable write fixture mode if true
142
+ * save_fixture_dir : set root dir of fixture (default: tmp/fixtures)
143
+
144
+ In above example, we can kick it with data[:a] like this.
145
+
146
+ TSFC.execute(:a => 1)
147
+
148
+ And if you want to geneate fixures for this command, just add :save_fixture.
149
+
150
+ TSFC.execute(:a => 1, :save_fixture => true)
151
+
152
+ This will create following files.
153
+
154
+ % tree tmp/fixtures
155
+ tmp/fixtures
156
+ └── tsfc
157
+ ├── in.yaml
158
+ └── out.yaml
159
+
160
+ 1 directory, 2 files
161
+ % cat tmp/fixtures/tsfc/*
162
+ ---
163
+ :a: 1
164
+ ---
165
+ :x: 10
166
+
167
+ === Writing tests
168
+
169
+ Use them as stubs and expected data as you like.
170
+
171
+ describe TSFC do
172
+ it "should work" do
173
+ data = YAML.load(Pathname("tmp/fixtures/tsfc/in.yaml").read{})
174
+ expected = YAML.load(Pathname("tmp/fixtures/tsfc/out.yaml").read{})
175
+
176
+ cmd = TSFC.execute(data)
177
+
178
+ expected.each_pair do |key, val|
179
+ cmd.data[key].should == val
180
+ end
181
+ end
182
+ end
183
+
184
+ This code is highly versatile.
185
+
@@ -18,7 +18,8 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_dependency "typed", ">= 0.1.2"
21
+ s.add_dependency "typed", ">= 0.1.5"
22
+ s.add_dependency "must", ">= 0.2.7"
22
23
  s.add_dependency "dsl_accessor", ">= 0.4.0"
23
24
 
24
25
  s.add_development_dependency "rspec"
data/lib/ccp.rb CHANGED
@@ -6,6 +6,7 @@ require "ccp/data"
6
6
 
7
7
  module Ccp
8
8
  autoload :Colorize, 'ccp/colorize'
9
+ autoload :Fixtures, 'ccp/fixtures'
9
10
  autoload :Commands, 'ccp/commands'
10
11
  autoload :Invokers, 'ccp/invokers'
11
12
  autoload :Receivers, 'ccp/receivers'
@@ -2,8 +2,10 @@ module Ccp
2
2
  module Commands
3
3
  module Composite
4
4
  def self.included(base)
5
+ super
5
6
  base.class_eval do
6
7
  extend ClassMethods
8
+ extend Executable::ClassMethods
7
9
  end
8
10
  end
9
11
 
@@ -64,7 +66,9 @@ module Ccp
64
66
  ### Commands
65
67
 
66
68
  def execute
67
- commands.each(&:benchmark)
69
+ commands.each do |c|
70
+ c.receiver.execute(c)
71
+ end
68
72
  end
69
73
 
70
74
  def receiver=(value)
@@ -2,8 +2,14 @@ module Ccp
2
2
  module Commands
3
3
  module Core
4
4
  include Receivable
5
- include Executable
6
5
  include Commentable
6
+ include Executable
7
+
8
+ def self.included(base)
9
+ base.class_eval do
10
+ extend ClassMethods
11
+ end
12
+ end
7
13
 
8
14
  def inspect
9
15
  klass_name = self.class.name.to_s.split(/::/).last
@@ -1,16 +1,25 @@
1
1
  module Ccp
2
2
  module Commands
3
3
  module Executable
4
+ def self.included(base)
5
+ base.class_eval do
6
+ extend ClassMethods
7
+ end
8
+ end
4
9
 
5
- ### Command
6
-
7
- def execute
10
+ module ClassMethods
11
+ def execute(options = {})
12
+ c = new
13
+ c.receiver = options.delete(:receiver)
14
+ c.receiver.parse!(options)
15
+ c.receiver.execute(c)
16
+ return c
17
+ end
8
18
  end
9
19
 
10
- ### Profiling
20
+ ### Command
11
21
 
12
- def benchmark
13
- receiver.profile(self, :execute)
22
+ def execute
14
23
  end
15
24
  end
16
25
  end
@@ -5,10 +5,11 @@ module Ccp
5
5
  ### Receiver Methods
6
6
 
7
7
  def receiver
8
- @receiver ||= Ccp::Receivers::Base.new
8
+ (@receiver ||= Ccp::Receivers::Base.new).must(Receivers::Base)
9
9
  end
10
10
 
11
11
  def receiver=(value)
12
+ return unless value
12
13
  @receiver = value.must(Ccp::Receivers::Base)
13
14
  end
14
15
 
@@ -4,18 +4,34 @@ require 'pathname'
4
4
 
5
5
  module Ccp
6
6
  module Data
7
- module Pathable
7
+ module Ext
8
8
  def path(key)
9
9
  self[key].must.coerced(Pathname, String=>proc{|i| Pathname(i)})
10
10
  end
11
+
12
+ def merge(options)
13
+ options.each_pair do |key,val|
14
+ self[key] = val
15
+ end
16
+ end
17
+
18
+ def merge_default(options)
19
+ options.each_pair do |key,val|
20
+ default[key] = val
21
+ end
22
+ end
11
23
  end
12
24
 
13
25
  def data
14
- @data ||= Typed::Hash.new.extend Pathable
26
+ @data ||= Typed::Hash.new.extend Ext
15
27
  end
16
28
 
17
29
  def data?(key)
18
30
  data.set?(key)
19
31
  end
32
+
33
+ def parse!(options)
34
+ data.merge(options)
35
+ end
20
36
  end
21
37
  end
@@ -0,0 +1,6 @@
1
+ module Ccp
2
+ module Fixtures
3
+ autoload :Observer , 'ccp/fixtures/observer'
4
+ autoload :Writers , 'ccp/fixtures/writers'
5
+ end
6
+ end
@@ -0,0 +1,23 @@
1
+ module Ccp
2
+ module Fixtures
3
+ class Observer
4
+ attr_reader :read, :write
5
+
6
+ def initialize(data)
7
+ @data = data.must(Typed::Hash)
8
+ @read = {}
9
+ @write = {}
10
+ end
11
+
12
+ def start
13
+ @data.events.on(:read ) {|k,v| @read[k] ||= v}
14
+ @data.events.on(:write) {|k,v| @write[k] = v}
15
+ end
16
+
17
+ def stop
18
+ # remove events (this depends on typed.gem)
19
+ # NotImplementedYet
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,35 @@
1
+ module Ccp
2
+ module Fixtures
3
+ module Writers
4
+ class Base
5
+ def self.[]= (path, hash)
6
+ new(hash,path).execute
7
+ end
8
+
9
+ def initialize(hash, path)
10
+ @hash = hash.must(Hash)
11
+ @path = path.must(Pathname)
12
+ end
13
+
14
+ def serialize(data)
15
+ data
16
+ end
17
+
18
+ def write(data)
19
+ @path.parent.mkpath
20
+ @path.open("w+"){|f| f.print data}
21
+ end
22
+
23
+ def execute
24
+ write(serialize(@hash))
25
+ end
26
+ end
27
+
28
+ class YamlWriter < Base
29
+ def serialize(data)
30
+ YAML.dump(data)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -6,68 +6,36 @@ module Ccp
6
6
  include Commands::Composite
7
7
 
8
8
  dsl_accessor :receiver, Receivers::Base
9
- delegate :show_profiles, :profiles, :to=>"receiver"
10
- delegate :show_comments, :comments, :to=>"receiver"
11
-
12
- DEFAULT_OPTIONS = {
13
- :profile => false,
14
- :comment => true,
15
- :logger => Logger.new($stderr),
16
- }
9
+ dsl_accessor :profile , false
10
+ dsl_accessor :comment , true
11
+ dsl_accessor :logger , proc{ Logger.new($stderr) }
17
12
 
18
13
  ######################################################################
19
14
  ### Class Methods
20
15
 
21
16
  def self.execute(options = {}, &block)
22
17
  cmd = new(options)
23
- if block_given?
24
- cmd.instance_eval(&block)
25
- end
26
- cmd.benchmark
18
+ cmd.instance_eval(&block) if block_given?
19
+ cmd.receiver.execute(cmd)
27
20
  return cmd
28
21
  end
29
22
 
30
- def self.benchmark(options = {}, &block)
31
- execute({:profile => true}.merge(options), &block)
23
+ def self.default_options
24
+ {:profile => profile, :comment => comment, :logger => logger}
32
25
  end
33
26
 
34
27
  ######################################################################
35
28
  ### Instance Methods
36
29
 
37
- def initialize(options = nil)
38
- options ||= {}
39
- set_default_receiver(options[:receiver])
40
- set_default_options
41
- set_runtime_options(options)
42
- end
43
-
44
- def set_default_receiver(receiver)
45
- self.receiver = receiver || self.class.receiver.new
46
- end
47
-
48
- def set_default_options
49
- self.class::DEFAULT_OPTIONS.each_pair do |key,val|
50
- data.default[key] = val
51
- end
52
- end
53
-
54
- def set_runtime_options(options)
55
- options.each_pair do |key,val|
56
- data[key] = val
57
- end
58
- end
59
-
60
- def receiver
61
- @receiver.must(Receivers::Base)
62
- end
63
-
64
- def receiver=(value)
65
- @receiver = value.must(Receivers::Base)
30
+ def initialize(options = {})
31
+ self.receiver = options.delete(:receiver) || self.class.receiver.new
32
+ receiver.data.merge_default(self.class.default_options)
33
+ receiver.data.merge(options)
66
34
  end
67
35
 
68
36
  def after
69
- show_profiles if data?(:profile)
70
- show_comments if data?(:comment)
37
+ receiver.show_profiles if data?(:profile)
38
+ receiver.show_comments if data?(:comment)
71
39
  end
72
40
  end
73
41
  end
@@ -2,7 +2,10 @@ module Ccp
2
2
  module Receivers
3
3
  autoload :Base , 'ccp/receivers/base'
4
4
  autoload :Global , 'ccp/receivers/global'
5
+ autoload :Executable , 'ccp/receivers/executable'
6
+ autoload :Aroundable , 'ccp/receivers/aroundable'
5
7
  autoload :Commentable , 'ccp/receivers/commentable'
6
8
  autoload :Profileable , 'ccp/receivers/profileable'
9
+ autoload :SaveFixture , 'ccp/receivers/save_fixture'
7
10
  end
8
11
  end
@@ -0,0 +1,11 @@
1
+ module Ccp
2
+ module Receivers
3
+ module Aroundable
4
+ def execute(cmd)
5
+ cmd.must.duck!("before") {}
6
+ super
7
+ cmd.must.duck!("after") {}
8
+ end
9
+ end
10
+ end
11
+ end
@@ -2,9 +2,14 @@ module Ccp
2
2
  module Receivers
3
3
  class Base
4
4
  include Ccp::Data
5
- include Profileable
6
5
  include Commentable
7
6
 
7
+ # for execute
8
+ include Executable
9
+ include Profileable
10
+ include Aroundable
11
+ include SaveFixture
12
+
8
13
  def inspect
9
14
  klass_name = self.class.name.to_s.split(/::/).last
10
15
 
@@ -0,0 +1,9 @@
1
+ module Ccp
2
+ module Receivers
3
+ module Executable
4
+ def execute(cmd)
5
+ cmd.execute
6
+ end
7
+ end
8
+ end
9
+ end
@@ -14,17 +14,15 @@ module Ccp
14
14
  end
15
15
  end
16
16
 
17
- def profile(target, method)
17
+ def execute(cmd)
18
18
  start = Time.new
19
- target.__send__(:before) if target.respond_to?(:before)
20
- target.__send__(method)
21
- target.__send__(:after) if target.respond_to?(:after)
19
+ super
22
20
 
23
- case target
21
+ case cmd
24
22
  when Ccp::Commands::Composite
25
23
  # no profiles
26
24
  else
27
- profiles << Profile.new(target, method, (Time.new - start).to_f)
25
+ profiles << Profile.new(cmd, "execute", (Time.new - start).to_f)
28
26
  end
29
27
  end
30
28
 
@@ -0,0 +1,45 @@
1
+ module Ccp
2
+ module Receivers
3
+ module SaveFixture
4
+ attr_accessor :save_fixture_dir
5
+
6
+ def execute(cmd)
7
+ if save_fixture?(cmd)
8
+ observer = Ccp::Fixtures::Observer.new(data)
9
+ observer.start
10
+ super
11
+ observer.stop
12
+ path = save_fixture_path_for(cmd)
13
+ Ccp::Fixtures::Writers::YamlWriter[path + "in.yaml" ] = observer.read
14
+ Ccp::Fixtures::Writers::YamlWriter[path + "out.yaml"] = observer.write
15
+ else
16
+ super
17
+ end
18
+ end
19
+
20
+ def parse!(options)
21
+ dir = options.delete(:save_fixture_dir)
22
+ @save_fixture_dir = dir if dir
23
+
24
+ super
25
+ end
26
+
27
+ def save_fixture?(cmd)
28
+ if data?(:save_fixture)
29
+ return true
30
+ else
31
+ # indivisual fixture is not supported yet
32
+ return false
33
+ end
34
+ end
35
+
36
+ def save_fixture_path_for(cmd)
37
+ Pathname(save_fixture_dir || save_fixture_default_dir) + cmd.class.name.underscore
38
+ end
39
+
40
+ def save_fixture_default_dir
41
+ "tmp/fixtures"
42
+ end
43
+ end
44
+ end
45
+ end
@@ -1,3 +1,3 @@
1
1
  module Ccp
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.7"
3
3
  end
@@ -13,11 +13,9 @@ describe Ccp::Commands::Composite do
13
13
  end
14
14
  end
15
15
 
16
- describe "#benchmark" do
16
+ describe ".execute" do
17
17
  it "should call its and sub commands's {before,execute,after} in declared order" do
18
- c = Program.new
19
- c.data[:breadcrumbs] = []
20
- c.benchmark
18
+ c = Program.execute(:receiver=>breadcrumbs_receiver)
21
19
  c.data[:breadcrumbs].should ==
22
20
  ["Program#before",
23
21
  "Cmd1#before", "Cmd1#execute", "Cmd1#after",
@@ -85,11 +83,9 @@ describe "Ccp::Commands::Composite(nested)" do
85
83
  end
86
84
  end
87
85
 
88
- describe "#benchmark" do
86
+ describe ".execute" do
89
87
  it "should call its and sub commands's {before,execute,after} in declared order" do
90
- c = CompositeProgram.new
91
- c.data[:breadcrumbs] = []
92
- c.benchmark
88
+ c = CompositeProgram.execute(:receiver=>breadcrumbs_receiver)
93
89
  c.data[:breadcrumbs].should ==
94
90
  ["CompositeProgram#before",
95
91
  "Cmd1#before", "Cmd1#execute", "Cmd1#after",
@@ -11,11 +11,15 @@ describe Ccp::Commands::Core do
11
11
 
12
12
  # executable
13
13
  it { should respond_to(:execute) }
14
- it { should respond_to(:benchmark) }
15
14
 
16
15
  # receivable
17
16
  it { should respond_to(:receiver) }
18
17
  its(:receiver) { should be_kind_of(Ccp::Receivers::Base) }
18
+
19
+ it "should ignore nil for receiver values" do
20
+ subject.receiver = nil
21
+ subject.receiver.should be_kind_of(Ccp::Receivers::Base)
22
+ end
19
23
  end
20
24
 
21
25
  describe "#execute" do
@@ -26,22 +30,4 @@ describe Ccp::Commands::Core do
26
30
  cmd1.data[:breadcrumbs].should == ["Cmd1#execute"]
27
31
  end
28
32
  end
29
-
30
- describe "#benchmark" do
31
- it "should call {before,execute,after}" do
32
- cmd1 = Cmd1.new
33
- cmd1.data[:breadcrumbs] = []
34
- cmd1.benchmark
35
- cmd1.data[:breadcrumbs].should == ["Cmd1#before", "Cmd1#execute", "Cmd1#after"]
36
- end
37
-
38
- it "should call receiver.profile" do
39
- (receiver = Ccp::Receivers::Base.new).should_receive(:profile)
40
-
41
- cmd1 = Cmd1.new
42
- cmd1.receiver = receiver
43
- cmd1.data[:breadcrumbs] = []
44
- cmd1.benchmark
45
- end
46
- end
47
33
  end
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ describe Ccp::Commands::Executable do
4
+ describe "#execute" do
5
+ it "should call only execute" do
6
+ cmd1 = Cmd1.new
7
+ cmd1.data[:breadcrumbs] = []
8
+ cmd1.execute
9
+ cmd1.data[:breadcrumbs].should == ["Cmd1#execute"]
10
+ end
11
+ end
12
+
13
+ describe ".execute" do
14
+ it "should call {before,execute,after}" do
15
+ cmd1 = Cmd1.execute(:breadcrumbs => [])
16
+ cmd1.data[:breadcrumbs].should == ["Cmd1#before", "Cmd1#execute", "Cmd1#after"]
17
+ end
18
+ end
19
+ end
@@ -20,25 +20,6 @@ describe Ccp::Invokers::Base do
20
20
  end
21
21
  end
22
22
 
23
- describe "#benchmark" do
24
- it "should call its and sub commands's {before,execute,after} in declared order" do
25
- c = CompositeInvoker.new
26
- c.data[:breadcrumbs] = []
27
- c.benchmark
28
- c.data[:breadcrumbs].should ==
29
- ["CompositeInvoker#before",
30
- "Cmd1#before", "Cmd1#execute", "Cmd1#after",
31
- "Cmd23#before",
32
- "Cmd23#execute:start",
33
- "Cmd2#before", "Cmd2#execute", "Cmd2#after",
34
- "Cmd3#before", "Cmd3#execute", "Cmd3#after",
35
- "Cmd23#execute:end",
36
- "Cmd23#after",
37
- "Cmd4#before", "Cmd4#execute", "Cmd4#after",
38
- "CompositeInvoker#after"]
39
- end
40
- end
41
-
42
23
  describe ".execute" do
43
24
  it "should call its and sub commands's {before,execute,after} in declared order" do
44
25
  c = CompositeInvoker.execute(:breadcrumbs => [])
@@ -75,13 +56,13 @@ describe Ccp::Invokers::Base do
75
56
  end
76
57
  end
77
58
 
78
- describe ".benchmark" do
59
+ describe ".execute" do
79
60
  it "should call its and sub commands's {before,execute,after} in declared order" do
80
61
  r = Ccp::Receivers::Base.new
81
62
  r.stub!(:show_comments) # disable output
82
63
  r.stub!(:show_profiles) # disable output
83
64
 
84
- c = CompositeInvoker.benchmark(:receiver => r, :breadcrumbs => [])
65
+ c = CompositeInvoker.execute(:receiver => r, :breadcrumbs => [])
85
66
  c.data[:breadcrumbs].should ==
86
67
  ["CompositeInvoker#before",
87
68
  "Cmd1#before", "Cmd1#execute", "Cmd1#after",
@@ -98,22 +79,20 @@ describe Ccp::Invokers::Base do
98
79
  it "should call only show_comments in default" do
99
80
  r = Ccp::Receivers::Base.new
100
81
  r.should_receive(:show_comments).once
101
- r.should_receive(:show_profiles).once
102
- CompositeInvoker.benchmark(:receiver => r, :breadcrumbs => [])
82
+ r.should_receive(:show_profiles).never
83
+ CompositeInvoker.execute(:receiver => r, :breadcrumbs => [])
103
84
  end
104
85
 
105
- it "should disable show_profiles if :profile option is false" do
86
+ it "should disable show_profiles if :profile option is set" do
106
87
  r = Ccp::Receivers::Base.new
107
- r.should_receive(:show_comments).once
108
- r.should_receive(:show_profiles).never
109
- CompositeInvoker.benchmark(:receiver => r, :breadcrumbs => [], :profile => false)
88
+ r.should_receive(:show_profiles).once
89
+ CompositeInvoker.execute(:receiver => r, :breadcrumbs => [], :profile => true)
110
90
  end
111
91
 
112
92
  it "should disable show_comments if :comment option is false" do
113
93
  r = Ccp::Receivers::Base.new
114
94
  r.should_receive(:show_comments).never
115
- r.should_receive(:show_profiles).once
116
- CompositeInvoker.benchmark(:receiver => r, :breadcrumbs => [], :comment => false)
95
+ CompositeInvoker.execute(:receiver => r, :breadcrumbs => [], :comment => false)
117
96
  end
118
97
  end
119
98
  end
@@ -0,0 +1,47 @@
1
+ require "spec_helper"
2
+
3
+ describe Ccp::Commands::Base do
4
+ describe ".execute(:save_fixture=>true)" do
5
+ class TSFC # TestSaveFixtureCmd
6
+ include Ccp::Commands::Core
7
+
8
+ def execute
9
+ data[:a] # read
10
+ data[:x] = 10 # write
11
+ end
12
+ end
13
+
14
+ def load_yaml(path)
15
+ YAML.load(Pathname(path).read{})
16
+ end
17
+
18
+ def truncate(path)
19
+ require 'fileutils'
20
+ FileUtils.rm_rf(path.to_s)
21
+ end
22
+
23
+ it "should generate in/out fixtures in tmp/fixtures" do
24
+ path = Pathname("tmp/fixtures")
25
+ data = {:a=>"a", :b=>"b", :x=>1, :y=>2}
26
+ opts = {:save_fixture=>true}
27
+
28
+ truncate(path)
29
+ TSFC.execute(data.merge(opts))
30
+
31
+ load_yaml(path + "tsfc/in.yaml" ).should == {:a=>"a"}
32
+ load_yaml(path + "tsfc/out.yaml").should == {:x=>10}
33
+ end
34
+
35
+ it "should generate in/out fixtures in <save_fixture_dir>" do
36
+ path = Pathname("tmp/test/fixtures")
37
+ data = {:a=>"a", :b=>"b", :x=>1, :y=>2}
38
+ opts = {:save_fixture=>true, :save_fixture_dir=>path}
39
+
40
+ truncate(path)
41
+ TSFC.execute(data.merge(opts))
42
+
43
+ load_yaml(path + "tsfc/in.yaml" ).should == {:a=>"a"}
44
+ load_yaml(path + "tsfc/out.yaml").should == {:x=>10}
45
+ end
46
+ end
47
+ end
@@ -5,3 +5,10 @@ require 'rspec'
5
5
  require 'ccp'
6
6
 
7
7
  require File.join(File.dirname(__FILE__), "models")
8
+
9
+ def breadcrumbs_receiver
10
+ r = Ccp::Receivers::Base.new
11
+ r.data[:breadcrumbs] = []
12
+ return r
13
+ end
14
+
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: 17
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 5
10
- version: 0.1.5
9
+ - 7
10
+ version: 0.1.7
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-03-09 00:00:00 +09:00
18
+ date: 2012-05-01 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -26,18 +26,34 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- hash: 31
29
+ hash: 17
30
30
  segments:
31
31
  - 0
32
32
  - 1
33
- - 2
34
- version: 0.1.2
33
+ - 5
34
+ version: 0.1.5
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
38
- name: dsl_accessor
38
+ name: must
39
39
  prerelease: false
40
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 25
46
+ segments:
47
+ - 0
48
+ - 2
49
+ - 7
50
+ version: 0.2.7
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: dsl_accessor
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
41
57
  none: false
42
58
  requirements:
43
59
  - - ">="
@@ -49,11 +65,11 @@ dependencies:
49
65
  - 0
50
66
  version: 0.4.0
51
67
  type: :runtime
52
- version_requirements: *id002
68
+ version_requirements: *id003
53
69
  - !ruby/object:Gem::Dependency
54
70
  name: rspec
55
71
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
72
+ requirement: &id004 !ruby/object:Gem::Requirement
57
73
  none: false
58
74
  requirements:
59
75
  - - ">="
@@ -63,7 +79,7 @@ dependencies:
63
79
  - 0
64
80
  version: "0"
65
81
  type: :development
66
- version_requirements: *id003
82
+ version_requirements: *id004
67
83
  description: CCP
68
84
  email:
69
85
  - maiha@wota.jp
@@ -91,21 +107,29 @@ files:
91
107
  - lib/ccp/commands/receivable.rb
92
108
  - lib/ccp/commands/resolvable.rb
93
109
  - lib/ccp/data.rb
110
+ - lib/ccp/fixtures.rb
111
+ - lib/ccp/fixtures/observer.rb
112
+ - lib/ccp/fixtures/writers.rb
94
113
  - lib/ccp/invokers.rb
95
114
  - lib/ccp/invokers/base.rb
96
115
  - lib/ccp/receivers.rb
116
+ - lib/ccp/receivers/aroundable.rb
97
117
  - lib/ccp/receivers/base.rb
98
118
  - lib/ccp/receivers/commentable.rb
119
+ - lib/ccp/receivers/executable.rb
99
120
  - lib/ccp/receivers/global.rb
100
121
  - lib/ccp/receivers/none.rb
101
122
  - lib/ccp/receivers/profileable.rb
123
+ - lib/ccp/receivers/save_fixture.rb
102
124
  - lib/ccp/version.rb
103
125
  - spec/commands_base_spec.rb
104
126
  - spec/commands_composite_spec.rb
105
127
  - spec/commands_core_spec.rb
128
+ - spec/commands_executable_spec.rb
106
129
  - spec/data_spec.rb
107
130
  - spec/invokers_spec.rb
108
131
  - spec/models.rb
132
+ - spec/save_fixture_spec.rb
109
133
  - spec/spec_helper.rb
110
134
  has_rdoc: true
111
135
  homepage: http://github.com/maiha/ccp