magic_lamp 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +163 -33
- data/VERSION +1 -0
- data/app/assets/javascripts/magic_lamp/genie.js +1 -1
- data/lib/magic_lamp.rb +50 -39
- data/lib/magic_lamp/configuration.rb +2 -1
- data/lib/magic_lamp/constants.rb +24 -0
- data/lib/magic_lamp/defaults_manager.rb +62 -0
- data/lib/magic_lamp/fixture_creator.rb +13 -3
- data/lib/magic_lamp/version.rb +1 -1
- data/spec/dummy/app/views/orders/needs_extending.html.erb +2 -0
- data/spec/dummy/log/development.log +51060 -0
- data/spec/dummy/log/test.log +244175 -0
- data/spec/dummy/spec/magical/a_lamp_file_with_a_different_name_lamp.rb +57 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/04a1e26a9e3fde1f448cb2a9d382fbbc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/09bc89d8ac4ccacfcf2f4db466e7735f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0b3144442052dbb8af7f57ca27cd7a15 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/18650d8ff9b0a83b32e55b58917ec791 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/292405ba7ff52dbb279572aee49ba174 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2ccef21649a61deac2c84f622753b77b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/32b0c6aea545968d6da4939bcbab9b5e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3823434d99b44359ee75dffba2817055 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3a2dd1069a3d0cd57769e33920561e09 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3c8cdd0e5d5eee39df490048c656a2c5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/40f78fd7fa893a3ba0bb52949d4d6e21 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/51333e0ed6511483c511470803d3803a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5b03eeac2e4ecbaaf227c5aa35808fee +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5bbf09297502a156801e9c65f4bd3db7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6f968441247482ba7e1ac7ce9f34dfdb +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/759e97d6d411bc4cef7055a778e1bef3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7f5b2f45d9f12db1fb26a605759b360a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7f7dcf7837dbb7f150b7364ad7920712 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/80a68d71946643e61d91cc216f7aa32f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/86023efec2465a88617e5a47a38f1f55 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/87c6d9a5c985ccb321255862fd8c2f48 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/88fe64427f1fff8e41ca8ad0170da88a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8a0862dca044d19cadb655c53acb20ab +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8ed4b4f20fb65446181984e6df7d7c9b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8f4a370f455559b7a209ecd758a3bb3d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/96210dc070e479fcee862294afe5efc1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/972b6b0bb1fc0b1123077b4b2f4394bd +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9825272284630c2926f661645205382a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/acbd4771ecb2a173a35382fbff9317cf +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b226a96bfa85a5a853dd6566d1706231 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b2a142b210c2cbfe4a58040684b3c33c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bb57f340ac9df9041014540af079a7f3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bfa154e8a12acdbc85028ad8130d9043 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c84af5f8f55b15818667b16b15416431 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cf573b52d944e8aea7f1dc03f9be9b2c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d98de652252dc6ae11b5b6db5588705b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f0aa53eb377a5d7cc83657ef33b02d25 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f12e838fbbcc1647156ec47ebbeaac9a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f30abc368796858ff89a5ff6daf33e6a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f5d1b7d2ec1c89dc32cc982b43502dc8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f5e8036e8de24870e4db21ccb209e272 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f6256b2e4e609981d9eb420aae5bef46 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f62fb3331d14ad448ad997f1fbdb7e23 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/fd203e335fb22b3109d0354b99f45c6e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/fdc3718e0a84d340a897f87179d95c84 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/javascripts/genie_spec.js +12 -2
- data/spec/javascripts/magic_lamp_spec.js +14 -1
- data/spec/lib/callbacks_spec.rb +1 -2
- data/spec/lib/configuration_spec.rb +8 -8
- data/spec/lib/defaults_manager_spec.rb +160 -0
- data/spec/lib/fixture_creator_spec.rb +31 -8
- data/spec/lib/magic_lamp_spec.rb +147 -54
- data/spec/lib/render_catcher_spec.rb +1 -2
- data/spec/spec_helper.rb +26 -0
- data/spec/tasks/fixture_names_task_spec.rb +4 -12
- data/spec/tasks/lint_task_spec.rb +4 -10
- metadata +40 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b87fe861fd4ccfea4db716756adf4f5a04d7e645
|
4
|
+
data.tar.gz: cfd72a4b279d340905dea883d6f2c181d1a07e76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 648a7ad1efcc83b2f452fc866235f200ffa203f450c8f970efb8f098e3caf264e502fe8bde2ede4490f0a5d008ad8291f32f7a5ecc78ed31d17761f1bdbcb68f
|
7
|
+
data.tar.gz: d2e5fadd3b8b04c55b3f4809a5e4b0cc004638232166ac8134119c93a6d1dab895a1ff9b75de736f130f17925e2c914235f8b00198f711c3b24c40ee8acb28ab
|
data/README.md
CHANGED
@@ -48,15 +48,14 @@ Then drop this:
|
|
48
48
|
```js
|
49
49
|
//= require magic_lamp
|
50
50
|
```
|
51
|
-
at the top of your `spec_helper.js` (assuming
|
52
|
-
|
51
|
+
at the top of your `spec_helper.js` (assuming you're using [Teaspoon](https://github.com/modeset/teaspoon) or another JavaScript spec runner for Rails that allows the use of Sprockets directives).
|
52
|
+
|
53
|
+
(I highly recommend that you use [Teaspoon](https://github.com/modeset/teaspoon) as your JavaScript spec runner.)
|
53
54
|
|
54
55
|
Now you've got the basic setup.
|
55
56
|
|
56
57
|
In case you need it, [here's an example app](https://github.com/crismali/magic_lamp/tree/master/example).
|
57
58
|
|
58
|
-
Note: I highly recommend that you use [Teaspoon](https://github.com/modeset/teaspoon) as your JavaScript spec runner.
|
59
|
-
|
60
59
|
### With Database Cleaner
|
61
60
|
|
62
61
|
You don't need [Database Cleaner](https://github.com/DatabaseCleaner/database_cleaner) to use this gem, but this is probably the setup most people want.
|
@@ -78,8 +77,7 @@ MagicLamp.configure do |config|
|
|
78
77
|
end
|
79
78
|
end
|
80
79
|
```
|
81
|
-
in a file called `magic_lamp_config.rb` which you can place anywhere in your `spec` or `test` directories.
|
82
|
-
configure Magic Lamp in your `teaspoon_env.rb` file as well.
|
80
|
+
in a file called `magic_lamp_config.rb` which you can place anywhere in your `spec` or `test` directories.
|
83
81
|
|
84
82
|
This way you can take advantage of `after_create` callbacks for your fixture setup without polluting
|
85
83
|
your database every time you run your JavaScript specs.
|
@@ -90,19 +88,19 @@ Magic Lamp will load all files in your `spec` or `test` directory that end with
|
|
90
88
|
"lamp files). I'd recommend starting with a single `magic_lamp.rb` file and breaking it into smaller
|
91
89
|
files once it gets unwieldy (one for each controller would be a good approach).
|
92
90
|
|
93
|
-
In your lamp files you just call [`MagicLamp.
|
91
|
+
In your lamp files you just call [`MagicLamp.fixture`](#fixture) like so:
|
94
92
|
```ruby
|
95
|
-
MagicLamp.
|
93
|
+
MagicLamp.fixture do
|
96
94
|
@order = Order.new
|
97
95
|
render partial: "orders/form"
|
98
96
|
end
|
99
97
|
```
|
100
|
-
Inside the block you pass to `
|
101
|
-
can set up any instance variables your templates depend on. In this case we're
|
102
|
-
default controller which is your `ApplicationController`. We're also
|
103
|
-
name for the fixture which is whatever `render` receives to
|
104
|
-
the symbol or string argument to `render` or
|
105
|
-
key in the argument hash).
|
98
|
+
Inside the block you pass to `fixture` you're in the scope of a controller so you
|
99
|
+
can set up any instance variables your templates depend on. In this case we're
|
100
|
+
using the default controller which is your `ApplicationController`. We're also
|
101
|
+
using the default name for the fixture which is whatever `render` receives to
|
102
|
+
identify the template (ie the symbol or string argument to `render` or
|
103
|
+
whatever is at the `:template` or `:partial` key in the argument hash).
|
106
104
|
|
107
105
|
`render` here also works normally except that it won't render the layout by default.
|
108
106
|
|
@@ -112,14 +110,14 @@ beforeEach(function() {
|
|
112
110
|
MagicLamp.load("orders/form");
|
113
111
|
});
|
114
112
|
```
|
115
|
-
which will put the `orders/form` partial in a div with a class of `magic-lamp
|
116
|
-
can go nuts testing your JavaScript against your actual template. If you'd like to only make
|
113
|
+
which will put the `orders/form` partial in a div with a class of `magic-lamp` (this all happens synchronously).
|
114
|
+
Then you can go nuts testing your JavaScript against your actual template. If you'd like to only make
|
117
115
|
one request for your templates, simply call [`MagicLamp.preload();`](#preload) in your `spec_helper.js` to
|
118
116
|
populate Magic Lamp's cache.
|
119
117
|
|
120
118
|
### A few more examples
|
121
119
|
Here we're specifying which controller should render the template via the arguments hash
|
122
|
-
to `
|
120
|
+
to `fixture`. This gives us access to helper methods in the `fixture` block
|
123
121
|
and in the template. It also means we don't need a fully qualified path to the rendered template
|
124
122
|
or partial.
|
125
123
|
|
@@ -128,17 +126,17 @@ to render the template the fixture will be named "orders/order".
|
|
128
126
|
|
129
127
|
We're also taking advantage of `render`'s `:collection` option.
|
130
128
|
```ruby
|
131
|
-
MagicLamp.
|
129
|
+
MagicLamp.fixture(controller: OrdersController) do
|
132
130
|
orders = 3.times.map { Order.new }
|
133
131
|
render partial: "order", collection: orders
|
134
132
|
end
|
135
133
|
```
|
136
134
|
|
137
|
-
Here we're specifying a name with the `:name` option that's passed to `
|
135
|
+
Here we're specifying a name with the `:name` option that's passed to `fixture`.
|
138
136
|
This way we can load the fixture in our JavaScript with `MagicLamp.load("custom/name")` instead
|
139
|
-
of the default `MagicLamp.load("orders/foo")`. Custom names for fixtures must be url safe strings.
|
137
|
+
of the default `MagicLamp.load("orders/foo")`. Custom names for fixtures must be url safe strings. We're also extending the controller and its view with the `AuthStub` module to stub some methods that we don't want executing in our fixtures.
|
140
138
|
```ruby
|
141
|
-
MagicLamp.
|
139
|
+
MagicLamp.fixture(name: "custom/name", extend: AuthStub) do
|
142
140
|
render "orders/foo"
|
143
141
|
end
|
144
142
|
```
|
@@ -146,12 +144,50 @@ end
|
|
146
144
|
Here we're specifying both a controller and custom name. We're also setting the `params[:foo]`
|
147
145
|
mostly to demonstrate that we have access to all of the usual controller methods.
|
148
146
|
```ruby
|
149
|
-
MagicLamp.
|
147
|
+
MagicLamp.fixture(controller: OrdersController, name: "other_custom_name") do
|
150
148
|
params[:foo] = "test"
|
151
149
|
render :foo
|
152
150
|
end
|
153
151
|
```
|
154
152
|
If you're interested, [here's an example app](https://github.com/crismali/magic_lamp/tree/master/example).
|
153
|
+
|
154
|
+
### Drying up your fixtures
|
155
|
+
If you have several fixtures that depend on the same setup (same controller, extensions, etc), you can use the `define` method to dry things up:
|
156
|
+
|
157
|
+
```ruby
|
158
|
+
MagicLamp.define(controller: OrdersController, extend: AuthStub) do
|
159
|
+
fixture do # orders/new
|
160
|
+
@order = Order.new
|
161
|
+
render :new
|
162
|
+
end
|
163
|
+
|
164
|
+
fixture(name: "customized_new") do # orders/customized_new
|
165
|
+
session[:custom_user_info] = "likes movies"
|
166
|
+
@order = Order.new
|
167
|
+
render :new
|
168
|
+
end
|
169
|
+
|
170
|
+
fixture do # orders/form
|
171
|
+
@order = Order.new
|
172
|
+
render partial: :form
|
173
|
+
end
|
174
|
+
|
175
|
+
define(namespace: "errors", extend: DeadBeatUserStub)
|
176
|
+
fixture(name: "form_without_price") do # orders/errors/form_without_price
|
177
|
+
@order = Order.new
|
178
|
+
@order.errors.add(:price, "can't be blank")
|
179
|
+
render partial: :form
|
180
|
+
end
|
181
|
+
|
182
|
+
fixture do # orders/errors/form
|
183
|
+
@order = Order.new
|
184
|
+
@order.errors.add(:address, "can't be blank")
|
185
|
+
render partial: :form
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
```
|
190
|
+
|
155
191
|
Where the files go
|
156
192
|
------------------------
|
157
193
|
### Config File
|
@@ -169,57 +205,145 @@ Call `rake magic_lamp:lint` to see if there are any errors when registering or r
|
|
169
205
|
|
170
206
|
Ruby API
|
171
207
|
--------
|
172
|
-
###
|
208
|
+
### fixture
|
209
|
+
(also aliased to `register_fixture` and `register`)
|
210
|
+
|
173
211
|
It requires a block that invokes `render` which is invoked in the context of a controller.
|
174
212
|
It also takes an optional hash of arguments. The arguments hash recognizes:
|
175
213
|
* `:controller`
|
176
214
|
* specifies any controller class that you'd like to have render the template or partial.
|
177
215
|
* if specified it removes the need to pass fully qualified paths to templates to `render`
|
216
|
+
* the controller's name becomes the default `namespace`, ie `OrdersController` provides a default namespace of `orders` resulting in a template named `orders/foo`
|
178
217
|
* `:name`
|
179
218
|
* whatever you'd like name the fixture.
|
180
219
|
* Specifying this option also prevents the block from being executed twice which could be a performance win. See [configure](#configure) for more.
|
220
|
+
* `:extend`
|
221
|
+
* takes a module or an array of modules
|
222
|
+
* extends the controller and view context (via Ruby's `extend`)
|
181
223
|
Also note that only symbol keys are recognized.
|
182
224
|
|
183
|
-
`
|
225
|
+
`fixture` will also execute any callbacks you've specified. See [configure](#configure) for more.
|
184
226
|
|
185
227
|
Example:
|
186
228
|
```ruby
|
187
|
-
MagicLamp.
|
229
|
+
MagicLamp.fixture(name: "foo", controller: OrdersController) do
|
188
230
|
@order = Order.new
|
189
231
|
render partial: :form
|
190
232
|
end
|
191
233
|
```
|
234
|
+
|
235
|
+
### define
|
236
|
+
Allows you scope groups of fixtures with defaults and can be nested arbitrarily. It takes an optional hash and a required block. The hash accepts the following options:
|
237
|
+
* `:controller`
|
238
|
+
* specifies any controller class that you'd like to have render the template or partial.
|
239
|
+
* if specified it removes the need to pass fully qualified paths to templates to `render`
|
240
|
+
* the controller's name becomes the default `namespace` if no namespace is provided, ie `OrdersController` provides a default namespace of `orders` resulting in a template named `orders/foo`
|
241
|
+
* `:name`
|
242
|
+
* whatever you'd like name the fixture.
|
243
|
+
* Specifying this option also prevents the block from being executed twice which could be a performance win. See [configure](#configure) for more.
|
244
|
+
* `:extend`
|
245
|
+
* takes a module or an array of modules
|
246
|
+
* extends the controller and view context (via Ruby's `extend`)
|
247
|
+
* `:namespace`
|
248
|
+
* namespaces all fixtures defined within it
|
249
|
+
* overrides the default controller namespace if passed
|
250
|
+
Also note that only symbol keys are recognized.
|
251
|
+
|
252
|
+
Inside of the block you can nest more calls to `define` and create fixtures
|
253
|
+
via the `fixture` method or one of its aliases.
|
254
|
+
|
255
|
+
Example:
|
256
|
+
```ruby
|
257
|
+
module DefinesFoo
|
258
|
+
def foo
|
259
|
+
"foo!"
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
module AlsoDefinesFoo
|
264
|
+
def foo
|
265
|
+
"also foo!"
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
MagicLamp.define(controller: OrdersController, extend: DefinesFoo) do
|
270
|
+
|
271
|
+
fixture do # orders/edit
|
272
|
+
foo #=> "foo!"
|
273
|
+
@order = Order.create!
|
274
|
+
render :edit
|
275
|
+
end
|
276
|
+
|
277
|
+
fixture do # orders/new
|
278
|
+
foo #=> "foo!"
|
279
|
+
@order = Order.new
|
280
|
+
render :new
|
281
|
+
end
|
282
|
+
|
283
|
+
define(namespace: "errors", extend: AlsoDefinesFoo) do
|
284
|
+
|
285
|
+
fixture do # orders/errors/edit
|
286
|
+
foo #=> "also foo!"
|
287
|
+
@order = Order.create!
|
288
|
+
@order.errors.add(:price, "Can't be negative")
|
289
|
+
render :edit
|
290
|
+
end
|
291
|
+
|
292
|
+
fixture(extend: DefinesFoo) do # orders/errors/new
|
293
|
+
foo #=> "foo!"
|
294
|
+
@order = Order.new
|
295
|
+
@order.errors.add(:price, "Can't be negative")
|
296
|
+
render :new
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
```
|
301
|
+
|
192
302
|
### configure
|
193
303
|
It requires a block to which it yields the configuration object. Here you can set:
|
194
304
|
* `before_each`
|
195
305
|
* takes a block
|
196
306
|
* defaults to `nil`
|
197
|
-
* called before each block you pass to `
|
307
|
+
* called before each block you pass to `fixture` is executed
|
198
308
|
* note: if you call it a second time with a second block, only the second block will be executed
|
199
309
|
* `after_each`
|
200
310
|
* takes a block
|
201
311
|
* defaults to `nil`
|
202
|
-
* called after each block you pass to `
|
312
|
+
* called after each block you pass to `fixture` is executed
|
203
313
|
* note: if you call it a second time with a second block, only the second block will be executed
|
314
|
+
* `global_defaults`
|
315
|
+
* can be set to a hash of default options that every fixture generated will inherit from. Options passed to `define` and `fixture` take precedence.
|
316
|
+
* accepts all of the keys `define` accepts
|
204
317
|
* `infer_names`
|
205
318
|
* defaults to `true`
|
206
319
|
* if set to true, Magic Lamp will try to infer the name of the fixture when not provided with a name parameter.
|
207
|
-
* if set to false, the name parameter becomes required for `MagicLamp.
|
320
|
+
* if set to false, the name parameter becomes required for `MagicLamp.fixture` (this can be done to improve performance or force your team to be more explicit)
|
208
321
|
|
209
322
|
Example:
|
210
323
|
|
211
324
|
```ruby
|
325
|
+
module AuthStub
|
326
|
+
def current_user
|
327
|
+
@current_user ||= User.create!(
|
328
|
+
email: "foo@example.com",
|
329
|
+
password: "password"
|
330
|
+
)
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
212
334
|
MagicLamp.configure do |config|
|
213
335
|
|
214
|
-
# if you want to require the name parameter for `
|
336
|
+
# if you want to require the name parameter for the `fixture` method
|
215
337
|
config.infer_names = false
|
216
338
|
|
339
|
+
config.global_defaults = { extend: AuthStub }
|
340
|
+
|
217
341
|
config.before_each do
|
218
|
-
puts "I appear before the block passed to
|
342
|
+
puts "I appear before the block passed to `fixture` executes!"
|
219
343
|
end
|
220
344
|
|
221
345
|
config.after_each do
|
222
|
-
puts "I appear after the block passed to
|
346
|
+
puts "I appear after the block passed to `fixture` executes!"
|
223
347
|
end
|
224
348
|
end
|
225
349
|
```
|
@@ -245,6 +369,8 @@ container if present so you never end up with duplicate fixture containers or en
|
|
245
369
|
dom elements from previous loads. It will hit the network only on the first request for a given
|
246
370
|
fixture. If you never want `load` to hit the network, call `MagicLamp.preload()` before your specs.
|
247
371
|
|
372
|
+
The call to get your template is completely synchronous.
|
373
|
+
|
248
374
|
Example:
|
249
375
|
```js
|
250
376
|
beforeEach(function() {
|
@@ -256,6 +382,8 @@ Call `MagicLamp.preload` to load all of your templates into MagicLamp's cache. T
|
|
256
382
|
only hit the network once, so the rest of your specs will be quicker and you can go wild stubbing the
|
257
383
|
network.
|
258
384
|
|
385
|
+
The call to get your templates is completely synchronous.
|
386
|
+
|
259
387
|
Example:
|
260
388
|
```js
|
261
389
|
// Probably should be in your `spec_helper.js`
|
@@ -310,8 +438,10 @@ Sweet aliases
|
|
310
438
|
### Ruby
|
311
439
|
|
312
440
|
```ruby
|
313
|
-
MagicLamp.
|
314
|
-
MagicLamp.
|
441
|
+
MagicLamp.register_fixture => fixture
|
442
|
+
MagicLamp.register => fixture
|
443
|
+
MagicLamp.rub => fixture
|
444
|
+
MagicLamp.wish => fixture
|
315
445
|
```
|
316
446
|
|
317
447
|
### JavaScript
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.1.0
|
@@ -76,7 +76,7 @@
|
|
76
76
|
if (this.xhrStatus(xhr) === 400) {
|
77
77
|
this.handleError(xhr.responseText);
|
78
78
|
} else if (this.xhrStatus(xhr) === 500) {
|
79
|
-
this.handleError('Something went wrong
|
79
|
+
this.handleError('Something went wrong, please check the server log or run `rake magic_lamp:lint` for more information');
|
80
80
|
}
|
81
81
|
return xhr;
|
82
82
|
},
|
data/lib/magic_lamp.rb
CHANGED
@@ -1,34 +1,18 @@
|
|
1
1
|
require "rake"
|
2
2
|
|
3
|
+
require "magic_lamp/engine"
|
4
|
+
require "magic_lamp/constants"
|
3
5
|
require "magic_lamp/callbacks"
|
4
6
|
|
5
7
|
require "magic_lamp/configuration"
|
8
|
+
require "magic_lamp/defaults_manager"
|
6
9
|
require "magic_lamp/fixture_creator"
|
7
10
|
require "magic_lamp/render_catcher"
|
8
|
-
require "magic_lamp/engine"
|
9
11
|
|
10
12
|
require "tasks/lint_task"
|
11
13
|
require "tasks/fixture_names_task"
|
12
14
|
|
13
15
|
module MagicLamp
|
14
|
-
LAMP = "_lamp"
|
15
|
-
SPEC = "spec"
|
16
|
-
STARS = "**"
|
17
|
-
TEST = "test"
|
18
|
-
Genie = Engine
|
19
|
-
|
20
|
-
class AmbiguousFixtureNameError < StandardError
|
21
|
-
end
|
22
|
-
|
23
|
-
class UnregisteredFixtureError < StandardError
|
24
|
-
end
|
25
|
-
|
26
|
-
class AlreadyRegisteredFixtureError < StandardError
|
27
|
-
end
|
28
|
-
|
29
|
-
class ArgumentError < StandardError
|
30
|
-
end
|
31
|
-
|
32
16
|
class << self
|
33
17
|
attr_accessor :registered_fixtures, :configuration
|
34
18
|
|
@@ -36,20 +20,25 @@ module MagicLamp
|
|
36
20
|
Rails.root.join(directory_path)
|
37
21
|
end
|
38
22
|
|
39
|
-
def register_fixture(options = {}, &
|
40
|
-
|
41
|
-
|
42
|
-
|
23
|
+
def register_fixture(options = {}, &render_block)
|
24
|
+
raise_missing_block_error(render_block, __method__)
|
25
|
+
|
26
|
+
options[:controller] ||= ::ApplicationController
|
27
|
+
options[:namespace] ||= options[:controller].controller_name
|
28
|
+
options[:extend] = Array(options[:extend])
|
29
|
+
options[:render_block] = render_block
|
30
|
+
fixture_name = namespaced_fixture_name_or_raise(options)
|
43
31
|
|
44
32
|
if registered?(fixture_name)
|
45
33
|
raise AlreadyRegisteredFixtureError, "a fixture called '#{fixture_name}' has already been registered"
|
46
34
|
end
|
47
35
|
|
48
|
-
registered_fixtures[fixture_name] =
|
36
|
+
registered_fixtures[fixture_name] = options
|
49
37
|
end
|
50
38
|
|
51
|
-
|
52
|
-
|
39
|
+
REGISTER_FIXTURE_ALIASES.each do |method_name|
|
40
|
+
alias_method method_name, :register_fixture
|
41
|
+
end
|
53
42
|
|
54
43
|
def configure(&block)
|
55
44
|
raise_missing_block_error(block, __method__)
|
@@ -57,6 +46,13 @@ module MagicLamp
|
|
57
46
|
block.call(configuration)
|
58
47
|
end
|
59
48
|
|
49
|
+
def define(options = {}, &block)
|
50
|
+
raise_missing_block_error(block, __method__)
|
51
|
+
defaults_manager = DefaultsManager.new(configuration, options)
|
52
|
+
defaults_manager.instance_eval(&block)
|
53
|
+
defaults_manager
|
54
|
+
end
|
55
|
+
|
60
56
|
def registered?(fixture_name)
|
61
57
|
registered_fixtures.key?(fixture_name)
|
62
58
|
end
|
@@ -75,8 +71,8 @@ module MagicLamp
|
|
75
71
|
unless registered?(fixture_name)
|
76
72
|
raise UnregisteredFixtureError, "'#{fixture_name}' is not a registered fixture"
|
77
73
|
end
|
78
|
-
controller_class, block = registered_fixtures[fixture_name]
|
79
|
-
FixtureCreator.new(configuration).generate_template(controller_class, &block)
|
74
|
+
controller_class, block, extensions = registered_fixtures[fixture_name].values_at(:controller, :render_block, :extend)
|
75
|
+
FixtureCreator.new(configuration).generate_template(controller_class, extensions, &block)
|
80
76
|
end
|
81
77
|
|
82
78
|
def generate_all_fixtures
|
@@ -88,6 +84,32 @@ module MagicLamp
|
|
88
84
|
|
89
85
|
private
|
90
86
|
|
87
|
+
def namespaced_fixture_name_or_raise(options)
|
88
|
+
fixture_name = options.delete(:name)
|
89
|
+
controller_class, render_block = options.values_at(:controller, :render_block)
|
90
|
+
fixture_name = fixture_name_or_raise(fixture_name, controller_class, render_block)
|
91
|
+
namespace_fixture_name(fixture_name, options[:namespace])
|
92
|
+
end
|
93
|
+
|
94
|
+
def namespace_fixture_name(fixture_name, namespace)
|
95
|
+
namespace_without_application = strip_application(namespace)
|
96
|
+
full_name = compose_full_name(namespace_without_application, fixture_name)
|
97
|
+
|
98
|
+
full_name.split(FORWARD_SLASH).each do |namespace_piece|
|
99
|
+
namespace_piece_doubled = [namespace_piece, namespace_piece].join(FORWARD_SLASH)
|
100
|
+
full_name.gsub!(namespace_piece_doubled, namespace_piece)
|
101
|
+
end
|
102
|
+
full_name
|
103
|
+
end
|
104
|
+
|
105
|
+
def strip_application(namespace)
|
106
|
+
namespace.gsub(APPLICATION_MATCHER, EMPTY_STRING)
|
107
|
+
end
|
108
|
+
|
109
|
+
def compose_full_name(namespace, fixture_name)
|
110
|
+
[namespace, fixture_name].select(&:present?).join(FORWARD_SLASH)
|
111
|
+
end
|
112
|
+
|
91
113
|
def fixture_name_or_raise(fixture_name, controller_class, block)
|
92
114
|
if fixture_name.nil? && configuration.infer_names
|
93
115
|
default_fixture_name(controller_class, block)
|
@@ -118,7 +140,6 @@ module MagicLamp
|
|
118
140
|
if fixture_name.blank?
|
119
141
|
raise AmbiguousFixtureNameError, "Unable to infer fixture name"
|
120
142
|
end
|
121
|
-
fixture_name = prepend_controller_name(fixture_name, controller_class)
|
122
143
|
fixture_name
|
123
144
|
end
|
124
145
|
|
@@ -135,16 +156,6 @@ module MagicLamp
|
|
135
156
|
end
|
136
157
|
end
|
137
158
|
|
138
|
-
def prepend_controller_name(fixture_name, controller_class)
|
139
|
-
controller_name = controller_class.controller_name
|
140
|
-
controller_name_regex = Regexp.new("\\A#{controller_name}")
|
141
|
-
if controller_name == "application" || fixture_name.match(controller_name_regex)
|
142
|
-
fixture_name
|
143
|
-
else
|
144
|
-
"#{controller_name}/#{fixture_name}"
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
159
|
def directory_path
|
149
160
|
Dir.exist?(Rails.root.join(SPEC)) ? SPEC : TEST
|
150
161
|
end
|