cohort_scope 0.2.1 → 0.2.2
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/cohort_scope.gemspec +4 -3
- data/lib/cohort_scope/cohort.rb +20 -4
- data/lib/cohort_scope/version.rb +1 -1
- data/lib/cohort_scope.rb +4 -10
- data/test/helper.rb +10 -10
- data/test/test_cohort_scope.rb +4 -5
- metadata +69 -63
data/cohort_scope.gemspec
CHANGED
@@ -19,9 +19,10 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
|
-
s.
|
23
|
-
s.
|
22
|
+
s.add_runtime_dependency "activesupport", '>=3'
|
23
|
+
s.add_runtime_dependency "activerecord", '>=3'
|
24
24
|
s.add_development_dependency 'test-unit'
|
25
|
-
s.add_development_dependency '
|
25
|
+
s.add_development_dependency 'mysql2'
|
26
|
+
s.add_development_dependency 'rake'
|
26
27
|
# s.add_development_dependency 'ruby-debug'
|
27
28
|
end
|
data/lib/cohort_scope/cohort.rb
CHANGED
@@ -2,13 +2,13 @@ require 'delegate'
|
|
2
2
|
|
3
3
|
module CohortScope
|
4
4
|
class Cohort < ::Delegator
|
5
|
-
|
6
5
|
class << self
|
7
6
|
# Recursively look for a scope that meets the constraints and is at least <tt>minimum_cohort_size</tt>.
|
8
7
|
def create(active_record, constraints, minimum_cohort_size)
|
9
8
|
if constraints.none? # failing base case
|
10
|
-
|
11
|
-
|
9
|
+
impossible_cohort = new(active_record.scoped.where(IMPOSSIBLE_CONDITION))
|
10
|
+
impossible_cohort.impossible!
|
11
|
+
return impossible_cohort
|
12
12
|
end
|
13
13
|
|
14
14
|
constrained_scope = active_record.scoped.where CohortScope.conditions_for(constraints)
|
@@ -20,6 +20,8 @@ module CohortScope
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
IMPOSSIBLE_CONDITION = ::Arel::Nodes::Equality.new(1,2)
|
23
25
|
|
24
26
|
def initialize(obj)
|
25
27
|
super
|
@@ -40,9 +42,23 @@ module CohortScope
|
|
40
42
|
def as_json(*)
|
41
43
|
{ :members => count }
|
42
44
|
end
|
45
|
+
|
46
|
+
def impossible!
|
47
|
+
@impossible = true
|
48
|
+
end
|
49
|
+
|
50
|
+
def impossible?
|
51
|
+
@impossible == true
|
52
|
+
end
|
53
|
+
|
54
|
+
def any?
|
55
|
+
return false if impossible?
|
56
|
+
super
|
57
|
+
end
|
43
58
|
|
44
59
|
# sabshere 2/1/11 ActiveRecord does this for #any? but not for #none?
|
45
60
|
def none?(&blk)
|
61
|
+
return true if impossible?
|
46
62
|
if block_given?
|
47
63
|
to_a.none? &blk
|
48
64
|
else
|
@@ -75,7 +91,7 @@ module CohortScope
|
|
75
91
|
end
|
76
92
|
|
77
93
|
def inspect
|
78
|
-
"
|
94
|
+
"#<#{self.class.name} with #{count} members>"
|
79
95
|
end
|
80
96
|
end
|
81
97
|
end
|
data/lib/cohort_scope/version.rb
CHANGED
data/lib/cohort_scope.rb
CHANGED
@@ -1,17 +1,11 @@
|
|
1
1
|
require 'active_record'
|
2
|
+
require 'active_support/core_ext'
|
2
3
|
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
|
6
|
-
require 'active_support/json'
|
7
|
-
require 'active_support/core_ext/hash'
|
8
|
-
end
|
4
|
+
require 'cohort_scope/cohort'
|
5
|
+
require 'cohort_scope/big_cohort'
|
6
|
+
require 'cohort_scope/strict_cohort'
|
9
7
|
|
10
8
|
module CohortScope
|
11
|
-
autoload :Cohort, 'cohort_scope/cohort'
|
12
|
-
autoload :BigCohort, 'cohort_scope/big_cohort'
|
13
|
-
autoload :StrictCohort, 'cohort_scope/strict_cohort'
|
14
|
-
|
15
9
|
def self.extended(klass)
|
16
10
|
klass.class_eval do
|
17
11
|
class << self
|
data/test/helper.rb
CHANGED
@@ -10,10 +10,10 @@ class Test::Unit::TestCase
|
|
10
10
|
end
|
11
11
|
|
12
12
|
# require 'logger'
|
13
|
-
# ActiveRecord::Base.logger = Logger.new($
|
13
|
+
# ActiveRecord::Base.logger = Logger.new($stdout)
|
14
14
|
|
15
15
|
ActiveRecord::Base.establish_connection(
|
16
|
-
'adapter' => '
|
16
|
+
'adapter' => 'mysql2',
|
17
17
|
'database' => 'test_cohort_scope',
|
18
18
|
'username' => 'root',
|
19
19
|
'password' => 'password'
|
@@ -64,7 +64,7 @@ end
|
|
64
64
|
[ '1985-03-02', nil, 27 ],
|
65
65
|
[ '1982-05-01', nil, 28 ]
|
66
66
|
].each do |birthdate, favorite_color, teeth|
|
67
|
-
Citizen.
|
67
|
+
c = Citizen.new; c.birthdate = birthdate; c.favorite_color = favorite_color; c.teeth = teeth; c.save!
|
68
68
|
end
|
69
69
|
|
70
70
|
class Period < ActiveRecord::Base
|
@@ -97,13 +97,13 @@ class Resident < ActiveRecord::Base
|
|
97
97
|
belongs_to :house
|
98
98
|
end
|
99
99
|
|
100
|
-
p1 = Period.
|
101
|
-
p2 = Period.
|
102
|
-
Style.
|
103
|
-
Style.
|
104
|
-
Style.
|
105
|
-
Style.
|
106
|
-
Style.
|
100
|
+
p1 = Period.new; p1.name = 'arts and crafts'; p1.save!
|
101
|
+
p2 = Period.new; p2.name = 'victorian'; p2.save!
|
102
|
+
s1 = Style.new; s1.period = p1; s1.name = 'classical revival'; s1.save!
|
103
|
+
s2 = Style.new; s2.period = p1; s2.name = 'gothic'; s2.save!
|
104
|
+
s3 = Style.new; s3.period = p1; s3.name = 'art deco'; s3.save!
|
105
|
+
s4 = Style.new; s4.period = p2; s4.name = 'stick-eastlake'; s4.save!
|
106
|
+
s5 = Style.new; s5.period = p2; s5.name = 'queen anne'; s5.save!
|
107
107
|
h1 = House.create! :period => p1, :address => '123 Maple', :storeys => 1
|
108
108
|
h2 = House.create! :period => p1, :address => '223 Walnut', :storeys => 2
|
109
109
|
h3 = House.create! :period => p2, :address => '323 Pine', :storeys => 2
|
data/test/test_cohort_scope.rb
CHANGED
@@ -28,10 +28,9 @@ class TestCohortScope < Test::Unit::TestCase
|
|
28
28
|
end
|
29
29
|
|
30
30
|
# should this even work in theory?
|
31
|
-
def test_002b_simplified_joins
|
32
|
-
|
33
|
-
|
34
|
-
end
|
31
|
+
# def test_002b_simplified_joins
|
32
|
+
# assert_equal 3, Style.big_cohort(:houses => [house1]).length
|
33
|
+
# end
|
35
34
|
|
36
35
|
def test_003_redefine_any_query_method
|
37
36
|
cohort = Citizen.big_cohort(:birthdate => @date_range)
|
@@ -69,7 +68,7 @@ class TestCohortScope < Test::Unit::TestCase
|
|
69
68
|
|
70
69
|
def test_008_short_inspect
|
71
70
|
cohort = Citizen.big_cohort :birthdate => @date_range, :favorite_color => 'heliotrope'
|
72
|
-
assert_equal "
|
71
|
+
assert_equal "#<CohortScope::BigCohort with 9 members>", cohort.inspect
|
73
72
|
end
|
74
73
|
|
75
74
|
def test_009_not_reveal_itself_in_to_hash
|
metadata
CHANGED
@@ -1,74 +1,82 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: cohort_scope
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.2
|
4
5
|
prerelease:
|
5
|
-
version: 0.2.1
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Seamus Abshere
|
9
9
|
- Andy Rossmeissl
|
10
10
|
- Derek Kastner
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
dependencies:
|
18
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
date: 2012-02-02 00:00:00.000000000Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
19
17
|
name: activesupport
|
20
|
-
|
21
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
18
|
+
requirement: &2154898880 !ruby/object:Gem::Requirement
|
22
19
|
none: false
|
23
|
-
requirements:
|
24
|
-
- -
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version:
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '3'
|
27
24
|
type: :runtime
|
28
|
-
version_requirements: *id001
|
29
|
-
- !ruby/object:Gem::Dependency
|
30
|
-
name: activerecord
|
31
25
|
prerelease: false
|
32
|
-
|
26
|
+
version_requirements: *2154898880
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: &2154898100 !ruby/object:Gem::Requirement
|
33
30
|
none: false
|
34
|
-
requirements:
|
35
|
-
- -
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version:
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '3'
|
38
35
|
type: :runtime
|
39
|
-
|
40
|
-
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: *2154898100
|
38
|
+
- !ruby/object:Gem::Dependency
|
41
39
|
name: test-unit
|
40
|
+
requirement: &2154897700 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
type: :development
|
42
47
|
prerelease: false
|
43
|
-
|
48
|
+
version_requirements: *2154897700
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: mysql2
|
51
|
+
requirement: &2154891040 !ruby/object:Gem::Requirement
|
44
52
|
none: false
|
45
|
-
requirements:
|
46
|
-
- -
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version:
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
49
57
|
type: :development
|
50
|
-
version_requirements: *id003
|
51
|
-
- !ruby/object:Gem::Dependency
|
52
|
-
name: mysql
|
53
58
|
prerelease: false
|
54
|
-
|
59
|
+
version_requirements: *2154891040
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: rake
|
62
|
+
requirement: &2154890620 !ruby/object:Gem::Requirement
|
55
63
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version:
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
60
68
|
type: :development
|
61
|
-
|
62
|
-
|
63
|
-
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: *2154890620
|
71
|
+
description: Provides big_cohort, which widens by finding the constraint that eliminates
|
72
|
+
the most records and removing it. Also provides strict_cohort, which widens by eliminating
|
73
|
+
constraints in order.
|
74
|
+
email:
|
64
75
|
- seamus@abshere.net
|
65
76
|
executables: []
|
66
|
-
|
67
77
|
extensions: []
|
68
|
-
|
69
78
|
extra_rdoc_files: []
|
70
|
-
|
71
|
-
files:
|
79
|
+
files:
|
72
80
|
- .document
|
73
81
|
- .gitignore
|
74
82
|
- Gemfile
|
@@ -85,36 +93,34 @@ files:
|
|
85
93
|
- test/test_big_cohort.rb
|
86
94
|
- test/test_cohort_scope.rb
|
87
95
|
- test/test_strict_cohort.rb
|
88
|
-
has_rdoc: true
|
89
96
|
homepage: https://github.com/seamusabshere/cohort_scope
|
90
97
|
licenses: []
|
91
|
-
|
92
98
|
post_install_message:
|
93
99
|
rdoc_options: []
|
94
|
-
|
95
|
-
require_paths:
|
100
|
+
require_paths:
|
96
101
|
- lib
|
97
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
103
|
none: false
|
99
|
-
requirements:
|
100
|
-
- -
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version:
|
103
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ! '>='
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
109
|
none: false
|
105
|
-
requirements:
|
106
|
-
- -
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
version:
|
110
|
+
requirements:
|
111
|
+
- - ! '>='
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
109
114
|
requirements: []
|
110
|
-
|
111
115
|
rubyforge_project: cohort_scope
|
112
|
-
rubygems_version: 1.
|
116
|
+
rubygems_version: 1.8.10
|
113
117
|
signing_key:
|
114
118
|
specification_version: 3
|
115
|
-
summary: Provides cohorts (in the form of ActiveRecord scopes) that dynamically widen
|
116
|
-
|
119
|
+
summary: Provides cohorts (in the form of ActiveRecord scopes) that dynamically widen
|
120
|
+
until they contain a certain number of records.
|
121
|
+
test_files:
|
117
122
|
- test/helper.rb
|
118
123
|
- test/test_big_cohort.rb
|
119
124
|
- test/test_cohort_scope.rb
|
120
125
|
- test/test_strict_cohort.rb
|
126
|
+
has_rdoc:
|