couch_potato 0.6.0 → 0.7.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/.gitignore +0 -1
  2. data/.travis.yml +9 -1
  3. data/CHANGES.md +12 -0
  4. data/Gemfile.lock +29 -23
  5. data/MIT-LICENSE.txt +1 -1
  6. data/README.md +68 -38
  7. data/Rakefile +19 -60
  8. data/active_support_3_0.lock +4 -0
  9. data/active_support_3_1.lock +4 -0
  10. data/active_support_3_2 +4 -0
  11. data/active_support_3_2.lock +55 -0
  12. data/couch_potato.gemspec +1 -0
  13. data/lib/couch_potato/database.rb +55 -27
  14. data/lib/couch_potato/persistence/active_model_compliance.rb +6 -2
  15. data/lib/couch_potato/persistence/callbacks.rb +0 -1
  16. data/lib/couch_potato/persistence/dirty_attributes.rb +8 -17
  17. data/lib/couch_potato/persistence/json.rb +3 -2
  18. data/lib/couch_potato/persistence/properties.rb +19 -8
  19. data/lib/couch_potato/persistence/simple_property.rb +1 -3
  20. data/lib/couch_potato/persistence/type_caster.rb +7 -2
  21. data/lib/couch_potato/persistence.rb +27 -13
  22. data/lib/couch_potato/railtie.rb +1 -1
  23. data/lib/couch_potato/rspec/matchers/list_as_matcher.rb +12 -12
  24. data/lib/couch_potato/rspec/matchers/map_to_matcher.rb +8 -8
  25. data/lib/couch_potato/rspec/matchers/reduce_to_matcher.rb +10 -10
  26. data/lib/couch_potato/rspec/matchers.rb +8 -7
  27. data/lib/couch_potato/validation.rb +15 -11
  28. data/lib/couch_potato/version.rb +1 -1
  29. data/lib/couch_potato/view/base_view_spec.rb +14 -12
  30. data/lib/couch_potato/view/model_view_spec.rb +134 -39
  31. data/lib/couch_potato/view/properties_view_spec.rb +11 -7
  32. data/lib/couch_potato/view/view_query.rb +10 -9
  33. data/lib/couch_potato.rb +25 -10
  34. data/spec/callbacks_spec.rb +88 -0
  35. data/spec/create_spec.rb +22 -4
  36. data/spec/default_property_spec.rb +6 -0
  37. data/spec/property_spec.rb +81 -44
  38. data/spec/railtie_spec.rb +20 -18
  39. data/spec/spec_helper.rb +19 -1
  40. data/spec/unit/active_model_compliance_spec.rb +17 -11
  41. data/spec/unit/attributes_spec.rb +33 -10
  42. data/spec/unit/base_view_spec_spec.rb +19 -5
  43. data/spec/unit/couch_potato_spec.rb +1 -20
  44. data/spec/unit/create_spec.rb +2 -2
  45. data/spec/unit/database_spec.rb +113 -47
  46. data/spec/unit/dirty_attributes_spec.rb +19 -19
  47. data/spec/unit/model_view_spec_spec.rb +78 -1
  48. data/spec/unit/properties_view_spec_spec.rb +18 -5
  49. data/spec/unit/validation_spec.rb +1 -55
  50. data/spec/unit/view_query_spec.rb +48 -26
  51. data/spec/{custom_view_spec.rb → views_spec.rb} +59 -17
  52. metadata +88 -90
  53. data/.rvmrc +0 -1
  54. data/lib/core_ext/object.rb +0 -5
  55. data/lib/core_ext/string.rb +0 -12
  56. data/lib/core_ext/symbol.rb +0 -15
  57. data/lib/couch_potato/validation/with_active_model.rb +0 -27
  58. data/lib/couch_potato/validation/with_validatable.rb +0 -41
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  *.gem
2
2
  .bundle
3
- couch_potato_js_runner.js
4
3
  pkg
5
4
  .rvmrc
6
5
  *.swp
data/.travis.yml CHANGED
@@ -1,5 +1,13 @@
1
1
  rvm:
2
2
  - 1.9.2
3
+ - 1.9.3
3
4
  - 1.8.7
4
5
  - ree
5
- env: "DATABASE='http://couchpotato.iriscouch.com/couch_potato_test' "
6
+ gemfile:
7
+ - active_support_3_0
8
+ - active_support_3_1
9
+ - active_support_3_2
10
+ before_script:
11
+ - sudo sh -c 'echo "[native_query_servers]" >> /etc/couchdb/local.ini'
12
+ - sudo sh -c 'echo "erlang = {couch_native_process, start_link, []}" >> /etc/couchdb/local.ini'
13
+ - sudo /etc/init.d/couchdb restart
data/CHANGES.md CHANGED
@@ -1,5 +1,17 @@
1
1
  ## Changes
2
2
 
3
+ ### 0.7.0
4
+
5
+ * ActiveSupport/Rails 3.2 compatibility (Alexander Lang)
6
+ * removed Object#try, String#blank? as they are part of ActiveSupport - ActiveSupport's try behaves differently than the couch potato implementation so this change might break your app (now calling a non-existant method on a non-nil raises a NoMethodError, before it did not) (Alexander Lang)
7
+ * bulk document loading (Matthias Jakel)
8
+ * multi db support (Peter Schröder)
9
+ * hash-style access to attributes (Peter Schröder)
10
+ * support for properties of type Array, e.g. :type => [User] (Peter Schröder)
11
+ * improve compatibility with state_machine (Alexander Lang)
12
+ * allow false as default value for properties (Matthias Jakel)
13
+ * support for Erlang views (Alexander Lang)
14
+
3
15
  ### 0.6.0
4
16
 
5
17
  * ActiveSupport/Rails 3.1 compatibility (Maximilian Mack)
data/Gemfile.lock CHANGED
@@ -1,41 +1,46 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- couch_potato (0.5.7)
4
+ couch_potato (0.6.0)
5
5
  activemodel
6
6
  couchrest (>= 1.0.1)
7
- json
7
+ json (~> 1.6.0)
8
8
 
9
9
  GEM
10
10
  remote: http://rubygems.org/
11
11
  specs:
12
- activemodel (3.0.6)
13
- activesupport (= 3.0.6)
14
- builder (~> 2.1.2)
15
- i18n (~> 0.5.0)
16
- activesupport (3.0.6)
17
- builder (2.1.2)
18
- couchrest (1.0.2)
19
- json (~> 1.5.1)
12
+ activemodel (3.1.1)
13
+ activesupport (= 3.1.1)
14
+ builder (~> 3.0.0)
15
+ i18n (~> 0.6)
16
+ activesupport (3.1.1)
17
+ multi_json (~> 1.0)
18
+ builder (3.0.0)
19
+ couchrest (1.1.2)
20
20
  mime-types (~> 1.15)
21
+ multi_json (~> 1.0.0)
21
22
  rest-client (~> 1.6.1)
22
- diff-lcs (1.1.2)
23
- i18n (0.5.0)
24
- json (1.5.1)
23
+ diff-lcs (1.1.3)
24
+ i18n (0.6.0)
25
+ json (1.6.1)
26
+ libv8 (3.3.10.4)
25
27
  mime-types (1.16)
26
- rake (0.8.7)
27
- rest-client (1.6.1)
28
+ multi_json (1.0.3)
29
+ rake (0.9.2)
30
+ rest-client (1.6.7)
28
31
  mime-types (>= 1.16)
29
- rspec (2.5.0)
30
- rspec-core (~> 2.5.0)
31
- rspec-expectations (~> 2.5.0)
32
- rspec-mocks (~> 2.5.0)
33
- rspec-core (2.5.1)
34
- rspec-expectations (2.5.0)
32
+ rspec (2.6.0)
33
+ rspec-core (~> 2.6.0)
34
+ rspec-expectations (~> 2.6.0)
35
+ rspec-mocks (~> 2.6.0)
36
+ rspec-core (2.6.4)
37
+ rspec-expectations (2.6.0)
35
38
  diff-lcs (~> 1.1.2)
36
- rspec-mocks (2.5.0)
39
+ rspec-mocks (2.6.0)
40
+ therubyracer (0.10.1)
41
+ libv8 (~> 3.3.10)
37
42
  timecop (0.3.5)
38
- tzinfo (0.3.26)
43
+ tzinfo (0.3.30)
39
44
 
40
45
  PLATFORMS
41
46
  ruby
@@ -44,5 +49,6 @@ DEPENDENCIES
44
49
  couch_potato!
45
50
  rake
46
51
  rspec (>= 2.0)
52
+ therubyracer
47
53
  timecop
48
54
  tzinfo
data/MIT-LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007 Bryan Helmkamp, Seth Fitzsimmons
1
+ Copyright (c) 2012 Alexander Lang
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  ... is a persistence layer written in ruby for CouchDB.
4
4
 
5
+ [![Build Status](https://secure.travis-ci.org/langalex/couch_potato.png?branch=master)](http://travis-ci.org/langalex/couch_potato)
6
+
5
7
  ### Mission
6
8
 
7
9
  The goal of Couch Potato is to create a minimal framework in order to store and retrieve Ruby objects to/from CouchDB and create and query views.
@@ -43,15 +45,15 @@ After that you configure the name of the database:
43
45
  The server URL will default to http://localhost:5984/ unless specified:
44
46
 
45
47
  CouchPotato::Config.database_name = "http://example.com:5984/name_of_the_db"
46
-
48
+
47
49
  Or with authentication
48
-
50
+
49
51
  CouchPotato::Config.database_name = "http://username:password@example.com:5984/name_of_the_db"
50
-
51
- Optionally you can configure which framework you want to use for validations (either validatable or ActiveModel (default))
52
52
 
53
- CouchPotato::Config.validation_framework = :validatable | :active_model
54
-
53
+ Optionally you can configure the default language for design documents (:javascript (default) or :erlang).
54
+
55
+ CouchPotato::Config.default_language = :javascript | :erlang
56
+
55
57
  Another switch allows you to store each CouchDB view in its own design document. Otherwise views are grouped by model.
56
58
 
57
59
  CouchPotato::Config.split_design_documents_per_view = true
@@ -61,8 +63,8 @@ Another switch allows you to store each CouchDB view in its own design document.
61
63
  Create a config/couchdb.yml:
62
64
 
63
65
  default: &default
64
- validation_framework: :active_model # optional
65
66
  split_design_documents_per_view: true # optional
67
+ default_language: :erlang # optional
66
68
 
67
69
  development:
68
70
  <<: *default
@@ -80,7 +82,7 @@ Add to your _config/environment.rb_:
80
82
 
81
83
  config.gem 'couch_potato', :source => 'http://gemcutter.org'
82
84
  config.frameworks -= [:active_record] # if you switch completely
83
-
85
+
84
86
  #### Rails 3.x
85
87
 
86
88
  Add to your _Gemfile_:
@@ -126,8 +128,8 @@ Properties can be typed:
126
128
 
127
129
  property :address, :type => Address
128
130
  end
129
-
130
- In this case Address also implements CouchPotato::Persistence which means its JSON representation will be added to the user document.
131
+
132
+ In this case Address also implements CouchPotato::Persistence which means its JSON representation will be added to the user document.
131
133
  Couch Potato also has support for the basic types (right now Fixnum, Date, Time and :boolean are supported):
132
134
 
133
135
  class User
@@ -138,7 +140,7 @@ Couch Potato also has support for the basic types (right now Fixnum, Date, Time
138
140
  end
139
141
 
140
142
  With this in place when you set the user's age as a String (e.g. using an hTML form) it will be converted into a Fixnum automatically.
141
-
143
+
142
144
 
143
145
  Properties can have a default value:
144
146
 
@@ -157,6 +159,11 @@ You can of course also retrieve your instance:
157
159
 
158
160
  CouchPotato.database.load_document "id_of_the_user_document" # => <#User 0x3075>
159
161
 
162
+ #### Operations on multiple documents
163
+
164
+ You can also load a bunch of documents with one request.
165
+
166
+ CouchPotato.database.load ['user1', 'user2', 'user3'] # => [<#User 0x3075>, <#User 0x3076>, <#User 0x3077>]
160
167
 
161
168
  #### Properties
162
169
 
@@ -178,6 +185,12 @@ If you want to have properties that don't map to any JSON type, i.e. other than
178
185
 
179
186
  The date_of_birth property is now automatically serialized to JSON and back when storing/retrieving objects.
180
187
 
188
+ If you want to store an Array of objects, just pass the definiton as an Array of Dates:
189
+
190
+ class User
191
+ property :birthdays, :type => [Date]
192
+ end
193
+
181
194
  #### Dirty tracking
182
195
 
183
196
  CouchPotato tracks the dirty state of attributes in the same way ActiveRecord does:
@@ -208,8 +221,6 @@ Couch Potato by default uses ActiveModel for validation
208
221
  user = User.new
209
222
  user.valid? # => false
210
223
  user.errors[:name] # => ['can't be blank']
211
-
212
- If you want you can use [Validatable](http://validatable.rubyforge.org/) by setting `CouchPotato::Config.validation(http://validatable.rubyforge.org/)\_framework = :validatable`
213
224
 
214
225
  #### Finding stuff / views / lists
215
226
 
@@ -240,6 +251,16 @@ Composite keys are also possible:
240
251
  view :all, :key => [:created_at, :name]
241
252
  end
242
253
 
254
+ You can let Couch Potato generate these map/reduce functions in Erlang, which reslts in much faster view generation:
255
+
256
+ class User
257
+ property :name
258
+
259
+ view :all, :key => [:created_at, :name], :language => :erlang
260
+ end
261
+
262
+ So far only very simple views like the above work with Erlang.
263
+
243
264
  You can also pass conditions as a JavaScript string:
244
265
 
245
266
  class User
@@ -261,12 +282,12 @@ If you have larger structures and you only want to load some attributes you can
261
282
 
262
283
  CouchPotato.database.view(User.everyone).first.name # => "joe"
263
284
  CouchPotato.database.view(User.everyone).first.bio # => nil
264
-
285
+
265
286
  CouchPotato.database.first(User.everyone).name # => "joe" # convenience function, returns nil if nothing found
266
287
  CouchPotato.database.first!(User.everyone) # would raise CouchPotato::NotFound if nothing was found
267
288
 
268
289
  If you want Rails to automatically show a 404 page when `CouchPotato::NotFound` is raised add this to your `ApplicationController`:
269
-
290
+
270
291
  rescue_from CouchPotato::NotFound do
271
292
  render(:file => 'public/404.html', :status => :not_found, :layout => false)
272
293
  end
@@ -303,11 +324,11 @@ Defining a list works similarly to views:
303
324
 
304
325
  class User
305
326
  include CouchPotato::Persistence
306
-
327
+
307
328
  property :first_name
308
329
  view :with_full_name, key: first_namne, list: :add_last_name
309
330
  view :all, key: :first_name
310
-
331
+
311
332
  list :add_last_name, <<-JS
312
333
  function(head, req) {
313
334
  var row;
@@ -320,10 +341,10 @@ Defining a list works similarly to views:
320
341
  }
321
342
  JS
322
343
  end
323
-
344
+
324
345
  CouchPotato.database.save User.new(first_name: 'joe')
325
346
  CouchPotato.database.view(User.with_full_name).first.name # => 'joe doe'
326
-
347
+
327
348
  You can also pass in the list at query time:
328
349
 
329
350
  CouchPotato.database.view(User.all(list: :add_last_name))
@@ -356,16 +377,26 @@ There is basic attachment support: if you want to store any attachments set the
356
377
  class User
357
378
  include CouchPotato::Persistence
358
379
  end
359
-
380
+
360
381
  data = File.read('some_file.text') # or from upload
361
382
  user = User.new
362
383
  user._attachments = {'photo' => {'data' => data, 'content_type' => 'image/png'}}
363
-
384
+
364
385
  When saving this object an attachment with the name _photo_ will be uploaded into CouchDB. It will be available under the url of the user object + _/photo_. When loading the user at a later time you still have access to the _content_type_ and additionally to the _length_ of the attachment:
365
386
 
366
387
  user_reloaded = CouchPotato.database.load user.id
367
388
  user_reloaded._attachments['photo'] # => {'content_type' => 'image/png', 'length' => 37861}
368
389
 
390
+ #### Multi DB Support
391
+
392
+ Couch Potato supports accessing multiple CouchDBs:
393
+
394
+ CouchPotato.with_database('couch_customer') do |couch|
395
+ couch.save @customer
396
+ end
397
+
398
+ Unless configured otherwise this would save the customer model to _http://127.0.0.1:5984/couch_customer_.
399
+
369
400
  #### Testing
370
401
 
371
402
  To make testing easier and faster database logic has been put into its own class, which you can replace and stub out in whatever way you want:
@@ -392,13 +423,13 @@ For stubbing out the database couch potato offers some helpers:
392
423
  class Comment
393
424
  view :by_commenter_id, :key => :commenter_id
394
425
  end
395
-
426
+
396
427
  # RSpec
397
428
  require 'couch_potato/rspec'
398
-
429
+
399
430
  db = stub_db # stubs CouchPotato.database
400
431
  db.stub_view(Comment, :by_commenter_id).with('23').and_return([:comment1, :comment2])
401
-
432
+
402
433
  CouchPotato.database.view(Comment.by_commenter_id('23)) # => [:comment1, :comment2]
403
434
  CouchPotato.database.first(Comment.by_commenter_id('23)) # => :comment1
404
435
 
@@ -406,30 +437,29 @@ For stubbing out the database couch potato offers some helpers:
406
437
 
407
438
  Couch Potato provides custom RSpec matchers for testing the map and reduce functions of your views. For example you can do this:
408
439
 
409
- Class User
440
+ class User
410
441
  include CouchPotato::Persistence
411
-
442
+
443
+ property :name
444
+ property :age, :type => Fixnum
445
+
412
446
  view :by_name, :key => :name
413
- view :by_age, :key => :age
447
+ view :by_age, :key => :age
414
448
  end
415
-
449
+
416
450
  #RSpec
417
451
  require 'couch_potato/rspec'
418
-
419
- describe User, 'by_name' do
452
+
453
+ describe User, 'views' do
420
454
  it "should map users to their name" do
421
- User.by_name.should map(User.new(:name => 'bill', :age => 23)).to(['bill', null])
455
+ User.by_name.should map(User.new(:name => 'bill', :age => 23)).to(['bill', 1])
422
456
  end
423
-
457
+
424
458
  it "should reduce the users to the sum of their age" do
425
- User.by_age.should reduce([], [[23], [22]]).to(45)
426
- end
427
-
428
- it "should rereduce" do
429
- User.by_age.should rereduce([], [[23], [22]]).to(45)
459
+ User.by_age.should reduce([], [23, 22]).to(45)
430
460
  end
431
461
  end
432
-
462
+
433
463
  This will actually run your map/reduce functions in a JavaScript interpreter, passing the arguments as JSON and converting the results back to Ruby. For more examples see the [spec](http://github.com/langalex/couch_potato/blob/master/spec/unit/rspec_matchers_spec.rb).
434
464
 
435
465
  In order for this to work you must have the `js` executable in your PATH. This is usually part of the _spidermonkey_ package/port. (On MacPorts that's _spidemonkey_, on Linux it could be one of _libjs_, _libmozjs_ or _libspidermonkey_). When you installed CouchDB via your packet manager Spidermonkey should already be there.
data/Rakefile CHANGED
@@ -3,82 +3,41 @@ Bundler::GemHelper.install_tasks
3
3
 
4
4
  require 'rake'
5
5
  require "rspec/core/rake_task"
6
- require 'rake/rdoctask'
7
-
8
- def with_validatable(&block)
9
- begin
10
- require 'validatable'
11
-
12
- ENV['VALIDATION_FRAMEWORK'] = 'validatable'
13
- puts "Running task with Validatable validation framework."
14
- yield block
15
- rescue LoadError
16
- STDERR.puts "WARNING: Validatable not available, skipping task."
17
- end
18
- end
19
-
20
- def with_active_model(&block)
21
- begin
22
- require 'active_model'
23
-
24
- ENV['VALIDATION_FRAMEWORK'] = 'active_model'
25
- puts "Running task with ActiveModel validation framework."
26
- yield block
27
- rescue LoadError
28
- STDERR.puts "WARNING: ActiveModel not available, skipping task."
29
- end
6
+ begin
7
+ require 'rdoc/task'
8
+ rescue LoadError
9
+ require 'rake/rdoctask'
30
10
  end
31
11
 
32
12
  task :default => :spec
33
13
 
34
- task :spec_functional_validatable do
35
- with_validatable { Rake::Task['spec_functional_default'].execute }
36
- end
37
-
38
- task :spec_functional_active_model do
39
- with_active_model { Rake::Task['spec_functional_default'].execute }
40
- end
41
-
42
- task :spec_unit_validatable do
43
- with_validatable { Rake::Task['spec_unit_default'].execute }
44
- end
45
-
46
- task :spec_unit_active_model do
47
- with_active_model { Rake::Task['spec_unit_default'].execute }
48
- end
49
-
50
- desc "Run functional specs with default validation framework, override with VALIDATION_FRAMEWORK"
51
- RSpec::Core::RakeTask.new(:spec_functional_default) do |spec|
14
+ desc "Run functional specs"
15
+ RSpec::Core::RakeTask.new(:spec_functional) do |spec|
52
16
  spec.pattern = 'spec/*_spec.rb'
53
17
  spec.rspec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
54
18
  end
55
19
 
56
- desc "Run unit specs with default validation framework, override with VALIDATION_FRAMEWORK"
57
- RSpec::Core::RakeTask.new(:spec_unit_default) do |spec|
20
+ desc "Run unit specs"
21
+ RSpec::Core::RakeTask.new(:spec_unit) do |spec|
58
22
  spec.pattern = 'spec/unit/*_spec.rb'
59
23
  spec.rspec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
60
24
  end
61
25
 
62
- desc "Run functional specs with all validation frameworks"
63
- task :spec_functional => [:spec_functional_validatable, :spec_functional_active_model] do
64
- end
65
-
66
- desc "Run unit specs with all validation frameworks"
67
- task :spec_unit => [:spec_unit_validatable, :spec_unit_active_model] do
68
- end
69
-
70
26
  desc "Run all specs"
71
27
  task :spec do
72
- ['3_0', '3_1'].each do |version|
73
- Bundler.with_clean_env do
74
- ENV['BUNDLE_GEMFILE'] = "active_support_#{version}"
75
- sh "bundle install"
76
- Rake::Task[:spec_unit_active_model].execute
77
- Rake::Task[:spec_functional_active_model].execute
78
- Rake::Task[:spec_unit_validatable].execute
79
- Rake::Task[:spec_functional_validatable].execute
28
+ if ENV['TRAVIS'] # travis handles the environments for us
29
+ Rake::Task[:spec_unit].execute
30
+ Rake::Task[:spec_functional].execute
31
+ else
32
+ ['3_0', '3_1', '3_2'].each do |version|
33
+ Bundler.with_clean_env do
34
+ puts "Running tests with ActiveSupport #{version.sub('_', '.')}"
35
+ sh "env BUNDLE_GEMFILE=active_support_#{version} bundle install"
36
+ sh "env BUNDLE_GEMFILE=active_support_#{version} bundle exec rake spec_unit spec_functional"
37
+ end
80
38
  end
81
39
  end
40
+
82
41
  end
83
42
 
84
43
  desc 'Generate documentation'
@@ -22,6 +22,7 @@ GEM
22
22
  diff-lcs (1.1.2)
23
23
  i18n (0.5.0)
24
24
  json (1.6.1)
25
+ libv8 (3.3.10.4)
25
26
  mime-types (1.16)
26
27
  multi_json (1.0.3)
27
28
  rake (0.8.7)
@@ -35,6 +36,8 @@ GEM
35
36
  rspec-expectations (2.5.0)
36
37
  diff-lcs (~> 1.1.2)
37
38
  rspec-mocks (2.5.0)
39
+ therubyracer (0.10.1)
40
+ libv8 (~> 3.3.10)
38
41
  timecop (0.3.5)
39
42
  tzinfo (0.3.26)
40
43
 
@@ -46,5 +49,6 @@ DEPENDENCIES
46
49
  couch_potato!
47
50
  rake
48
51
  rspec (>= 2.0)
52
+ therubyracer
49
53
  timecop
50
54
  tzinfo
@@ -25,6 +25,7 @@ GEM
25
25
  diff-lcs (1.1.2)
26
26
  i18n (0.6.0)
27
27
  json (1.6.1)
28
+ libv8 (3.3.10.4)
28
29
  mime-types (1.16)
29
30
  multi_json (1.0.3)
30
31
  rake (0.9.2)
@@ -38,6 +39,8 @@ GEM
38
39
  rspec-expectations (2.6.0)
39
40
  diff-lcs (~> 1.1.2)
40
41
  rspec-mocks (2.6.0)
42
+ therubyracer (0.10.1)
43
+ libv8 (~> 3.3.10)
41
44
  timecop (0.3.5)
42
45
  tzinfo (0.3.29)
43
46
 
@@ -49,5 +52,6 @@ DEPENDENCIES
49
52
  couch_potato!
50
53
  rake
51
54
  rspec (>= 2.0)
55
+ therubyracer
52
56
  timecop
53
57
  tzinfo
@@ -0,0 +1,4 @@
1
+ source :rubygems
2
+
3
+ gem 'activemodel', '~>3.2'
4
+ gemspec
@@ -0,0 +1,55 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ couch_potato (0.6.0)
5
+ activemodel
6
+ couchrest (>= 1.0.1)
7
+ json (~> 1.6.0)
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ activemodel (3.2.1)
13
+ activesupport (= 3.2.1)
14
+ builder (~> 3.0.0)
15
+ activesupport (3.2.1)
16
+ i18n (~> 0.6)
17
+ multi_json (~> 1.0)
18
+ builder (3.0.0)
19
+ couchrest (1.1.2)
20
+ mime-types (~> 1.15)
21
+ multi_json (~> 1.0.0)
22
+ rest-client (~> 1.6.1)
23
+ diff-lcs (1.1.3)
24
+ i18n (0.6.0)
25
+ json (1.6.5)
26
+ libv8 (3.3.10.4)
27
+ mime-types (1.17.2)
28
+ multi_json (1.0.4)
29
+ rake (0.9.2.2)
30
+ rest-client (1.6.7)
31
+ mime-types (>= 1.16)
32
+ rspec (2.8.0)
33
+ rspec-core (~> 2.8.0)
34
+ rspec-expectations (~> 2.8.0)
35
+ rspec-mocks (~> 2.8.0)
36
+ rspec-core (2.8.0)
37
+ rspec-expectations (2.8.0)
38
+ diff-lcs (~> 1.1.2)
39
+ rspec-mocks (2.8.0)
40
+ therubyracer (0.10.1)
41
+ libv8 (~> 3.3.10)
42
+ timecop (0.3.5)
43
+ tzinfo (0.3.31)
44
+
45
+ PLATFORMS
46
+ ruby
47
+
48
+ DEPENDENCIES
49
+ activemodel (~> 3.2)
50
+ couch_potato!
51
+ rake
52
+ rspec (>= 2.0)
53
+ therubyracer
54
+ timecop
55
+ tzinfo
data/couch_potato.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.add_development_dependency 'timecop'
21
21
  s.add_development_dependency 'tzinfo'
22
22
  s.add_development_dependency 'rake'
23
+ s.add_development_dependency 'therubyracer'
23
24
 
24
25
  s.files = `git ls-files`.split("\n")
25
26
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")