ianwhite-pickle 0.1.9 → 0.1.10
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/History.txt +7 -0
- data/README.rdoc +195 -0
- data/lib/pickle/version.rb +1 -1
- data/rails_generators/pickle/pickle_generator.rb +1 -1
- data/rails_generators/pickle/templates/paths.rb +14 -14
- metadata +3 -3
data/History.txt
CHANGED
data/README.rdoc
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
= {ianwhite}[http://github.com/ianwhite] / {pickle}[http://github.com/ianwhite/pickle] >>{info}[http://ianwhite.github.com/pickle] >>{api}[http://ianwhite.github.com/pickle/doc]
|
2
|
+
|
3
|
+
Pickle gives you cucumber steps that create your models easily from factory-girl or
|
4
|
+
machinist factories/blueprints. You can also just use ActiveRecord but it's not as cool.
|
5
|
+
|
6
|
+
References to the models are stored, not necessarily for the purpose of checking the db
|
7
|
+
(although you could use it for that), but for enabling easy reference to urls, and for
|
8
|
+
building complex givens which require a bunch of models collaborating
|
9
|
+
|
10
|
+
== Install
|
11
|
+
|
12
|
+
Install pickle either as a rails plugin, or a gem
|
13
|
+
|
14
|
+
# plugin
|
15
|
+
script/plugin install git://github.com/ianwhite/pickle.git
|
16
|
+
|
17
|
+
# or, plugin as submodule
|
18
|
+
git submodule add git://github.com/ianwhite/pickle.git vendor/plugins/pickle
|
19
|
+
|
20
|
+
# or, gem
|
21
|
+
sudo gem install ianwhite-pickle
|
22
|
+
|
23
|
+
== Get Started
|
24
|
+
|
25
|
+
(you'd better install cucumber)
|
26
|
+
|
27
|
+
script/generate pickle [paths] [email]
|
28
|
+
|
29
|
+
Now have a look at <tt>features/step_definitions/pickle_steps.rb</tt>
|
30
|
+
|
31
|
+
If you want path steps and email steps then just add 'paths' and/or 'email'. The code/steps will be
|
32
|
+
written to <tt>features/env/paths.rb</tt> and
|
33
|
+
<tt>features/step_definitions/email_steps.rb</tt> respectively.
|
34
|
+
|
35
|
+
=== Using with plain ole Active Record
|
36
|
+
|
37
|
+
If you have an AR called 'Post', with required fields 'title', and 'body', then you can now write
|
38
|
+
steps like this
|
39
|
+
|
40
|
+
Given a post exists with title: "My Post", body: "My body"
|
41
|
+
|
42
|
+
=== Using with factory-girl or machinist
|
43
|
+
|
44
|
+
But you're using Machinist or FactoryGirl right?! To leverage all of the factories/blueprints
|
45
|
+
you've written, you can just do stuff like
|
46
|
+
|
47
|
+
Given a user exists
|
48
|
+
And another user exists with role: "admin"
|
49
|
+
|
50
|
+
# later
|
51
|
+
Then a user should exist with name: "Fred"
|
52
|
+
And that user should be activated # this uses rspec predicate matchers
|
53
|
+
|
54
|
+
==== Machinst: require your blueprints and reset Shams
|
55
|
+
|
56
|
+
In your <tt>features/support/env.rb</tt> add the following lines at the bottom
|
57
|
+
|
58
|
+
require "#{Rails.root}/spec/blueprints" # or wherever they live
|
59
|
+
Before { Sham.reset } # reset Shams in between scenarios
|
60
|
+
|
61
|
+
=== Configuring Pickle
|
62
|
+
|
63
|
+
You can tell pickle to use another factory adapter (see Pickle::Adapter), or
|
64
|
+
create mappings from english expressions to pickle model names. You can also
|
65
|
+
override many of the options on the Pickle::Config object if you so choose
|
66
|
+
|
67
|
+
require 'pickle/world'
|
68
|
+
|
69
|
+
Pickle.configure do |config|
|
70
|
+
config.adapters = [:machinist, YourOwnAdapterClass]
|
71
|
+
config.map 'me', 'myself', 'my', 'I', :to => 'user: "me"'
|
72
|
+
end
|
73
|
+
|
74
|
+
== API
|
75
|
+
|
76
|
+
=== Steps
|
77
|
+
|
78
|
+
When you run <tt>script/generate pickle</tt> you get the following steps
|
79
|
+
|
80
|
+
==== Given steps
|
81
|
+
|
82
|
+
"Given <b>a model</b> exists", e.g.
|
83
|
+
|
84
|
+
Given a user exists
|
85
|
+
Given a user: "fred" exists
|
86
|
+
Given the user exists
|
87
|
+
|
88
|
+
"Given <b>a model</b> exists with <b>fields</b>", e.g.
|
89
|
+
|
90
|
+
Given a user exists with name: "Fred"
|
91
|
+
Given a user exists with name: "Fred", activated: false
|
92
|
+
|
93
|
+
You can refer to other models in the fields
|
94
|
+
|
95
|
+
Given a user exists
|
96
|
+
And a post exists with author: the user
|
97
|
+
|
98
|
+
Given a person: "fred" exists
|
99
|
+
And a person: "ethel" exists
|
100
|
+
And a fatherhood exists with parent: user "fred", child: user "ethel"
|
101
|
+
|
102
|
+
"Given <b>n</b> models exist", e.g.
|
103
|
+
|
104
|
+
Given 10 users exist
|
105
|
+
|
106
|
+
"Given <b>n</b> <b>models</b> exist with <b>fields</b>", examples:
|
107
|
+
|
108
|
+
Given 10 users exist with activated: false
|
109
|
+
|
110
|
+
==== Then steps
|
111
|
+
|
112
|
+
===== Asserting existence of models
|
113
|
+
|
114
|
+
"Then <b>a model</b> should exist", e.g.
|
115
|
+
|
116
|
+
Then a user should exist
|
117
|
+
|
118
|
+
"Then <b>a model</b> should exist with <b>fields</b>", e.g.
|
119
|
+
|
120
|
+
Then a user: "fred" should exist with name: "Fred" # we can label the found user for later use
|
121
|
+
|
122
|
+
You can use other models, booleans, numerics, and strings as fields
|
123
|
+
|
124
|
+
Then a person should exist with child: person "ethel"
|
125
|
+
Then a user should exist with activated: false
|
126
|
+
Then a user should exist with activated: true, email: "fred@gmail.com"
|
127
|
+
|
128
|
+
"Then <b>n</b> <b>models</b> should exist", e.g.
|
129
|
+
|
130
|
+
Then 10 events should exist
|
131
|
+
|
132
|
+
"Then <b>n</b> <b>models</b> should exist with <b>fields</b>", e.g.
|
133
|
+
|
134
|
+
Then 2 people should exist with father: person "fred"
|
135
|
+
|
136
|
+
===== Asserting associations
|
137
|
+
|
138
|
+
One-to-one assocs: "Then <b>a model</b> should be <b>other model</b>'s <b>association</b>", e.g.
|
139
|
+
|
140
|
+
Then the person: "fred" should be person: "ethel"'s father
|
141
|
+
|
142
|
+
Many-to-one assocs: "Then <b>a model</b> should be [in|one of] <b>other model</b>'s <b>association</b>", e.g.
|
143
|
+
|
144
|
+
Then the person: "ethel" should be one of person: "fred"'s children
|
145
|
+
Then the comment should be in the post's comments
|
146
|
+
|
147
|
+
===== Asserting predicate methods
|
148
|
+
|
149
|
+
"Then <b>a model</b> should [be|have] [a|an] <b>predicate</b>", e.g.
|
150
|
+
|
151
|
+
Then the user should have a status # => user.status?.should == true
|
152
|
+
Then the car: "batmobile" should be fast # => car.fast?.should == true
|
153
|
+
|
154
|
+
"Then <b>a model</b> should [be|have] [a|an] <b>predicate</b>", e.g.
|
155
|
+
|
156
|
+
Then person: "fred" should not be childless # => fred.childless?.should == false
|
157
|
+
|
158
|
+
=== Regexps for use in your own steps
|
159
|
+
|
160
|
+
By default you get some regexps available in the main namespace for use
|
161
|
+
in creating your own steps: `capture_model`, `capture_fields`, and others (see lib/pickle.rb)
|
162
|
+
|
163
|
+
(You can use any of the regexps that Pickle uses by using the Pickle.parser namespace, see
|
164
|
+
Pickle::Parser::Matchers for the methods available)
|
165
|
+
|
166
|
+
*capture_model*
|
167
|
+
|
168
|
+
Given /^#{capture_model} exists$/ do |model_name|
|
169
|
+
model(model_name).should_not == nil
|
170
|
+
end
|
171
|
+
|
172
|
+
Then /^I should be at the (.*?) page$/ |page|
|
173
|
+
if page =~ /#{capture_model}'s/
|
174
|
+
url_for(model($1))
|
175
|
+
else
|
176
|
+
# ...
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
Then /^#{capture_model} should be one of #{capture_model}'s posts$/ do |post, forum|
|
181
|
+
model(forum).posts.should include(post)
|
182
|
+
end
|
183
|
+
|
184
|
+
*capture_fields*
|
185
|
+
|
186
|
+
This is useful for setting attributes, and knows about pickle model names so that you
|
187
|
+
can build up composite objects with ease
|
188
|
+
|
189
|
+
Given /^#{capture_model} exists with #{capture_fields}$/ do |model_name, fields|
|
190
|
+
create_model(model_name, fields)
|
191
|
+
end
|
192
|
+
|
193
|
+
# example of use
|
194
|
+
Given a user exists
|
195
|
+
And a post exists with author: the user # this step will assign the above user as :author on the post
|
data/lib/pickle/version.rb
CHANGED
@@ -19,7 +19,7 @@ class PickleGenerator < Rails::Generator::Base
|
|
19
19
|
env_assigns[:pickle_path] = true unless current_env.include?("require 'pickle/path/world'")
|
20
20
|
current_paths = File.read('features/support/paths.rb')
|
21
21
|
unless current_paths.include?('#{capture_model}')
|
22
|
-
if current_paths =~ /^(.*)(\n\s+else\n\s+raise ".*"
|
22
|
+
if current_paths =~ /^(.*)(\n\s+else\n\s+raise "Can't find.*".*$)/m
|
23
23
|
env_assigns[:current_paths_header] = $1
|
24
24
|
env_assigns[:current_paths_footer] = $2
|
25
25
|
m.template 'paths.rb', File.join('features/support', "paths.rb"), :assigns => env_assigns, :collision => :force
|
@@ -1,20 +1,20 @@
|
|
1
1
|
<%= current_paths_header %>
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
2
|
+
# added by script/generate pickle path
|
3
|
+
|
4
|
+
when /^#{capture_model}(?:'s)? page$/ # eg. the forum's page
|
5
|
+
path_to_pickle $1
|
6
|
+
|
7
|
+
when /^#{capture_model}(?:'s)? #{capture_model}(?:'s)? page$/ # eg. the forum's post's page
|
8
|
+
path_to_pickle $1, $2
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
when /^#{capture_model}(?:'s)? #{capture_model}'s (.+?) page$/ # eg. the forum's post's comments page
|
11
|
+
path_to_pickle $1, $2, :extra => $3 # or the forum's post's edit page
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
when /^#{capture_model}(?:'s)? (.+?) page$/ # eg. the forum's posts page
|
14
|
+
path_to_pickle $1, :extra => $2 # or the forum's edit page
|
15
15
|
|
16
|
-
|
17
|
-
|
16
|
+
when /^the (.+?) page$/ # translate to named route
|
17
|
+
send "#{$1.downcase.gsub(' ','_')}_path"
|
18
18
|
|
19
|
-
|
19
|
+
# end added by pickle path
|
20
20
|
<%= current_paths_footer %>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ianwhite-pickle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian White
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-02-13 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -42,7 +42,7 @@ files:
|
|
42
42
|
- rails_generators/pickle/templates/paths.rb
|
43
43
|
- rails_generators/pickle/templates/pickle_steps.rb
|
44
44
|
- License.txt
|
45
|
-
- README.
|
45
|
+
- README.rdoc
|
46
46
|
- Todo.txt
|
47
47
|
- History.txt
|
48
48
|
- spec/lib/pickle_adapter_spec.rb
|