dynamoid 0.0.2 → 0.0.3

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/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: