dm-aggregates 1.0.0.rc2 → 1.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -71,7 +71,7 @@
71
71
  source 'http://rubygems.org'
72
72
 
73
73
  DATAMAPPER = 'git://github.com/datamapper'
74
- DM_VERSION = '~> 1.0.0.rc2'
74
+ DM_VERSION = '~> 1.0.0.rc3'
75
75
 
76
76
  group :runtime do # Runtime dependencies (as in the gemspec)
77
77
 
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Foy Savas
1
+ Copyright (c) 2010 Foy Savas
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -10,12 +10,12 @@ begin
10
10
  gem.summary = 'DataMapper plugin providing support for aggregates on collections'
11
11
  gem.description = gem.summary
12
12
  gem.email = 'foysavas [a] gmail [d] com'
13
- gem.homepage = 'http://github.com/datamapper/dm-more/tree/master/%s' % gem.name
13
+ gem.homepage = 'http://github.com/datamapper/%s' % gem.name
14
14
  gem.authors = [ 'Foy Savas' ]
15
15
 
16
16
  gem.rubyforge_project = 'datamapper'
17
17
 
18
- gem.add_dependency 'dm-core', '~> 1.0.0.rc2'
18
+ gem.add_dependency 'dm-core', '~> 1.0.0.rc3'
19
19
 
20
20
  gem.add_development_dependency 'rspec', '~> 1.3'
21
21
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.rc2
1
+ 1.0.0.rc3
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{dm-aggregates}
8
- s.version = "1.0.0.rc2"
8
+ s.version = "1.0.0.rc3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Foy Savas"]
12
- s.date = %q{2010-05-19}
12
+ s.date = %q{2010-05-27}
13
13
  s.description = %q{DataMapper plugin providing support for aggregates on collections}
14
14
  s.email = %q{foysavas [a] gmail [d] com}
15
15
  s.extra_rdoc_files = [
@@ -25,13 +25,16 @@ Gem::Specification.new do |s|
25
25
  "VERSION",
26
26
  "dm-aggregates.gemspec",
27
27
  "lib/dm-aggregates.rb",
28
- "lib/dm-aggregates/adapters/data_objects_adapter.rb",
28
+ "lib/dm-aggregates/adapters/dm-do-adapter.rb",
29
29
  "lib/dm-aggregates/aggregate_functions.rb",
30
30
  "lib/dm-aggregates/collection.rb",
31
31
  "lib/dm-aggregates/core_ext/symbol.rb",
32
32
  "lib/dm-aggregates/model.rb",
33
33
  "lib/dm-aggregates/query.rb",
34
34
  "lib/dm-aggregates/repository.rb",
35
+ "spec/isolated/require_after_setup_spec.rb",
36
+ "spec/isolated/require_before_setup_spec.rb",
37
+ "spec/isolated/require_spec.rb",
35
38
  "spec/public/collection_spec.rb",
36
39
  "spec/public/model_spec.rb",
37
40
  "spec/public/shared/aggregate_shared_spec.rb",
@@ -45,14 +48,17 @@ Gem::Specification.new do |s|
45
48
  "tasks/yard.rake",
46
49
  "tasks/yardstick.rake"
47
50
  ]
48
- s.homepage = %q{http://github.com/datamapper/dm-more/tree/master/dm-aggregates}
51
+ s.homepage = %q{http://github.com/datamapper/dm-aggregates}
49
52
  s.rdoc_options = ["--charset=UTF-8"]
50
53
  s.require_paths = ["lib"]
51
54
  s.rubyforge_project = %q{datamapper}
52
55
  s.rubygems_version = %q{1.3.7}
53
56
  s.summary = %q{DataMapper plugin providing support for aggregates on collections}
54
57
  s.test_files = [
55
- "spec/public/collection_spec.rb",
58
+ "spec/isolated/require_after_setup_spec.rb",
59
+ "spec/isolated/require_before_setup_spec.rb",
60
+ "spec/isolated/require_spec.rb",
61
+ "spec/public/collection_spec.rb",
56
62
  "spec/public/model_spec.rb",
57
63
  "spec/public/shared/aggregate_shared_spec.rb",
58
64
  "spec/spec_helper.rb"
@@ -63,14 +69,14 @@ Gem::Specification.new do |s|
63
69
  s.specification_version = 3
64
70
 
65
71
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
66
- s.add_runtime_dependency(%q<dm-core>, ["~> 1.0.0.rc2"])
72
+ s.add_runtime_dependency(%q<dm-core>, ["~> 1.0.0.rc3"])
67
73
  s.add_development_dependency(%q<rspec>, ["~> 1.3"])
68
74
  else
69
- s.add_dependency(%q<dm-core>, ["~> 1.0.0.rc2"])
75
+ s.add_dependency(%q<dm-core>, ["~> 1.0.0.rc3"])
70
76
  s.add_dependency(%q<rspec>, ["~> 1.3"])
71
77
  end
72
78
  else
73
- s.add_dependency(%q<dm-core>, ["~> 1.0.0.rc2"])
79
+ s.add_dependency(%q<dm-core>, ["~> 1.0.0.rc3"])
74
80
  s.add_dependency(%q<rspec>, ["~> 1.3"])
75
81
  end
76
82
  end
data/lib/dm-aggregates.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'dm-core'
2
2
 
3
- require 'dm-aggregates/adapters/data_objects_adapter'
4
3
  require 'dm-aggregates/aggregate_functions'
5
4
  require 'dm-aggregates/collection'
6
5
  require 'dm-aggregates/core_ext/symbol'
@@ -15,19 +14,53 @@ rescue LoadError
15
14
  end
16
15
 
17
16
  module DataMapper
18
- class Repository
19
- include Aggregates::Repository
17
+ module Aggregates
18
+ def self.include_aggregate_api
19
+ [ :Repository, :Model, :Collection, :Query ].each do |name|
20
+ DataMapper.const_get(name).send(:include, const_get(name))
21
+ end
22
+ Adapters::AbstractAdapter.descendants.each do |adapter_class|
23
+ Adapters.include_aggregate_api(ActiveSupport::Inflector.demodulize(adapter_class.name))
24
+ end
25
+ end
20
26
  end
21
27
 
22
- module Model
23
- include Aggregates::Model
24
- end
28
+ module Adapters
25
29
 
26
- class Collection
27
- include Aggregates::Collection
28
- end
30
+ def self.include_aggregate_api(const_name)
31
+ require aggregate_extensions(const_name)
32
+ if Aggregates.const_defined?(const_name)
33
+ adapter = const_get(const_name)
34
+ adapter.send(:include, aggregate_module(const_name))
35
+ end
36
+ rescue LoadError
37
+ # Silently ignore the fact that no adapter extensions could be required
38
+ # This means that the adapter in use doesn't support aggregates
39
+ end
29
40
 
30
- class Query
31
- include Aggregates::Query
32
- end
33
- end
41
+ def self.aggregate_module(const_name)
42
+ Aggregates.const_get(const_name)
43
+ end
44
+
45
+ class << self
46
+ private
47
+ # @api private
48
+ def aggregate_extensions(const_name)
49
+ name = adapter_name(const_name)
50
+ name = 'do' if name == 'dataobjects'
51
+ "dm-aggregates/adapters/dm-#{name}-adapter"
52
+ end
53
+ end
54
+
55
+ extendable do
56
+ # @api private
57
+ def const_added(const_name)
58
+ include_aggregate_api(const_name)
59
+ super
60
+ end
61
+ end
62
+ end # module Adapters
63
+
64
+ Aggregates.include_aggregate_api
65
+
66
+ end # module DataMapper
@@ -1,9 +1,7 @@
1
1
  module DataMapper
2
2
  module Aggregates
3
3
  module DataObjectsAdapter
4
- def self.included(base)
5
- base.send(:include, SQL)
6
- end
4
+ extend Chainable
7
5
 
8
6
  def aggregate(query)
9
7
  fields = query.fields
@@ -63,63 +61,40 @@ module DataMapper
63
61
  property.load(value)
64
62
  end
65
63
 
66
- module SQL
67
- def self.included(base)
68
- base.class_eval <<-RUBY, __FILE__, __LINE__ + 1
69
- # FIXME: figure out a cleaner approach than AMC
70
- alias property_to_column_name_without_operator property_to_column_name
71
- alias property_to_column_name property_to_column_name_with_operator
72
- RUBY
73
- end
74
-
75
- def property_to_column_name_with_operator(property, qualify)
64
+ chainable do
65
+ def property_to_column_name(property, qualify)
76
66
  case property
77
67
  when DataMapper::Query::Operator
78
68
  aggregate_field_statement(property.operator, property.target, qualify)
79
69
 
80
70
  when Property, DataMapper::Query::Path
81
- property_to_column_name_without_operator(property, qualify)
71
+ super
82
72
 
83
73
  else
84
74
  raise ArgumentError, "+property+ must be a DataMapper::Query::Operator, a DataMapper::Property or a Query::Path, but was a #{property.class} (#{property.inspect})"
85
75
  end
86
76
  end
77
+ end
87
78
 
88
- def aggregate_field_statement(aggregate_function, property, qualify)
89
- column_name = if aggregate_function == :count && property == :all
90
- '*'
91
- else
92
- property_to_column_name(property, qualify)
93
- end
94
-
95
- function_name = case aggregate_function
96
- when :count then 'COUNT'
97
- when :min then 'MIN'
98
- when :max then 'MAX'
99
- when :avg then 'AVG'
100
- when :sum then 'SUM'
101
- else raise "Invalid aggregate function: #{aggregate_function.inspect}"
102
- end
103
-
104
- "#{function_name}(#{column_name})"
79
+ def aggregate_field_statement(aggregate_function, property, qualify)
80
+ column_name = if aggregate_function == :count && property == :all
81
+ '*'
82
+ else
83
+ property_to_column_name(property, qualify)
105
84
  end
106
- end # module SQL
107
- end # class DataObjectsAdapter
108
- end # module Aggregates
109
-
110
- module Adapters
111
- extendable do
112
85
 
113
- # TODO: document
114
- # @api private
115
- def const_added(const_name)
116
- if DataMapper::Aggregates.const_defined?(const_name)
117
- adapter = const_get(const_name)
118
- adapter.send(:include, DataMapper::Aggregates.const_get(const_name))
86
+ function_name = case aggregate_function
87
+ when :count then 'COUNT'
88
+ when :min then 'MIN'
89
+ when :max then 'MAX'
90
+ when :avg then 'AVG'
91
+ when :sum then 'SUM'
92
+ else raise "Invalid aggregate function: #{aggregate_function.inspect}"
119
93
  end
120
94
 
121
- super
95
+ "#{function_name}(#{column_name})"
122
96
  end
123
- end
124
- end # module Adapters
97
+
98
+ end # class DataObjectsAdapter
99
+ end # module Aggregates
125
100
  end # module DataMapper
@@ -0,0 +1,21 @@
1
+ require 'spec'
2
+ require 'isolated/require_spec'
3
+ require 'dm-core/spec/setup'
4
+
5
+ # To really test this behavior, this spec needs to be run in isolation and not
6
+ # as part of the typical rake spec run, which requires dm-aggregates upfront
7
+
8
+ if %w[ postgres mysql sqlite oracle sqlserver ].include?(ENV['ADAPTER'])
9
+
10
+ describe "require 'dm-aggregates after calling DataMapper.setup" do
11
+
12
+ before(:all) do
13
+ @adapter = DataMapper::Spec.adapter
14
+ require 'dm-aggregates'
15
+ end
16
+
17
+ it_should_behave_like "require 'dm-aggregates'"
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec'
2
+ require 'isolated/require_spec'
3
+ require 'dm-core/spec/setup'
4
+
5
+ # To really test this behavior, this spec needs to be run in isolation and not
6
+ # as part of the typical rake spec run, which requires dm-aggregates upfront
7
+
8
+ if %w[ postgres mysql sqlite oracle sqlserver ].include?(ENV['ADAPTER'])
9
+
10
+ describe "require 'dm-aggregates' before calling DataMapper.setup" do
11
+
12
+ before(:all) do
13
+ require 'dm-aggregates'
14
+ @adapter = DataMapper::Spec.adapter
15
+ end
16
+
17
+ it_should_behave_like "require 'dm-aggregates'"
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,13 @@
1
+ shared_examples_for "require 'dm-aggregates'" do
2
+
3
+ %w[ Repository Model Collection Query ].each do |name|
4
+ it "should include the aggregate api in DataMapper::#{name}" do
5
+ (DataMapper.const_get(name) < DataMapper::Aggregates.const_get(name)).should be(true)
6
+ end
7
+ end
8
+
9
+ it "should include the aggregate api into the adapter" do
10
+ @adapter.respond_to?(:aggregate).should be(true)
11
+ end
12
+
13
+ end
data/spec/rcov.opts CHANGED
@@ -1,4 +1,4 @@
1
- --exclude "spec"
1
+ --exclude "spec,^/"
2
2
  --sort coverage
3
3
  --callsites
4
4
  --xrefs
data/spec/spec_helper.rb CHANGED
@@ -49,6 +49,7 @@ Spec::Runner.configure do |config|
49
49
  property :gold_reserve_tonnes, Float, :precision => 6, :scale => 2
50
50
  property :gold_reserve_value, Decimal, :precision => 15, :scale => 1 # approx. value in USD
51
51
  end
52
+ DataMapper.finalize
52
53
 
53
54
  end
54
55
  end
data/tasks/spec.rake CHANGED
@@ -35,4 +35,7 @@ rescue LoadError
35
35
  end
36
36
  end
37
37
 
38
+ task :spec => :check_dependencies
39
+ task :rcov => :check_dependencies
40
+
38
41
  task :default => :spec
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-aggregates
3
3
  version: !ruby/object:Gem::Version
4
- hash: 977940575
4
+ hash: 977940572
5
5
  prerelease: true
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
9
  - 0
10
- - rc2
11
- version: 1.0.0.rc2
10
+ - rc3
11
+ version: 1.0.0.rc3
12
12
  platform: ruby
13
13
  authors:
14
14
  - Foy Savas
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-05-19 00:00:00 -07:00
19
+ date: 2010-05-27 00:00:00 -07:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -27,13 +27,13 @@ dependencies:
27
27
  requirements:
28
28
  - - ~>
29
29
  - !ruby/object:Gem::Version
30
- hash: 977940575
30
+ hash: 977940572
31
31
  segments:
32
32
  - 1
33
33
  - 0
34
34
  - 0
35
- - rc2
36
- version: 1.0.0.rc2
35
+ - rc3
36
+ version: 1.0.0.rc3
37
37
  type: :runtime
38
38
  version_requirements: *id001
39
39
  - !ruby/object:Gem::Dependency
@@ -69,13 +69,16 @@ files:
69
69
  - VERSION
70
70
  - dm-aggregates.gemspec
71
71
  - lib/dm-aggregates.rb
72
- - lib/dm-aggregates/adapters/data_objects_adapter.rb
72
+ - lib/dm-aggregates/adapters/dm-do-adapter.rb
73
73
  - lib/dm-aggregates/aggregate_functions.rb
74
74
  - lib/dm-aggregates/collection.rb
75
75
  - lib/dm-aggregates/core_ext/symbol.rb
76
76
  - lib/dm-aggregates/model.rb
77
77
  - lib/dm-aggregates/query.rb
78
78
  - lib/dm-aggregates/repository.rb
79
+ - spec/isolated/require_after_setup_spec.rb
80
+ - spec/isolated/require_before_setup_spec.rb
81
+ - spec/isolated/require_spec.rb
79
82
  - spec/public/collection_spec.rb
80
83
  - spec/public/model_spec.rb
81
84
  - spec/public/shared/aggregate_shared_spec.rb
@@ -89,7 +92,7 @@ files:
89
92
  - tasks/yard.rake
90
93
  - tasks/yardstick.rake
91
94
  has_rdoc: true
92
- homepage: http://github.com/datamapper/dm-more/tree/master/dm-aggregates
95
+ homepage: http://github.com/datamapper/dm-aggregates
93
96
  licenses: []
94
97
 
95
98
  post_install_message:
@@ -125,6 +128,9 @@ signing_key:
125
128
  specification_version: 3
126
129
  summary: DataMapper plugin providing support for aggregates on collections
127
130
  test_files:
131
+ - spec/isolated/require_after_setup_spec.rb
132
+ - spec/isolated/require_before_setup_spec.rb
133
+ - spec/isolated/require_spec.rb
128
134
  - spec/public/collection_spec.rb
129
135
  - spec/public/model_spec.rb
130
136
  - spec/public/shared/aggregate_shared_spec.rb