almicube 0.0.1 → 0.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94b199c38dcd6cb5b6599020ca0f935f7081810c
4
- data.tar.gz: fe414a3b3946b9cfee359866f94780e36c75dc6e
3
+ metadata.gz: f5974ef075edf11c09d6e8c44485968661fcc8a5
4
+ data.tar.gz: ff7ca640f98417dc29d755aa314a57a8ebefca42
5
5
  SHA512:
6
- metadata.gz: 8200ccaadf03f53d208f55f8e0659089e38075fd5c40ef0d0bca1e2bf306dd86a30020c74861c88c4065ad731cadc8f74fc690943be20beb17aef9bdad999dcb
7
- data.tar.gz: ecae74f249d13c1668cc564b9420ae2c33fa1f4a9c9453e6a8ece13a4f852d435647cffd70c0d32b69b6198f7e446afdaad66a9865e6fbedf3f71861ff88e5a4
6
+ metadata.gz: 999950f31e8406189ebfce9726f6c5a6b99f7d4c389bb54e644dbcc9538d30c16e50169c449b35cbb86ce2cd3b3e214166a3c1acc0b2fd0b95d77d06c825f001
7
+ data.tar.gz: ae64515586232c660796d417702a84e3d72907aa0f1e89563548a44c40d04617f56c653eaca9aedf74fed83ab555bcbbf15aa6316af3aa96ddb4abfbd06f8c05
data/README.md CHANGED
@@ -12,7 +12,7 @@ class Item < ActiveRecord::Base
12
12
  end
13
13
  ```
14
14
 
15
- in `app/controllers/items\_controller.rb`
15
+ in `app/controllers/items_controller.rb`
16
16
 
17
17
  ```ruby
18
18
  class ItemsController
@@ -20,6 +20,7 @@ class ItemsController
20
20
  @items = Item.access_ranking.page params[:page]
21
21
  end
22
22
  end
23
+ ```
23
24
 
24
25
  in `app/views/items/index.html.erb`
25
26
 
@@ -35,3 +36,4 @@ Note
35
36
  --------
36
37
 
37
38
  - Almicube uses Redis for DataStore.
39
+ - Example Project: https://github.com/niaeashes/almicube-sample
@@ -0,0 +1,35 @@
1
+ module Almicube
2
+ module Builder
3
+ class AverageRankingBuilder
4
+ extend Base
5
+
6
+ register :average
7
+
8
+ def initialize(options)
9
+ @options = self.default_options.merge(options)
10
+ end
11
+
12
+ def default_options
13
+ { ranking_class: Almicube::Ranking, aggregate: :std }
14
+ end
15
+
16
+ def build(date)
17
+ ranking_class.new(ranking_options(date))
18
+ end
19
+
20
+ protected
21
+
22
+ RANKING_OPTIONS = %i[class_name as date_format attribute_name per_page aggregate default_score]
23
+
24
+ def ranking_options(date = Date.today)
25
+ ( @options.select{ |k| self.class::RANKING_OPTIONS.include? k } ).merge( date: date )
26
+ end
27
+
28
+ %i[ranking_class].each do |name|
29
+ define_method(name) do
30
+ @options[name]
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,35 @@
1
+ module Almicube
2
+ module Builder
3
+ class CountableRankingBuilder
4
+ extend Base
5
+
6
+ register :countable
7
+
8
+ def initialize(options)
9
+ @options = self.default_options.merge(options)
10
+ end
11
+
12
+ def default_options
13
+ { ranking_class: Almicube::Ranking, aggregate: :sum }
14
+ end
15
+
16
+ def build(date)
17
+ ranking_class.new(ranking_options(date))
18
+ end
19
+
20
+ protected
21
+
22
+ RANKING_OPTIONS = %i[class_name as date_format attribute_name per_page aggregate default_score]
23
+
24
+ def ranking_options(date = Date.today)
25
+ ( @options.select{ |k| self.class::RANKING_OPTIONS.include? k } ).merge( date: date )
26
+ end
27
+
28
+ %i[ranking_class].each do |name|
29
+ define_method(name) do
30
+ @options[name]
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,41 @@
1
+ module Almicube
2
+ module Builder
3
+ class << self
4
+ def instance(name, options={})
5
+ raise ArgumentError, "invalid #1 name" unless has_builder? name
6
+ builders[name].new options
7
+ end
8
+
9
+ def register(name, builder_class)
10
+ raise TypeError, 'invalid builder class' unless builder_class.kind_of? Builder::Base
11
+ builders[name] = builder_class
12
+ end
13
+
14
+ def has_builder?(name)
15
+ load_builder name
16
+ builders.has_key? name
17
+ end
18
+
19
+ def builders
20
+ @builders ||= {}
21
+ end
22
+
23
+ def load_builder(name)
24
+ "Almicube::Builder::#{"#{name}_ranking_builder".classify}".constantize
25
+ end
26
+ end
27
+
28
+ module Base
29
+ def self.included(base)
30
+ base.include InstanceMethods
31
+ end
32
+
33
+ def register(name)
34
+ Builder.register(name, self)
35
+ end
36
+
37
+ class InstanceMethods
38
+ end
39
+ end
40
+ end
41
+ end
@@ -8,16 +8,18 @@ module Almicube
8
8
 
9
9
  def ranking_with(ranker, options={})
10
10
  ranker = ranker.to_s
11
- options.symbolize_keys!.merge(Ranking.default_options)
11
+ options = options.symbolize_keys!.merge(class_name: self, attribute_name: ranker.to_sym)
12
12
 
13
- class_name = ( options.fetch :class_name, Almicube::Ranking ).to_s
14
- as = options.fetch :as, Float
15
- per_page = options.fetch :per_page, 10
13
+ builder_name = options.delete :builder
14
+ builder_name = :countable unless builder_name
15
+
16
+ @ranking_builders ||= {}
17
+ @ranking_builders[ranker.to_sym] = Almicube::Builder.instance(builder_name, options)
16
18
 
17
19
  class_eval <<-EVAL
18
20
  def self.#{ranker}_ranking(date = Date.today)
19
21
  @rankings ||= {}
20
- @rankings[:"#{ranker}:\#{date.to_s}"] ||= #{class_name}.build attribute_name: :#{ranker}, class_name: self, as: #{as}, date: date, per_page: #{per_page}
22
+ @rankings[:"#{ranker}:\#{date.to_s}"] ||= @ranking_builders[:#{ranker}].build(date)
21
23
  end
22
24
 
23
25
  def #{ranker}_ranking(date = Date.today)
@@ -12,7 +12,18 @@ module Almicube
12
12
  keys << key if connection.exists key
13
13
  keys
14
14
  end
15
- connection.zunionstore key, keys, aggregate: :sum
15
+ if %i[sum max min].include? aggregate_method
16
+ connection.zunionstore key, keys, aggregate: aggregate_method
17
+ elsif aggregate_method == :std
18
+ weights = Array.new keys.length, (1.0/keys.length)
19
+ connection.zunionstore key, keys, aggregate: :sum, weights: weights
20
+ else
21
+ connection.zunionstore key, keys, aggregate: :sum
22
+ end
23
+ end
24
+
25
+ def date
26
+ super - 1.days
16
27
  end
17
28
 
18
29
  def range
@@ -23,6 +34,10 @@ module Almicube
23
34
  :weekly
24
35
  end
25
36
 
37
+ def aggregate_method
38
+ aggregate = @options.fetch(:aggregate, :sum)
39
+ end
40
+
26
41
  protected
27
42
 
28
43
  def range_days(range, default = nil)
@@ -31,8 +46,6 @@ module Almicube
31
46
  1
32
47
  when :weekly
33
48
  7
34
- when :twice_weekly
35
- 14
36
49
  when :monthly
37
50
  30
38
51
  else
@@ -14,7 +14,8 @@ module Almicube
14
14
  date: Date.today,
15
15
  per_page: 10,
16
16
  as: Float,
17
- default_score: 0 }
17
+ default_score: 0,
18
+ class_name: nil }
18
19
  end
19
20
 
20
21
  def connection
@@ -49,7 +50,7 @@ module Almicube
49
50
  def page(page=1)
50
51
  page = [1, page.to_i].max
51
52
  revrange = connection.zrevrange(key, (page - 1) * per_page, page * per_page - 1)
52
- records = target_class.find(revrange)
53
+ records = target_class.where("id IN (?)", revrange).all
53
54
  revrange.inject([]) { |l, v| l << records.detect { |r| r.to_param == v } }
54
55
  end
55
56
 
@@ -122,7 +123,7 @@ module Almicube
122
123
  end
123
124
 
124
125
  def key_format(key_base, options)
125
- key = key_base.clone
126
+ key = key_base.to_s.clone
126
127
  tmp_options = options.merge date: options.fetch(:date, Date.today).strftime(@options[:date_format])
127
128
  key.match( self.class::KEY_PATTERN ) do |m|
128
129
  key.gsub! m[0], tmp_options.fetch(m[1].to_sym, '').to_s
@@ -1,3 +1,3 @@
1
1
  module Almicube
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/lib/almicube.rb CHANGED
@@ -4,6 +4,12 @@ module Almicube
4
4
  autoload :Model, 'almicube/model'
5
5
  autoload :AssociationProxy, 'almicube/proxy/association_proxy'
6
6
 
7
+ autoload :Builder, 'almicube/builder'
8
+ module Builder
9
+ autoload :CountableRankingBuilder, 'almicube/builder/countable_ranking_builder'
10
+ autoload :AverageRankingBuilder, 'almicube/builder/average_ranking_builder'
11
+ end
12
+
7
13
  if defined? ActiveRecord
8
14
  ActiveRecord::Base.send :include, Almicube::Model
9
15
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: almicube
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - niaeashes
@@ -52,6 +52,9 @@ files:
52
52
  - README.md
53
53
  - almicube.gemspec
54
54
  - lib/almicube.rb
55
+ - lib/almicube/builder.rb
56
+ - lib/almicube/builder/average_ranking_builder.rb
57
+ - lib/almicube/builder/countable_ranking_builder.rb
55
58
  - lib/almicube/model.rb
56
59
  - lib/almicube/proxy/association_proxy.rb
57
60
  - lib/almicube/ranged_ranking.rb