has_many_scored 1.0.0 → 1.1.0

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.
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