tagliani 0.1.0 → 0.1.1

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
  SHA256:
3
- metadata.gz: d64323e136019c5543ca2b8a4d6d3423016ba3ce678b842fc636ee14efb41197
4
- data.tar.gz: d25e45b3d8987e926834898257dd279490920401693c5b84c1290974b7d5edc5
3
+ metadata.gz: e389b80498b4068d2f0ff76a753238ebcfeadd0f8ebba7e54888c1c6c746d114
4
+ data.tar.gz: eb8003c90bef2fe855e01ab9acc07a5347ea4797d713d6fcd76b90b14b07b8fc
5
5
  SHA512:
6
- metadata.gz: 956c6f41b3b1e0b77be729eac4acf1f268afa8cb0e9989bf0efa9948e17feac735a3007bd4a414e1482d01c9c3cbba9d6a9cfa160217d5f6a41421b17206a613
7
- data.tar.gz: 769ef669c4b7501515c8b40d3cf294ec3a01c352dce6c9516447481dfb696820af4b6dfc970936daf494efdcb5e380f88235936863be4c9f86aaabec5821788a
6
+ metadata.gz: d855d2f48083d6aedaf07e22afce9cd099aa00e0df9e8d56262b9f3370a6a8fd060419683a13f5f408bc063f4ca79f2fc5da372766677e7eb50610e60c265250
7
+ data.tar.gz: c7b3e17649598aa49e560c125ed4a15bf8a893bce402b4003acce78d51ea98c00b2bc9c75933b3e6d55dae5bfe7b37226f8915a309e917489be429de72df21b8
data/README.md CHANGED
@@ -12,6 +12,30 @@ gem 'tagliani'
12
12
 
13
13
  And run `bundle install` command.
14
14
 
15
+ ### Requirements
16
+
17
+ * ActiveRecord
18
+ * redis-client
19
+ * elasticsearch
20
+
21
+ To run this gem it is required to have ActiveRecord.
22
+
23
+ ## Configuration
24
+
25
+ In your rails app `config/initializers` create `tagliani.rb` with the following content
26
+
27
+ ```ruby
28
+ Tagliani.configure do |config|
29
+ config.elasticsearch.url = "http://localhost:9200" # URL of your ElasticSearch service, by default set to this endpoint
30
+ config.elasticsearch.index = "tagliani_#{Rails.env}" # Index name
31
+ config.elasticsearch.refresh = true # false by default
32
+ config.elasticsearch.log = true # false by default
33
+ config.redis.url = "redis://localhost:6379/tagliani" # By default set to this endpoint
34
+ config.redis.queue = "tagliani" # By default set to this queue name
35
+ config.redis.length = 200 # By default set to 200. It is a queue length per bulk that is going to be sent to ElasticSearch
36
+ end
37
+ ```
38
+
15
39
  ## Search
16
40
 
17
41
  Let's say inside the Rails application you have a model with a name "Hashtag", that represents all the tags attached to the model "Tweet".
@@ -78,13 +102,19 @@ To index in bulks, simply execute:
78
102
  Tagliani::Search::Index.bulk!
79
103
  ```
80
104
 
81
- ### Requirements
105
+ ## Inherit tags from models
82
106
 
83
- * ActiveRecord
84
- * redis-client
85
- * elasticsearch
107
+ You can specify the models you want to inherit tags from by adding an option `:inherit` with a list of models in the `taggable` method.
86
108
 
87
- To run this gem it is required to have ActiveRecord.
109
+ ```ruby
110
+ class Album < ActiveRecord::Base
111
+ has_many :songs
112
+ belongs_to :artist
113
+ belongs_to :producer
114
+
115
+ taggable inherit: %i[artist producer]
116
+ end
117
+ ```
88
118
 
89
119
  ## Contributing
90
120
 
@@ -27,9 +27,10 @@ module Tagliani
27
27
  def taggable(options = {})
28
28
  Models.tagged << to_s
29
29
 
30
- class_attribute :_tag_kls, :_async
30
+ class_attribute :_tag_kls, :_async, :_inherit
31
31
 
32
32
  self._tag_kls = options[:tag_kls] || "Tag"
33
+ self._inherit = options[:inherit]
33
34
  self._async = options[:async]
34
35
 
35
36
  class_eval do
@@ -5,9 +5,21 @@ module Tagliani
5
5
  module Taggable
6
6
  extend ActiveSupport::Concern
7
7
 
8
+ def self.included(base)
9
+ base.class_eval do
10
+ after_save :inherit_tags, if: proc { self.tags.root }
11
+ end
12
+ end
13
+
8
14
  def tags
9
15
  Tags.new(self)
10
16
  end
17
+
18
+ private
19
+
20
+ def inherit_tags
21
+ tags.inherit
22
+ end
11
23
  end
12
24
  end
13
25
  end
@@ -23,7 +23,7 @@ module Tagliani
23
23
  end
24
24
 
25
25
  @index.add!({
26
- object_kls: @parent.class.to_s,
26
+ object_kls: parent_kls,
27
27
  object_id: @parent.id,
28
28
  created_at: @parent.try(:created_at),
29
29
  tag_id: record.id,
@@ -36,11 +36,11 @@ module Tagliani
36
36
  end
37
37
 
38
38
  def search(body: {}, where: nil)
39
- body.deep_merge!({
39
+ body.deep_merge!({
40
40
  query: {
41
41
  bool: {
42
42
  must: [
43
- { match: { object_kls: @parent.class.to_s } },
43
+ { match: { object_kls: parent_kls } },
44
44
  { term: { object_id: @parent.id } }
45
45
  ]
46
46
  }
@@ -49,6 +49,39 @@ module Tagliani
49
49
 
50
50
  Tagliani::Search.new(body: body, where: where).serialize(type: 'tag')
51
51
  end
52
+
53
+ def inherit
54
+ root.each do |object|
55
+ next if object.nil?
56
+
57
+ self.class.new(object).each do |ref|
58
+ add(name: ref.name)
59
+ end
60
+ end
61
+ end
62
+
63
+ def root
64
+ klasses = []
65
+
66
+ if @parent._inherit.respond_to?(:each)
67
+ klasses = @parent._inherit
68
+ else
69
+ klasses << @parent._inherit
70
+ end
71
+
72
+ objects = klasses.flat_map do |method|
73
+ next if method.nil?
74
+ @parent.send(method)
75
+ end
76
+
77
+ objects.compact
78
+ end
79
+
80
+ private
81
+
82
+ def parent_kls
83
+ @parent.class.base_class.to_s
84
+ end
52
85
  end
53
86
  end
54
87
  end
@@ -1,3 +1,3 @@
1
1
  module Tagliani
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tagliani
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aidan Rudkovskyi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-28 00:00:00.000000000 Z
11
+ date: 2019-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord