has_many_scored 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6e3ceacfc424710a369f2556276c3593353e762
4
- data.tar.gz: d568b6e4ac4122bad8fa8df24d6609101a0e75a4
3
+ metadata.gz: 6d92b5fc3873544d969133b75f893c3857b88d3f
4
+ data.tar.gz: 7354b07b590ede6b1d2c3d03be1d0cd93dd821bf
5
5
  SHA512:
6
- metadata.gz: f7c91444fa1250d1be8845623db6d3190a7e2e2012fa9f1cb80b67f1c78b9f5cef808e98ff85f6d2b81b65469a27fcabc7b018ca1bc76d3d88d22f220b575f51
7
- data.tar.gz: 58a2fda5405b98b228f89c0bef26bd6475378a4666481ce5c77bab28164b81e2a2b6fe3a6467a4249edd2db678121634d12f2aaff87d58992e959cbb967a59ff
6
+ metadata.gz: 195ff0f882e2719f172377723d37829af3e572e3a8a5d3317e27d839503f1b84723e9b7da5ec01cd88a8da29968d151835729eb13d1e073e626204ccee6c840c
7
+ data.tar.gz: 67038deb618de8d45f511bd9c0b3df08609e8c01c8aab7129ca9a5e3315fc590d3598eae1d552570a76a6e5e9befe23b6164cb9d3ed09fac8c0d79e6d24f2f73
data/ChangeLog.rdoc CHANGED
@@ -1,3 +1,6 @@
1
+ === 1.1.0 / 2014-02-18
2
+ * Add ability to append additional extension methods by calling the association builder with a block.
3
+
1
4
  === 1.0.0 / 2014-02-15
2
5
 
3
6
  * Initial release
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- has_many_scored (0.0.1)
4
+ has_many_scored (1.0.0)
5
5
  activerecord (>= 3.0, <= 4.0.2)
6
6
  redis-objects (>= 0.6.1)
7
7
 
data/Rakefile CHANGED
@@ -4,7 +4,15 @@ require "bundler/gem_tasks"
4
4
  require 'rake'
5
5
 
6
6
  begin
7
- gem 'rdoc'
7
+ require 'rubygems/tasks'
8
+
9
+ Gem::Tasks.new
10
+ rescue LoadError => e
11
+ warn e.message
12
+ warn "Run `gem install rubygems-tasks` to install Gem::Tasks."
13
+ end
14
+
15
+ begin
8
16
  require 'rdoc/task'
9
17
 
10
18
  RDoc::Task.new do |rdoc|
@@ -17,7 +25,6 @@ end
17
25
  task :doc => :rdoc
18
26
 
19
27
  begin
20
- gem 'rspec', '~> 2.4'
21
28
  require 'rspec/core/rake_task'
22
29
 
23
30
  RSpec::Core::RakeTask.new
@@ -1,4 +1,4 @@
1
- # -*- encoding: utf-8 -*-
1
+ # encoding: utf-8
2
2
 
3
3
  require File.expand_path("../lib/has_many_scored/version", __FILE__)
4
4
 
@@ -1,7 +1,7 @@
1
1
  module HasManyScored
2
2
  # This module is used to extend the join model and mix in additional logic
3
3
  module HasManyScoredExtension
4
- def self.bind_extension(options)
4
+ def self.bind_extension(options, &block)
5
5
  return Proc.new do
6
6
  include HasManyScored::HasManyScoredExtension
7
7
 
@@ -9,6 +9,8 @@ module HasManyScored
9
9
  define_method :options do
10
10
  return options
11
11
  end
12
+
13
+ class_eval(&block) if block
12
14
  end
13
15
  end
14
16
 
@@ -1,7 +1,8 @@
1
1
  module HasManyScored
2
2
  # This module is used to extend the join model and mix in additional logic
3
3
  module ScoredForManyExtension
4
- def self.bind_extension(options)
4
+ def self.bind_extension(options, &block)
5
+ puts "YIELDING1"
5
6
  return Proc.new do
6
7
  include HasManyScored::ScoredForManyExtension
7
8
 
@@ -9,6 +10,8 @@ module HasManyScored
9
10
  define_method :options do
10
11
  return options
11
12
  end
13
+
14
+ class_eval(&block) if block
12
15
  end
13
16
  end
14
17
 
@@ -1,3 +1,3 @@
1
1
  module HasManyScored
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -8,7 +8,7 @@ module HasManyScored
8
8
  :association_foreign_key, :readonly, :validate,
9
9
  :autosave]
10
10
 
11
- def has_many_scored(name, opts=nil)
11
+ def has_many_scored(name, opts=nil, &extension)
12
12
  opts = opts.try(:dup) || {}
13
13
 
14
14
  habtm_opts = opts.select { |k, v| VALID_HABTM_OPTIONS.include?(k) }
@@ -29,10 +29,10 @@ module HasManyScored
29
29
  has_and_belongs_to_many(
30
30
  name,
31
31
  lambda { |owner| order("#{owner.association(name).join_table.name}.#{opts[:score_column]} DESC") },
32
- habtm_opts, &HasManyScored::HasManyScoredExtension.bind_extension(opts))
32
+ habtm_opts, &HasManyScored::HasManyScoredExtension.bind_extension(opts, &extension))
33
33
  end
34
34
 
35
- def scored_for_many(name, opts=nil)
35
+ def scored_for_many(name, opts=nil, &extension)
36
36
  opts = opts.try(:dup) || {}
37
37
 
38
38
  habtm_opts = opts.select { |k, v| VALID_HABTM_OPTIONS.include?(k) }
@@ -53,7 +53,7 @@ module HasManyScored
53
53
  has_and_belongs_to_many(
54
54
  name,
55
55
  lambda { |owner| order("#{owner.association(name).join_table.name}.#{opts[:score_column]} DESC") },
56
- habtm_opts, &HasManyScored::HasManyScoredExtension.bind_extension(opts))
56
+ habtm_opts, &HasManyScored::ScoredForManyExtension.bind_extension(opts, &extension))
57
57
  end
58
58
  end
59
59
 
@@ -0,0 +1,142 @@
1
+ require 'spec_helper'
2
+ require 'has_many_scored'
3
+
4
+ class Topic2 < ActiveRecord::Base
5
+ include HasManyScored
6
+ scored_for_many :tags, class_name: "Tag2", score_column: :hotness, score_field: :compute_hotness do
7
+ def custom_method
8
+ return true
9
+ end
10
+ end
11
+
12
+ def compute_hotness
13
+ create_ts
14
+ end
15
+ end
16
+ class Tag2 < ActiveRecord::Base
17
+ include HasManyScored
18
+ has_many_scored :topics, class_name: "Topic2", score_column: :hotness, score_field: :compute_hotness do
19
+ def custom_other_method
20
+ return true
21
+ end
22
+ end
23
+ end
24
+
25
+ def setup_schema2!
26
+ setup_db do
27
+ create_table :topic2s do |t|
28
+ t.column :name, :string
29
+ t.column :create_ts, :integer
30
+ end
31
+ create_table :tag2s do |t|
32
+ t.column :name, :string
33
+ end
34
+ create_table :tag2s_topic2s do |t|
35
+ t.column :topic2_id, :integer
36
+ t.column :tag2_id, :integer
37
+ t.column :hotness, :integer
38
+ end
39
+ end
40
+ end
41
+
42
+ BASE_TIME = Time.now.to_i
43
+ describe Tag2 do
44
+ before(:each) do
45
+ setup_schema2!
46
+ end
47
+ after(:each) do
48
+ teardown_db
49
+ end
50
+ context "with dummy data" do
51
+ before do
52
+ @t1 = Topic2.create(:name => "Topic 1", :create_ts => BASE_TIME + 2)
53
+ @t2 = Topic2.create(:name => "Topic 2", :create_ts => BASE_TIME + 1)
54
+ @t3 = Topic2.create(:name => "Topic 3", :create_ts => BASE_TIME + 3)
55
+ @tag = Tag2.create(:name => "Tag 1")
56
+ @tag.topics << @t1 << @t2 << @t3
57
+ end
58
+
59
+ it "computes size" do
60
+ expect(@tag.topics.size).to eq(3)
61
+ @tag.topics = []
62
+ expect(@tag.topics.size).to eq(0)
63
+ end
64
+
65
+ it "computes score when setting by ID" do
66
+ @tag.topic_ids = [@t1.id, @t2.id]
67
+ expect(@tag.topics(true).map(&:name)).to eq(["Topic 1", "Topic 2"])
68
+
69
+ @tag.topic_ids = [@t3.id]
70
+ expect(@tag.topics(true).map(&:name)).to eq(["Topic 3"])
71
+
72
+ @tag.topic_ids = [@t3.id, @t2.id, @t1.id]
73
+ expect(@tag.topics(true).map { |t| t.name }).to eq(["Topic 3", "Topic 1", "Topic 2"])
74
+ end
75
+
76
+ it "computes scores" do
77
+ expect(@tag.topics.compute_score(@t2)).to eq(BASE_TIME + 1)
78
+ end
79
+
80
+ it "reads in scored order" do
81
+ # Sadly we have to call reload.
82
+ @tag.topics.reload
83
+
84
+ expect(@tag.topics.map { |t| t.name }).to eq(["Topic 3", "Topic 1", "Topic 2"])
85
+ expect(@tag.topics.first(2).map { |t| t.name }).to eq(["Topic 3", "Topic 1"])
86
+ end
87
+
88
+ it "handles delete" do
89
+ @tag.topics.delete(@t1)
90
+
91
+ expect(@tag.topics.map { |t| t.name }).to eq(["Topic 3", "Topic 2"])
92
+ end
93
+
94
+ it "handles update_score" do
95
+ @t2.create_ts = BASE_TIME + 4
96
+ @t2.save
97
+ @tag.topics.update_score(@t2)
98
+
99
+ expect(Tag2.first.topics.map { |t| t.name }).to eq(["Topic 2", "Topic 3", "Topic 1"])
100
+ end
101
+ end
102
+ end
103
+
104
+ describe Topic2 do
105
+ before(:each) do
106
+ setup_schema2!
107
+ end
108
+ after(:each) do
109
+ teardown_db
110
+ end
111
+
112
+ context "with dummy data" do
113
+ before do
114
+ @t1 = Topic2.create(:name => "Topic 1", :create_ts => BASE_TIME + 2)
115
+ @t2 = Topic2.create(:name => "Topic 2", :create_ts => BASE_TIME + 1)
116
+ @t3 = Topic2.create(:name => "Topic 3", :create_ts => BASE_TIME + 3)
117
+ @tag1 = Tag2.create(:name => "Tag 1")
118
+ @tag2 = Tag2.create(:name => "Tag 2")
119
+ @tag2 = Tag2.create(:name => "Tag 3")
120
+ @tag1.topics << @t2 << @t3
121
+ @t1.tags << @tag1 << @tag2
122
+ end
123
+
124
+ it "computes size" do
125
+ expect(@t1.tags.size).to eq(2)
126
+ @t1.tags = []
127
+ expect(@t1.tags.size).to eq(0)
128
+ end
129
+
130
+ it "reads in scored order" do
131
+ # Sadly we have to call reload.
132
+ @tag1.topics.reload
133
+
134
+ expect(@tag1.topics.map { |t| t.name }).to eq(["Topic 3", "Topic 1", "Topic 2"])
135
+ expect(@tag2.topics.map { |t| t.name }).to eq(["Topic 1"])
136
+ end
137
+
138
+ it "accepts block extensions" do
139
+ expect(@t1.tags).to respond_to(:custom_method)
140
+ end
141
+ end
142
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,3 @@
1
- gem "rspec", "~> 2.4"
2
1
  require "rspec"
3
2
  require "has_many_scored/version"
4
3
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has_many_scored
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hsiu-Fan Wang
@@ -14,118 +14,118 @@ dependencies:
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.0'
20
- - - "<="
20
+ - - <=
21
21
  - !ruby/object:Gem::Version
22
22
  version: 4.0.2
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ">="
27
+ - - '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '3.0'
30
- - - "<="
30
+ - - <=
31
31
  - !ruby/object:Gem::Version
32
32
  version: 4.0.2
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: redis-objects
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ">="
37
+ - - '>='
38
38
  - !ruby/object:Gem::Version
39
39
  version: 0.6.1
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
44
+ - - '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: 0.6.1
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: pry
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
51
+ - - '>='
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ">="
58
+ - - '>='
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: sqlite3
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - '>='
66
66
  - !ruby/object:Gem::Version
67
67
  version: '0'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ">="
72
+ - - '>='
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: fakeredis
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - ">="
79
+ - - '>='
80
80
  - !ruby/object:Gem::Version
81
81
  version: '0'
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - ">="
86
+ - - '>='
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0'
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: rdoc
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - "~>"
93
+ - - ~>
94
94
  - !ruby/object:Gem::Version
95
95
  version: 4.1.0
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
- - - "~>"
100
+ - - ~>
101
101
  - !ruby/object:Gem::Version
102
102
  version: 4.1.0
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: rspec
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
- - - "~>"
107
+ - - ~>
108
108
  - !ruby/object:Gem::Version
109
109
  version: '2.4'
110
110
  type: :development
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
- - - "~>"
114
+ - - ~>
115
115
  - !ruby/object:Gem::Version
116
116
  version: '2.4'
117
117
  - !ruby/object:Gem::Dependency
118
118
  name: rubygems-tasks
119
119
  requirement: !ruby/object:Gem::Requirement
120
120
  requirements:
121
- - - "~>"
121
+ - - ~>
122
122
  - !ruby/object:Gem::Version
123
123
  version: '0.2'
124
124
  type: :development
125
125
  prerelease: false
126
126
  version_requirements: !ruby/object:Gem::Requirement
127
127
  requirements:
128
- - - "~>"
128
+ - - ~>
129
129
  - !ruby/object:Gem::Version
130
130
  version: '0.2'
131
131
  description: An ActiveRecord plugin that combines an ordered habtm-like association
@@ -135,8 +135,8 @@ executables: []
135
135
  extensions: []
136
136
  extra_rdoc_files: []
137
137
  files:
138
- - ".gitignore"
139
- - ".rspec"
138
+ - .gitignore
139
+ - .rspec
140
140
  - ChangeLog.rdoc
141
141
  - Gemfile
142
142
  - Gemfile.lock
@@ -148,6 +148,7 @@ files:
148
148
  - lib/has_many_scored/has_many_scored_extension.rb
149
149
  - lib/has_many_scored/scored_for_many_extension.rb
150
150
  - lib/has_many_scored/version.rb
151
+ - spec/customized_model_spec.rb
151
152
  - spec/has_many_scored_spec.rb
152
153
  - spec/simple_model_spec.rb
153
154
  - spec/spec_helper.rb
@@ -161,22 +162,23 @@ require_paths:
161
162
  - lib
162
163
  required_ruby_version: !ruby/object:Gem::Requirement
163
164
  requirements:
164
- - - ">="
165
+ - - '>='
165
166
  - !ruby/object:Gem::Version
166
167
  version: '0'
167
168
  required_rubygems_version: !ruby/object:Gem::Requirement
168
169
  requirements:
169
- - - ">="
170
+ - - '>='
170
171
  - !ruby/object:Gem::Version
171
172
  version: '0'
172
173
  requirements: []
173
174
  rubyforge_project:
174
- rubygems_version: 2.2.1
175
+ rubygems_version: 2.0.6
175
176
  signing_key:
176
177
  specification_version: 4
177
178
  summary: An ActiveRecord plugin that combines an ordered habtm-like association with
178
179
  optional redis caching
179
180
  test_files:
181
+ - spec/customized_model_spec.rb
180
182
  - spec/has_many_scored_spec.rb
181
183
  - spec/simple_model_spec.rb
182
184
  - spec/spec_helper.rb