awesome_hstore_translate 0.1.0 → 0.2.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: fe3efb120f94ec493d1060c558f02ab06cc623af
4
- data.tar.gz: cf33e049416e9b841095eca3826f599f25618989
3
+ metadata.gz: 776affdef8d15b23476763a402444c5cd9d77f52
4
+ data.tar.gz: 119148870bf3a17cda07f86c017652c742345aae
5
5
  SHA512:
6
- metadata.gz: af5faab9487a7aa3c4597a601b94d5056a04c6bca14e488d90e8cf6c12fa80bdaa3262f61ed75f34d659402376b35f073e2822d609f568f2ed8303157a84e1a4
7
- data.tar.gz: e39ba04a78f235157946d7794c53e4326977cca208154195d5924ab8be59e289212a15d8a93a03f85c7ee2886345c2fe44788ee240b8dbc3ac2ec90ae25ced9d
6
+ metadata.gz: f1c7928bd63ef520c96de9183905e2008a7140fd43644cb7499b1eec466c464555104dfba7b041a9e2fb4fdf77a59e31638dcbcb400ee68a730d092b8898c8e6
7
+ data.tar.gz: 6123dae82312fa213b1b4cc7160d02276846c281d48755537a3acdc579d83cdc8b923f3af462464ced517995a79b8b3ebf23b2873c452b29e34fac5bf90235ae
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Awesome Hstore Translate
2
+ [![Gem Version](https://badge.fury.io/rb/awesome_hstore_translate.svg)](https://badge.fury.io/rb/awesome_hstore_translate)
3
+
2
4
  This gem uses PostgreSQLs hstore datatype and ActiveRecord models to translate model data. It is based on the gem
3
- [hstore_translate](https://github.com/Leadformance/hstore_translate) by Rob Worely.
5
+ [`hstore_translate`](https://github.com/Leadformance/hstore_translate) by Rob Worely.
4
6
 
5
7
  - It's ready for Rails 5
6
8
  - No extra columns or tables needed to operate
@@ -8,14 +10,18 @@ This gem uses PostgreSQLs hstore datatype and ActiveRecord models to translate m
8
10
  - Everything is well tested
9
11
 
10
12
  ## Features
11
- - [x] Attributes override / Raw attributes
12
- - [x] Fallbacks
13
- - [x] Language specific accessors
14
- - [ ] Support instance selection (e. g. `where`, `find_by`)
15
- - [ ] Support `friendly_id`
13
+ - [x] `v0.1.0` Attributes override / Raw attributes
14
+ - [x] `v0.1.0` Fallbacks
15
+ - [x] `v0.1.0` Language specific accessors
16
+ - [x] `v0.2.0` Awesome Hstore Translate as drop in replace for [`hstore_translate`](https://github.com/Leadformance/hstore_translate)
17
+ - `with_[attr]_translation(str)` is not supported
18
+ - [x] `v0.2.0` Support record selection via ActiveRecord (e. g. `where`, `find_by`)
19
+ - maybe it's a bad idea to implement this
20
+ - [ ] `backlog` Support `friendly_id` (see `friendly_id-awesome_hstore` gem)
16
21
 
17
22
  ## Requirements
18
23
  - ActiveRecord `>= 5`
24
+ - Please use [`hstore_translate`](https://github.com/Leadformance/hstore_translate), if you are on an older version.
19
25
  - I18n
20
26
 
21
27
  ## Installation
@@ -129,6 +135,21 @@ p.title_en # => English title
129
135
  p.title_de # => Deutscher Titel
130
136
  ```
131
137
 
138
+ ### Find
139
+ `awesome_hstore_translate` patches ActiveRecord, so you can conviniently use `where` and `find_by` as you like.
140
+ ```ruby
141
+ Page.create!(:title_en => 'English title', :title_de => 'Deutscher Titel')
142
+ Page.create!(:title_en => 'Another English title', :title_de => 'Noch ein Deutscher Titel')
143
+
144
+ Page.where(title: 'Another English title') # => Page
145
+ ```
146
+
147
+
148
+ ### Upgrade from [`hstore_translate`](https://github.com/Leadformance/hstore_translate)
149
+ 1. Replace the [`hstore_translate`](https://github.com/Leadformance/hstore_translate) with `awesome_hstore_translate` in your Gemfile
150
+ 1. Activate accessors, if you used the [`hstore_translate`](https://github.com/Leadformance/hstore_translate) accessors
151
+ 1. Replace `with_[attr]_translation(str)` with equivalents (see "Support record selection via ActiveRecord" feature)
152
+
132
153
  ## Development
133
154
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
134
155
 
@@ -4,6 +4,8 @@ module AwesomeHstoreTranslate
4
4
  autoload :ActAsTranslatable, 'awesome_hstore_translate/active_record/act_as_translatable'
5
5
  autoload :Attributes, 'awesome_hstore_translate/active_record/attributes'
6
6
  autoload :ClassMethods, 'awesome_hstore_translate/active_record/class_methods'
7
+ autoload :Core, 'awesome_hstore_translate/active_record/core'
7
8
  autoload :InstanceMethods, 'awesome_hstore_translate/active_record/instance_methods'
9
+ autoload :QueryMethods, 'awesome_hstore_translate/active_record/query_methods'
8
10
  end
9
11
  end
@@ -47,6 +47,7 @@ module AwesomeHstoreTranslate
47
47
  expose_translated_attrs(attr_names)
48
48
 
49
49
  include InstanceMethods
50
+ extend Core::ClassMethods
50
51
  extend ClassMethods
51
52
  end
52
53
  end
@@ -24,6 +24,13 @@ module AwesomeHstoreTranslate
24
24
  def toggle_fallback
25
25
  translation_options[:fallbacks] = !translation_options[:fallbacks]
26
26
  end
27
+
28
+ private
29
+
30
+ # Override the default relation methods in order to inject custom finder methods for hstore translations.
31
+ def relation
32
+ super.extending!(QueryMethods)
33
+ end
27
34
  end
28
35
  end
29
36
  end
@@ -0,0 +1,22 @@
1
+ module AwesomeHstoreTranslate
2
+ module ActiveRecord
3
+ module Core
4
+ module ClassMethods
5
+ def find_by(*args)
6
+ attrs = args.first
7
+ if attrs.is_a?(Hash) && contains_translated_attributes(attrs)
8
+ where(attrs).limit(1).first
9
+ else
10
+ super(args)
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def contains_translated_attributes(attrs)
17
+ !(self.translated_attribute_names & attrs.keys).empty?
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -8,11 +8,13 @@ module AwesomeHstoreTranslate
8
8
  locales << locale
9
9
  locales += get_fallback_for_locale(locale) || [] if translation_options[:fallbacks]
10
10
 
11
- translations = read_attribute(attr)
11
+ translations = read_raw_attribute(attr)
12
12
 
13
- locales.uniq.each do |cur|
14
- if translations.has_key?(cur.to_s) && !translations[cur.to_s].empty?
15
- return translations[cur.to_s]
13
+ if translations
14
+ locales.uniq.each do |cur|
15
+ if translations.has_key?(cur.to_s) && !translations[cur.to_s].empty?
16
+ return translations[cur.to_s]
17
+ end
16
18
  end
17
19
  end
18
20
 
@@ -20,7 +22,7 @@ module AwesomeHstoreTranslate
20
22
  end
21
23
 
22
24
  def read_raw_attribute(attr)
23
- read_attribute(attr)
25
+ read_attribute(get_column_name(attr))
24
26
  end
25
27
 
26
28
  def write_translated_attribute(attr, value, locale= I18n.locale)
@@ -30,12 +32,22 @@ module AwesomeHstoreTranslate
30
32
  end
31
33
 
32
34
  def write_raw_attribute(attr, value)
33
- write_attribute(attr, value)
35
+ write_attribute(get_column_name(attr), value)
34
36
  end
35
37
 
36
38
  def get_fallback_for_locale(locale)
37
39
  I18n.fallbacks[locale] if I18n.respond_to?(:fallbacks)
38
40
  end
41
+
42
+ private
43
+
44
+ def get_column_name(attr)
45
+ column_name = attr.to_s
46
+ # detect column from original hstore_translate
47
+ column_name << '_translations' if !has_attribute?(column_name) && has_attribute?("#{column_name}_translations")
48
+
49
+ column_name
50
+ end
39
51
  end
40
52
  end
41
53
  end
@@ -0,0 +1,37 @@
1
+ module AwesomeHstoreTranslate
2
+ module ActiveRecord
3
+ module QueryMethods
4
+ class WhereChain < ::ActiveRecord::QueryMethods::WhereChain
5
+ end
6
+
7
+ def where(opts = :chain, *rest)
8
+ if opts == :chain
9
+ WhereChain.new(spawn)
10
+ elsif opts.blank?
11
+ return self
12
+ elsif opts.is_a?(Hash)
13
+ translated_attrs = translated_attributes(opts)
14
+ normal_attrs = opts.reject{ |key, _| translated_attrs.include? key}
15
+ query = spawn
16
+ query.where!(normal_attrs) unless normal_attrs.empty?
17
+
18
+ translated_attrs.each do |attribute|
19
+ if opts[attribute].is_a?(String)
20
+ query.where!("'#{opts[attribute]}' = any(avals(#{attribute}))")
21
+ else
22
+ super(opts, rest)
23
+ end
24
+ end
25
+ return query
26
+ end
27
+ super(opts, rest)
28
+ end
29
+
30
+ private
31
+
32
+ def translated_attributes(opts)
33
+ self.translated_attribute_names & opts.keys
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,3 +1,3 @@
1
1
  module AwesomeHstoreTranslate
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awesome_hstore_translate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robin Bühler
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-07-20 00:00:00.000000000 Z
12
+ date: 2016-07-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -161,7 +161,9 @@ files:
161
161
  - lib/awesome_hstore_translate/active_record/act_as_translatable.rb
162
162
  - lib/awesome_hstore_translate/active_record/attributes.rb
163
163
  - lib/awesome_hstore_translate/active_record/class_methods.rb
164
+ - lib/awesome_hstore_translate/active_record/core.rb
164
165
  - lib/awesome_hstore_translate/active_record/instance_methods.rb
166
+ - lib/awesome_hstore_translate/active_record/query_methods.rb
165
167
  - lib/awesome_hstore_translate/version.rb
166
168
  homepage: https://github.com/openscript/awesome_hstore_translate
167
169
  licenses: