blind_date 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
data/blind_date.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{blind_date}
8
- s.version = "0.0.1"
8
+ s.version = "0.0.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ari Epstein"]
12
- s.date = %q{2009-11-25}
12
+ s.date = %q{2010-06-14}
13
13
  s.description = %q{Allows you to utilize date calculation functionality of DBMS with a uniform API}
14
14
  s.email = %q{aepstein607@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -38,7 +38,7 @@ Gem::Specification.new do |s|
38
38
  s.homepage = %q{http://github.com/aepstein/blind_date}
39
39
  s.rdoc_options = ["--charset=UTF-8"]
40
40
  s.require_paths = ["lib"]
41
- s.rubygems_version = %q{1.3.5}
41
+ s.rubygems_version = %q{1.3.7}
42
42
  s.summary = %q{DBMS-indepedent methods to query dates in ActiveRecord}
43
43
  s.test_files = [
44
44
  "spec/blind_date_spec.rb",
@@ -49,7 +49,7 @@ Gem::Specification.new do |s|
49
49
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
50
  s.specification_version = 3
51
51
 
52
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
52
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
53
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
54
54
  s.add_runtime_dependency(%q<activerecord>, [">= 2.3.4"])
55
55
  else
@@ -1,42 +1,58 @@
1
1
  module BlindDate
2
2
  module ActiveRecord
3
3
  module Base
4
+ module ClassMethods
5
+ # Generates an sql fragement representing the sum of a date and a duration
6
+ # == Usage
7
+ #
8
+ # Model.date_add DateTime.now, 10.days
9
+ # => sqlite: DATETIME( '2009-11-25 12:01:01', '+10 DAY' )
10
+ # => mysql: ('2009-11-25 12:01:01' + 10 DAY)
11
+ # => pgsql: (TIMESTAMP '2009-11-25 12:01:01' + '10 DAY')
12
+ # Model.date_add 'models.starts_at', 10.days
13
+ # => sqlite: DATETIME( models.starts_at, '+10 DAY' )
14
+ # Model.date_add :starts_at, :duration, :days
15
+ # => sqlite: DATETIME( "models"."starts_at", '+' || "models"."duration" || ' DAY' )
16
+ # Model.date_add :starts_at, :duration, :days, true
17
+ # => sqlite: DATETIME( "models"."starts_at", '-' || "models"."duration" || ' DAY' )
18
+ #
19
+ # == Options
20
+ # * +date+ - Date subject to calculation, can be date, time, datetime, symbolized column, or string sql fragment
21
+ # * +interval+ - Duration to be added/subtracted, can be duration, number, symbolized column, or string sql fragment
22
+ # * +unit+ - Unit of time for duration, defaults to :seconds, and is ignored if using duration for interval
23
+ # * +diff+ - If true, will subtract duration from date, otherwise will add (default is false)
24
+ def date_add( date, interval, unit = 'SECOND', diff = false)
25
+ if date.is_a? Symbol
26
+ date = "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(date.to_s)}"
27
+ elsif date.acts_like?(:time) || date.acts_like?(:date)
28
+ date = connection.quote date
29
+ end
30
+ interval = "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(interval.to_s)}" if interval.is_a? Symbol
31
+ connection.class.date_add date, interval, unit, diff
32
+ end
4
33
 
5
- # Generates an sql fragement representing the sum of a date and a duration
6
- # == Usage
7
- #
8
- # Model.date_add DateTime.now, 10.days
9
- # => sqlite: DATETIME( '2009-11-25 12:01:01', '+10 DAY' )
10
- # => mysql: ('2009-11-25 12:01:01' + 10 DAY)
11
- # => pgsql: (TIMESTAMP '2009-11-25 12:01:01' + '10 DAY')
12
- # Model.date_add 'models.starts_at', 10.days
13
- # => sqlite: DATETIME( models.starts_at, '+10 DAY' )
14
- # Model.date_add :starts_at, :duration, :days
15
- # => sqlite: DATETIME( "models"."starts_at", '+' || "models"."duration" || ' DAY' )
16
- # Model.date_add :starts_at, :duration, :days, true
17
- # => sqlite: DATETIME( "models"."starts_at", '-' || "models"."duration" || ' DAY' )
18
- #
19
- # == Options
20
- # * +date+ - Date subject to calculation, can be date, time, datetime, symbolized column, or string sql fragment
21
- # * +interval+ - Duration to be added/subtracted, can be duration, number, symbolized column, or string sql fragment
22
- # * +unit+ - Unit of time for duration, defaults to :seconds, and is ignored if using duration for interval
23
- # * +diff+ - If true, will subtract duration from date, otherwise will add (default is false)
24
- def date_add( date, interval, unit = 'SECOND', diff = false)
25
- if date.is_a? Symbol
26
- date = "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(date.to_s)}"
27
- elsif date.acts_like?(:time) || date.acts_like?(:date)
28
- date = connection.quote date
34
+ # Generates a SQL fragment representing subtraction of a duration from a date
35
+ # Similar to date_add( date, interval, unit, +true+ )
36
+ def date_sub( date, interval, unit = 'SECOND' )
37
+ date_add date, interval, unit, true
29
38
  end
30
- interval = "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(interval.to_s)}" if interval.is_a? Symbol
31
- connection.class.date_add date, interval, unit, diff
39
+
32
40
  end
33
41
 
34
- # Generates a SQL fragment representing subtraction of a duration from a date
35
- # Similar to date_add( date, interval, unit, +true+ )
36
- def date_sub( date, interval, unit = 'SECOND' )
37
- date_add date, interval, unit, true
42
+ module InstanceMethods
43
+ def date_add( date, interval, unit = 'SECOND', diff = false)
44
+ self.class.date_add( date, interval, unit, diff )
45
+ end
46
+ def date_sub( date, interval, unit = 'SECOND' )
47
+ self.class.date_sub( date, interval, unit )
48
+ end
38
49
  end
39
50
 
51
+ def self.included(receiver)
52
+ receiver.extend ClassMethods
53
+ receiver.send :include, InstanceMethods
54
+
55
+ end
40
56
  end
41
57
  end
42
58
  end
@@ -1,56 +1,63 @@
1
1
  module BlindDate
2
2
  module ActiveRecord
3
3
  module ConnectionAdapters
4
-
5
- # Includes extended behaviors
6
- # Each DBMS-specific module must implement the private methods or raise NotImplemented
7
- # for each private method
8
4
  module AbstractAdapter
9
-
10
- # Performs arithmetic on string is an SQL-escaped date/time/datetime or returns a date/time/datetime
11
- def date_add(date, interval, unit = 'SECOND', diff = false )
12
- case interval
13
- when ActiveSupport::Duration
14
- interval.parts.inject( date ) do |memo, span|
15
- date_add_sql_without_operator memo, span.last, span.first.to_s.singularize.upcase, diff
5
+ module ClassMethods
6
+
7
+ # Performs arithmetic on string is an SQL-escaped date/time/datetime or returns a date/time/datetime
8
+ def date_add(date, interval, unit = 'SECOND', diff = false )
9
+ case interval
10
+ when ActiveSupport::Duration
11
+ interval.parts.inject( date ) do |memo, span|
12
+ date_add_sql_without_operator memo, span.last, span.first.to_s.singularize.upcase, diff
13
+ end
14
+ when String
15
+ date_add_sql date, interval, unit.to_s.singularize.upcase, ( diff ? '-' : '+' )
16
+ when Numeric
17
+ date_add_sql_without_operator date, interval, unit.to_s.singularize.upcase, diff
18
+ else
19
+ raise ArgumentError
16
20
  end
17
- when String
18
- date_add_sql date, interval, unit.to_s.singularize.upcase, ( diff ? '-' : '+' )
19
- when Numeric
20
- date_add_sql_without_operator date, interval, unit.to_s.singularize.upcase, diff
21
- else
22
- raise ArgumentError
23
21
  end
24
- end
25
22
 
26
- # Returns name of adapter suitable for loading related classes
27
- # Should have same output as instance method of same name
28
- # TODO: Kludgy: maybe upstream could provide a class method?
29
- def adapter_name
30
- to_s.underscore[ /\/([^\/]+)_adapter$/, 1 ].gsub( '_', '' )
31
- end
23
+ # Returns name of adapter suitable for loading related classes
24
+ # Should have same output as instance method of same name
25
+ # TODO: Kludgy: maybe upstream could provide a class method?
26
+ def adapter_name
27
+ to_s.underscore[ /\/([^\/]+)_adapter$/, 1 ].gsub( '_', '' )
28
+ end
29
+
30
+ private
32
31
 
33
- private
32
+ # Adds appropriate operator before calling adapter-specific method
33
+ def date_add_sql_without_operator( sql, interval, unit, diff )
34
+ if diff
35
+ date_add_sql sql, interval.abs, unit, ( interval < 0 ? '+' : '-' )
36
+ else
37
+ date_add_sql sql, interval.abs, unit, ( interval < 0 ? '-' : '+' )
38
+ end
39
+ end
34
40
 
35
- # Adds appropriate operator before calling adapter-specific method
36
- def date_add_sql_without_operator( sql, interval, unit, diff )
37
- if diff
38
- date_add_sql sql, interval.abs, unit, ( interval < 0 ? '+' : '-' )
39
- else
40
- date_add_sql sql, interval.abs, unit, ( interval < 0 ? '-' : '+' )
41
+ # Will attempt to load the correct behavior if this is not already provided
42
+ def date_add_sql( sql, interval, unit, operator )
43
+ require "blind_date/active_record/connection_adapters/#{adapter_name}_adapter"
44
+ date_add_sql( sql, interval, unit, operator )
41
45
  end
46
+
42
47
  end
43
48
 
44
- # Will attempt to load the correct behavior if this is not already provided
45
- def date_add_sql( sql, interval, unit, operator )
46
- require "blind_date/active_record/connection_adapters/#{adapter_name}_adapter"
47
- date_add_sql( sql, interval, unit, operator )
49
+ module InstanceMethods
50
+ def date_add_sql( sql, interval, unit, operator )
51
+ self.class.date_add_sql( sql, interval, unit, operator )
52
+ end
48
53
  end
49
54
 
55
+ def self.included(receiver)
56
+ receiver.extend ClassMethods
57
+ receiver.send :include, InstanceMethods
58
+ end
50
59
  end
51
60
  end
52
61
  end
53
62
  end
54
63
 
55
- ActiveRecord::ConnectionAdapters::AbstractAdapter.extend BlindDate::ActiveRecord::ConnectionAdapters::AbstractAdapter
56
-
@@ -2,15 +2,24 @@ module BlindDate
2
2
  module ActiveRecord
3
3
  module ConnectionAdapters
4
4
  module MysqlAdapter
5
+ module ClassMethods
6
+ def date_add_sql( sql, interval, unit, operator )
7
+ "( #{sql} #{operator} INTERVAL #{interval} #{unit} )"
8
+ end
9
+ end
10
+
11
+ module InstanceMethods
5
12
 
6
- def date_add_sql( sql, interval, unit, operator )
7
- "( #{sql} #{operator} INTERVAL #{interval} #{unit} )"
8
13
  end
9
14
 
15
+ def self.included(receiver)
16
+ receiver.extend ClassMethods
17
+ receiver.send :include, InstanceMethods
18
+ end
10
19
  end
11
20
  end
12
21
  end
13
22
  end
14
23
 
15
- ActiveRecord::ConnectionAdapters::MysqlAdapter.extend BlindDate::ActiveRecord::ConnectionAdapters::MysqlAdapter
24
+ ActiveRecord::ConnectionAdapters::MysqlAdapter.send :include, BlindDate::ActiveRecord::ConnectionAdapters::MysqlAdapter
16
25
 
@@ -2,22 +2,31 @@ module BlindDate
2
2
  module ActiveRecord
3
3
  module ConnectionAdapters
4
4
  module PostgresqlAdapter
5
-
6
- def date_add_sql( sql, interval, unit, operator )
7
- case interval
8
- when Numeric
9
- "( #{sql} #{operator} '#{interval} #{unit}' )"
10
- when String
11
- "( #{sql} #{operator} #{interval} || ' #{unit}')"
12
- else
13
- raise ArgumentError
5
+ module ClassMethods
6
+ def date_add_sql( sql, interval, unit, operator )
7
+ case interval
8
+ when Numeric
9
+ "( #{sql} #{operator} '#{interval} #{unit}' )"
10
+ when String
11
+ "( #{sql} #{operator} #{interval} || ' #{unit}')"
12
+ else
13
+ raise ArgumentError
14
+ end
14
15
  end
15
16
  end
16
17
 
18
+ module InstanceMethods
19
+
20
+ end
21
+
22
+ def self.included(receiver)
23
+ receiver.extend ClassMethods
24
+ receiver.send :include, InstanceMethods
25
+ end
17
26
  end
18
27
  end
19
28
  end
20
29
  end
21
30
 
22
- ActiveRecord::ConnectionAdapters::MysqlAdapter.send :include, BlindDate::ActiveRecord::ConnectionAdapters::MysqlAdapter
31
+ ActiveRecord::ConnectionAdapters::PostgresqlAdapter.send :include, BlindDate::ActiveRecord::ConnectionAdapters::PostgresqlAdapter
23
32
 
@@ -2,22 +2,31 @@ module BlindDate
2
2
  module ActiveRecord
3
3
  module ConnectionAdapters
4
4
  module SQLiteAdapter
5
-
6
- def date_add_sql( sql, interval, unit, operator )
7
- case interval
8
- when Numeric
9
- "DATETIME( #{sql}, '#{operator}#{interval} #{unit}' )"
10
- when String
11
- "DATETIME( #{sql}, '#{operator}' || #{interval} || ' #{unit}' )"
12
- else
13
- raise ArgumentError
5
+ module ClassMethods
6
+ def date_add_sql( sql, interval, unit, operator )
7
+ case interval
8
+ when Numeric
9
+ "DATETIME( #{sql}, '#{operator}#{interval} #{unit}' )"
10
+ when String
11
+ "DATETIME( #{sql}, '#{operator}' || #{interval} || ' #{unit}' )"
12
+ else
13
+ raise ArgumentError
14
+ end
14
15
  end
15
16
  end
16
17
 
18
+ module InstanceMethods
19
+
20
+ end
21
+
22
+ def self.included(receiver)
23
+ receiver.extend ClassMethods
24
+ receiver.send :include, InstanceMethods
25
+ end
17
26
  end
18
27
  end
19
28
  end
20
29
  end
21
30
 
22
- ActiveRecord::ConnectionAdapters::SQLiteAdapter.extend BlindDate::ActiveRecord::ConnectionAdapters::SQLiteAdapter
31
+ ActiveRecord::ConnectionAdapters::SQLiteAdapter.send :include, BlindDate::ActiveRecord::ConnectionAdapters::SQLiteAdapter
23
32
 
data/lib/blind_date.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'blind_date/active_record/base'
2
2
  require 'blind_date/active_record/connection_adapters/abstract_adapter'
3
3
 
4
- ActiveRecord::Base.extend BlindDate::ActiveRecord::Base
5
- ActiveRecord::ConnectionAdapters::AbstractAdapter.extend BlindDate::ActiveRecord::ConnectionAdapters::AbstractAdapter
4
+ ActiveRecord::Base.send :include, BlindDate::ActiveRecord::Base
5
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.send :include, BlindDate::ActiveRecord::ConnectionAdapters::AbstractAdapter
6
6
 
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blind_date
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ version: 0.0.2
5
11
  platform: ruby
6
12
  authors:
7
13
  - Ari Epstein
@@ -9,29 +15,41 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2009-11-25 00:00:00 -05:00
18
+ date: 2010-06-14 00:00:00 -04:00
13
19
  default_executable:
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
22
  name: rspec
17
- type: :development
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
20
26
  requirements:
21
27
  - - ">="
22
28
  - !ruby/object:Gem::Version
29
+ hash: 13
30
+ segments:
31
+ - 1
32
+ - 2
33
+ - 9
23
34
  version: 1.2.9
24
- version:
35
+ type: :development
36
+ version_requirements: *id001
25
37
  - !ruby/object:Gem::Dependency
26
38
  name: activerecord
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
30
42
  requirements:
31
43
  - - ">="
32
44
  - !ruby/object:Gem::Version
45
+ hash: 11
46
+ segments:
47
+ - 2
48
+ - 3
49
+ - 4
33
50
  version: 2.3.4
34
- version:
51
+ type: :runtime
52
+ version_requirements: *id002
35
53
  description: Allows you to utilize date calculation functionality of DBMS with a uniform API
36
54
  email: aepstein607@gmail.com
37
55
  executables: []
@@ -69,21 +87,27 @@ rdoc_options:
69
87
  require_paths:
70
88
  - lib
71
89
  required_ruby_version: !ruby/object:Gem::Requirement
90
+ none: false
72
91
  requirements:
73
92
  - - ">="
74
93
  - !ruby/object:Gem::Version
94
+ hash: 3
95
+ segments:
96
+ - 0
75
97
  version: "0"
76
- version:
77
98
  required_rubygems_version: !ruby/object:Gem::Requirement
99
+ none: false
78
100
  requirements:
79
101
  - - ">="
80
102
  - !ruby/object:Gem::Version
103
+ hash: 3
104
+ segments:
105
+ - 0
81
106
  version: "0"
82
- version:
83
107
  requirements: []
84
108
 
85
109
  rubyforge_project:
86
- rubygems_version: 1.3.5
110
+ rubygems_version: 1.3.7
87
111
  signing_key:
88
112
  specification_version: 3
89
113
  summary: DBMS-indepedent methods to query dates in ActiveRecord