dynamoid 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Dynamoid.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "dynamoid"
8
- s.version = "0.0.2"
8
+ s.version = "0.0.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Josh Symonds"]
@@ -62,6 +62,7 @@ Gem::Specification.new do |s|
62
62
  "spec/dynamoid/associations/has_one_spec.rb",
63
63
  "spec/dynamoid/associations_spec.rb",
64
64
  "spec/dynamoid/attributes_spec.rb",
65
+ "spec/dynamoid/config_spec.rb",
65
66
  "spec/dynamoid/document_spec.rb",
66
67
  "spec/dynamoid/fields_spec.rb",
67
68
  "spec/dynamoid/finders_spec.rb",
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
data/lib/dynamoid.rb CHANGED
@@ -24,9 +24,13 @@ module Dynamoid
24
24
  extend self
25
25
 
26
26
  def configure
27
- block_given? ? yield(Config) : Config
27
+ block_given? ? yield(Dynamoid::Config) : Dynamoid::Config
28
28
  Dynamoid::Adapter.reconnect!
29
29
  end
30
30
  alias :config :configure
31
31
 
32
+ def logger
33
+ Dynamoid::Config.logger
34
+ end
35
+
32
36
  end
@@ -16,7 +16,12 @@ module Dynamoid #:nodoc:
16
16
  end
17
17
 
18
18
  def method_missing(method, *args)
19
- return @adapter.send(method, *args) if @adapter.respond_to?(method)
19
+ if @adapter.respond_to?(method)
20
+ start = Time.now
21
+ result = @adapter.send(method, *args)
22
+ Dynamoid.logger.info "((#{((Time.now - start) * 1000.0).round(2)} ms) #{method.to_s.split('_').collect(&:upcase).join(' ')}#{ " - #{args.join(',')}" unless args.empty? }"
23
+ return result
24
+ end
20
25
  super
21
26
  end
22
27
  end
@@ -44,7 +44,9 @@ module Dynamoid #:nodoc:
44
44
  @associations[name] ||= Dynamoid::Associations.const_get(type.to_s.camelcase).new(self, name, options)
45
45
  end
46
46
  define_method("#{name}=".to_sym) do |objects|
47
- self.send(name) << objects
47
+ @associations ||= {}
48
+ @associations[name] ||= Dynamoid::Associations.const_get(type.to_s.camelcase).new(self, name, options)
49
+ @associations[name].setter(objects)
48
50
  end
49
51
  end
50
52
  end
@@ -38,6 +38,12 @@ module Dynamoid #:nodoc:
38
38
  object
39
39
  end
40
40
 
41
+ def setter(object)
42
+ source.update_attribute(source_attribute, Array(object).collect(&:id))
43
+ Array(object).collect{|o| self.send(:associate_target, o)} if target_association
44
+ object
45
+ end
46
+
41
47
  def create(attributes = {})
42
48
  object = target_class.create(attributes)
43
49
  self << object
@@ -26,7 +26,7 @@ module Dynamoid #:nodoc:
26
26
 
27
27
  def disassociate_target(object)
28
28
  ids = object.send(target_attribute) || Set.new
29
- source.update_attribute(source_attribute, ids - Array(source.id))
29
+ object.update_attribute(target_attribute, ids - Array(source.id))
30
30
  end
31
31
  end
32
32
  end
@@ -10,10 +10,28 @@ module Dynamoid #:nodoc
10
10
  include ActiveModel::Observing
11
11
 
12
12
  option :adapter, :default => 'local'
13
- option :namespace, :default => 'dynamoid'
13
+ option :namespace, :default => defined?(Rails) ? "dynamoid_#{Rails.application.class.parent_name}_#{Rails.env}" : "dynamoid"
14
+ option :logger, :default => defined?(Rails)
14
15
  option :access_key
15
16
  option :secret_key
16
17
  option :warn_on_scan, :default => true
18
+
19
+ def default_logger
20
+ defined?(Rails) && Rails.respond_to?(:logger) ? Rails.logger : ::Logger.new($stdout)
21
+ end
22
+
23
+ def logger
24
+ @logger ||= default_logger
25
+ end
26
+
27
+ def logger=(logger)
28
+ case logger
29
+ when false, nil then @logger = nil
30
+ when true then @logger = default_logger
31
+ else
32
+ @logger = logger if logger.respond_to?(:info)
33
+ end
34
+ end
17
35
 
18
36
  end
19
37
  end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # Shamelessly stolen from Mongoid!
2
2
  module Dynamoid #:nodoc
3
3
  module Config
4
4
 
@@ -11,8 +11,6 @@ module Dynamoid #:nodoc
11
11
  # options.defaults
12
12
  #
13
13
  # @return [ Hash ] The default options.
14
- #
15
- # @since 2.3.0
16
14
  def defaults
17
15
  @defaults ||= {}
18
16
  end
@@ -26,8 +24,6 @@ module Dynamoid #:nodoc
26
24
  # @param [ Hash ] options Extras for the option.
27
25
  #
28
26
  # @option options [ Object ] :default The default value.
29
- #
30
- # @since 2.0.0.rc.1
31
27
  def option(name, options = {})
32
28
  defaults[name] = settings[name] = options[:default]
33
29
 
@@ -43,6 +39,10 @@ module Dynamoid #:nodoc
43
39
  def #{name}?
44
40
  #{name}
45
41
  end
42
+
43
+ def reset_#{name}
44
+ settings[#{name.inspect}] = defaults[#{name.inspect}]
45
+ end
46
46
  RUBY
47
47
  end
48
48
 
@@ -52,8 +52,6 @@ module Dynamoid #:nodoc
52
52
  # config.reset
53
53
  #
54
54
  # @return [ Hash ] The defaults.
55
- #
56
- # @since 2.3.0
57
55
  def reset
58
56
  settings.replace(defaults)
59
57
  end
@@ -64,8 +62,6 @@ module Dynamoid #:nodoc
64
62
  # options.settings
65
63
  #
66
64
  # @return [ Hash ] The setting options.
67
- #
68
- # @since 2.3.0
69
65
  def settings
70
66
  @settings ||= {}
71
67
  end
@@ -41,8 +41,8 @@ module Dynamoid #:nodoc:
41
41
  end
42
42
  else
43
43
  if Dynamoid::Config.warn_on_scan
44
- puts 'Queries without an index are forced to use scan and are generally much slower than indexed queries!'
45
- puts "You can index this query by adding this to #{self.to_s.downcase}.rb: index [#{attributes.sort.collect{|attr| ":#{attr}"}.join(', ')}]"
44
+ Dynamoid.logger.warn 'Queries without an index are forced to use scan and are generally much slower than indexed queries!'
45
+ Dynamoid.logger.warn "You can index this query by adding this to #{self.to_s.downcase}.rb: index [#{attributes.sort.collect{|attr| ":#{attr}"}.join(', ')}]"
46
46
  end
47
47
  scan_hash = {}
48
48
  attributes.each_with_index {|attr, index| scan_hash[attr.to_sym] = args[index]}
@@ -67,5 +67,16 @@ describe "Dynamoid::Associations::Association" do
67
67
  @subscription.should_not respond_to :sponsors_ids
68
68
  @subscription.should_not respond_to :sponsor_ids
69
69
  end
70
+
71
+ it 'deletes all items from the association' do
72
+ @magazine.subscriptions << Subscription.create
73
+ @magazine.subscriptions << Subscription.create
74
+ @magazine.subscriptions << Subscription.create
75
+
76
+ @magazine.subscriptions.size.should == 3
77
+
78
+ @magazine.subscriptions = nil
79
+ @magazine.subscriptions.size.should == 0
80
+ end
70
81
 
71
82
  end
@@ -26,5 +26,15 @@ describe "Dynamoid::Associations::HasAndBelongsToMany" do
26
26
 
27
27
  @user.subscriptions.size.should == 1
28
28
  @user.subscriptions.should include @subscription
29
+ @subscription.users.size.should == 1
30
+ @subscription.users.should include @user
31
+ end
32
+
33
+ it 'disassociates has_and_belongs_to_many automatically' do
34
+ @user = @subscription.users.create
35
+
36
+ @subscription.users.delete(@user)
37
+ @subscription.users.size.should == 0
38
+ @user.subscriptions.size.should == 0
29
39
  end
30
40
  end
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "Dynamoid::Config" do
4
+
5
+ before(:each) do
6
+ Dynamoid::Config.reset_namespace
7
+ end
8
+
9
+ after(:each) do
10
+ Dynamoid.config {|config| config.namespace = 'dynamoid_tests'}
11
+ end
12
+
13
+ it 'returns a namespace for non-Rails apps' do
14
+ Dynamoid::Config.namespace.should == 'dynamoid'
15
+ end
16
+
17
+ it 'returns a namespace for Rails apps' do
18
+ class Rails; end
19
+ Rails.stubs(:application => stubs(:class => stubs(:parent_name => 'TestApp')))
20
+ Rails.stubs(:env => 'development')
21
+ Dynamoid::Config.send(:option, :namespace, :default => defined?(Rails) ? "dynamoid_#{Rails.application.class.parent_name}_#{Rails.env}" : "dynamoid")
22
+
23
+ # TODO Make this return what we actually expect
24
+ Dynamoid::Config.namespace.should == "dynamoid_Mocha_development"
25
+ end
26
+
27
+ end
data/spec/spec_helper.rb CHANGED
@@ -19,6 +19,8 @@ Dynamoid.configure do |config|
19
19
  config.warn_on_scan = false
20
20
  end
21
21
 
22
+ Dynamoid.logger.level = Logger::FATAL
23
+
22
24
  # Requires supporting files with custom matchers and macros, etc,
23
25
  # in ./support/ and its subdirectories.
24
26
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-02-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
16
- requirement: &70308512101780 !ruby/object:Gem::Requirement
16
+ requirement: &70135836907680 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70308512101780
24
+ version_requirements: *70135836907680
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: tzinfo
27
- requirement: &70308512117280 !ruby/object:Gem::Requirement
27
+ requirement: &70135836906980 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70308512117280
35
+ version_requirements: *70135836906980
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: aws-sdk
38
- requirement: &70308512115100 !ruby/object:Gem::Requirement
38
+ requirement: &70135836906300 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70308512115100
46
+ version_requirements: *70135836906300
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: mocha
49
- requirement: &70308512112760 !ruby/object:Gem::Requirement
49
+ requirement: &70135836905060 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70308512112760
57
+ version_requirements: *70135836905060
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &70308511927640 !ruby/object:Gem::Requirement
60
+ requirement: &70135836904480 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70308511927640
68
+ version_requirements: *70135836904480
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &70308511926580 !ruby/object:Gem::Requirement
71
+ requirement: &70135836903920 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70308511926580
79
+ version_requirements: *70135836903920
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: bundler
82
- requirement: &70308511926080 !ruby/object:Gem::Requirement
82
+ requirement: &70135836072500 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70308511926080
90
+ version_requirements: *70135836072500
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: jeweler
93
- requirement: &70308511925480 !ruby/object:Gem::Requirement
93
+ requirement: &70135836071700 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70308511925480
101
+ version_requirements: *70135836071700
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rcov
104
- requirement: &70308511924800 !ruby/object:Gem::Requirement
104
+ requirement: &70135836071100 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70308511924800
112
+ version_requirements: *70135836071100
113
113
  description: Dynamoid is an ORM for Amazon's DynamoDB that supports offline development,
114
114
  associations, querying, and everything else you'd expect from an ActiveRecord-style
115
115
  replacement.
@@ -165,6 +165,7 @@ files:
165
165
  - spec/dynamoid/associations/has_one_spec.rb
166
166
  - spec/dynamoid/associations_spec.rb
167
167
  - spec/dynamoid/attributes_spec.rb
168
+ - spec/dynamoid/config_spec.rb
168
169
  - spec/dynamoid/document_spec.rb
169
170
  - spec/dynamoid/fields_spec.rb
170
171
  - spec/dynamoid/finders_spec.rb
@@ -188,7 +189,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
188
189
  version: '0'
189
190
  segments:
190
191
  - 0
191
- hash: 2111085687923262415
192
+ hash: -1286880132188396224
192
193
  required_rubygems_version: !ruby/object:Gem::Requirement
193
194
  none: false
194
195
  requirements: