pg_translatable 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 195ffcc2dac4d8869cebed29bf078e351251813a
4
+ data.tar.gz: 6b3445128fb029069c4aa3067e6249f87be7b4e2
5
+ SHA512:
6
+ metadata.gz: 20425efa82a9a5f0402db52a64e3bbfd7a9b62cf6255de8fd64ef99ddcd88ca1d6dd5e560cbc066a7fbe66183cc8a7d3760dbfbb381413cfc0c0867a7481716e
7
+ data.tar.gz: 19c3363943b76ede4cd2933b7b5fb3016fa0a9dd8f2b56919372f8f76222b39918d5d508408dbbf2049e3988d3f2d30bbcd50f239fd209a78a660c85f43266c9
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /spec/test_app/log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,15 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
4
+ gemfile:
5
+ - gemfile
6
+ install:
7
+ - 'travis_retry bundle install'
8
+ addons:
9
+ postgresql: '9.4'
10
+ code_climate:
11
+ repo_token: 'f63c4f1a42eacd5c44d1393fea83ff8d669d1ef15e192584a8aada456883698b'
12
+ script:
13
+ - 'bundle exec rake spec'
14
+ before_script:
15
+ - psql -c 'create database pg_translatable_test;' -U postgres
@@ -0,0 +1,13 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
4
+
5
+ We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
6
+
7
+ Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
8
+
9
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
10
+
11
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
12
+
13
+ This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'rspec-rails', '~> 3.2'
7
+ gem 'factory_girl_rails', '~> 4.5'
8
+ gem 'rocket_pants', '~> 1.10'
9
+ gem 'pry', '~> 0.10'
10
+ gem 'pry-rails', '~> 0.3'
11
+ gem 'better_errors', '~> 2.1'
12
+ gem 'binding_of_caller', '~> 0.7'
13
+ gem 'sqlite3', '~> 1.3'
14
+ gem 'appraisal', '~> 1.0'
15
+ gem 'simplecov', '~> 0.9', require: false
16
+ gem 'codeclimate-test-reporter', require: nil
17
+ end
data/README.md ADDED
@@ -0,0 +1,34 @@
1
+ [![Build Status](https://travis-ci.org/Stankec/pg_translatable.svg?branch=master)](https://travis-ci.org/Stankec/pg_translatable)
2
+ [![Code Climate](https://codeclimate.com/github/Stankec/pg_translatable/badges/gpa.svg)](https://codeclimate.com/github/Stankec/pg_translatable)
3
+ [![Test Coverage](https://codeclimate.com/github/Stankec/pg_translatable/badges/coverage.svg)](https://codeclimate.com/github/Stankec/pg_translatable/coverage)
4
+
5
+ # About
6
+
7
+ Store translations in your PG database as HSTORE, JSON or JSONB.
8
+
9
+ # Instalation
10
+
11
+ To use this gem in your rails app simply add the following to your `Gemfile`:
12
+
13
+ ```Ruby
14
+ gem 'pg_translatable'
15
+ ```
16
+
17
+ # Development
18
+
19
+ After checking out the repo, make sure you have a Postgres database server
20
+ running on your machine then move to the `spec/test_app` directory and run the
21
+ following commands:
22
+
23
+ ```Bash
24
+ rake db:create
25
+ rake db:migrate
26
+ ```
27
+
28
+ # Contributing
29
+
30
+ 1. [Fork it]( https://github.com/Stankec/pg_translatable/fork )
31
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
32
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
33
+ 4. Push to the branch (`git push origin my-new-feature`)
34
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ begin
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ begin
9
+ require 'rspec'
10
+ rescue LoadError
11
+ puts 'You must `gem install rspec` to run tests'
12
+ end
13
+
14
+ APP_RAKEFILE = File.expand_path('../spec/test_app/Rakefile', __FILE__)
15
+ load 'rails/tasks/engine.rake'
16
+
17
+ Bundler::GemHelper.install_tasks
18
+
19
+ RSpec::Core::RakeTask.new(:spec)
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "pg_translatable"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,22 @@
1
+ module PgTranslatable
2
+ module Translatable
3
+ class Methods
4
+ class ClassMethods < PgTranslatable::Translatable::Methods
5
+ def define_methods
6
+ define_strong_params_fields
7
+ end
8
+
9
+ private
10
+
11
+ def define_strong_params_fields
12
+ languages_list = @languages.map { |locale| ":#{@column}_#{locale}" }
13
+ @object.class_eval <<-RUBY
14
+ define_singleton_method("#{@column}_fields") do
15
+ [#{languages_list.join(', ')}]
16
+ end
17
+ RUBY
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,80 @@
1
+ module PgTranslatable
2
+ module Translatable
3
+ class Methods
4
+ class InstanceMethods < PgTranslatable::Translatable::Methods
5
+ def define_methods
6
+ define_formatter
7
+ define_getter
8
+ define_hash_getter_and_setter
9
+ define_locale_setters_and_getters
10
+ end
11
+
12
+ private
13
+
14
+ def define_formatter
15
+ @object.class_eval <<-RUBY
16
+ define_method("#{@column_name}_formatter") do |value|
17
+ value
18
+ end
19
+ RUBY
20
+ end
21
+
22
+ def define_getter
23
+ @object.class_eval <<-RUBY
24
+ define_method("#{@column_name}") do
25
+ send("#{@column_name}_#{I18n.locale}")
26
+ end
27
+ RUBY
28
+ end
29
+
30
+ def define_hash_getter_and_setter
31
+ define_hash_getter
32
+ define_hash_setter
33
+ end
34
+
35
+ def define_hash_getter
36
+ @object.class_eval <<-RUBY
37
+ define_method("#{@column_name_plural}") do
38
+ self["#{@column}"] || {}
39
+ end
40
+ RUBY
41
+ end
42
+
43
+ def define_hash_setter
44
+ @object.class_eval <<-RUBY
45
+ define_method("#{@column_name_plural}=") do |value|
46
+ self[:#{@column}] = value
47
+ end
48
+ RUBY
49
+ end
50
+
51
+ def define_locale_setters_and_getters
52
+ define_locale_getter
53
+ define_locale_setter
54
+ end
55
+
56
+ def define_locale_getter
57
+ @languages.each do |locale|
58
+ @object.class_eval <<-RUBY
59
+ define_method("#{@column_name}_#{locale}") do
60
+ send("#{@column_name}_formatter",
61
+ send("#{@column_name_plural}")["#{locale}"]
62
+ )
63
+ end
64
+ RUBY
65
+ end
66
+ end
67
+
68
+ def define_locale_setter
69
+ @languages.each do |locale|
70
+ @object.class_eval <<-RUBY
71
+ define_method("#{@column_name}_#{locale}=") do |value|
72
+ send("#{@column_name_plural}")["#{locale}"] = value
73
+ end
74
+ RUBY
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,56 @@
1
+ require 'pg_translatable/translatable/methods/class_methods'
2
+ require 'pg_translatable/translatable/methods/instance_methods'
3
+
4
+ module PgTranslatable
5
+ module Translatable
6
+ class Methods
7
+ def initialize(object, column)
8
+ @object = object
9
+ @column = column
10
+ @languages = I18n.available_locales
11
+
12
+ raise_wrong_column_object_type
13
+
14
+ @column_name = @column.to_s.singularize
15
+ @column_name_plural = @column.to_s.pluralize
16
+
17
+ ensure_different_plural
18
+
19
+ @type = @object.columns_hash[@column.to_s].type
20
+
21
+ raise_wrong_column_type
22
+ end
23
+
24
+ private
25
+
26
+ def ensure_different_plural
27
+ return unless @column_name_plural == @column_name
28
+ @column_name_plural = "#{@column_name_plural}_translations"
29
+ end
30
+
31
+ def raise_wrong_column_type
32
+ accepted_types = [:hstore, :json, :jsonb]
33
+
34
+ return if accepted_types.include?(@type)
35
+
36
+ fail(
37
+ ArgumentError,
38
+ "Expected column '#{@column}' to be of type "\
39
+ "#{accepted_types.map { |type| type.to_s.upcase }.join(', ')} "\
40
+ "but was of type #{@type}"
41
+ )
42
+ end
43
+
44
+ def raise_wrong_column_object_type
45
+ return if @column.is_a?(String)
46
+ return if @column.is_a?(Symbol)
47
+
48
+ fail(
49
+ ArgumentError,
50
+ 'Pass the column name as a String or Symbol. '\
51
+ "You passed a #{@column.class.name}!"
52
+ )
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,12 @@
1
+ require 'pg_translatable/translatable/methods'
2
+
3
+ module PgTranslatable
4
+ module Translatable
5
+ def translate(*attrs)
6
+ attrs.each do |column|
7
+ Methods::ClassMethods.new(self, column).define_methods
8
+ Methods::InstanceMethods.new(self, column).define_methods
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module PgTranslatable
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 1
6
+ PRE = nil
7
+
8
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ require 'pg_translatable/version'
2
+ require 'pg_translatable/translatable'
3
+ require 'pry'
4
+
5
+ module PgTranslatable
6
+ end
7
+
8
+ if defined?(ActiveRecord::Base)
9
+ ActiveRecord::Base.extend(PgTranslatable::Translatable)
10
+ end
11
+
12
+ # binding.pry
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'pg_translatable/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'pg_translatable'
8
+ spec.version = PgTranslatable::Version::STRING
9
+ spec.authors = ['Stanko Krtalić Rusendić']
10
+ spec.email = ['stanko.krtalic@gmail.com']
11
+
12
+ spec.summary = 'Store translations in PG\'s non-sql store types'
13
+
14
+ spec.description = 'Store translations in your PG database as HSTORE, JSON '\
15
+ 'or JSONB.'
16
+
17
+ spec.homepage = 'https://github.com/Stankec/pg_translatable'
18
+
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(/^(test|spec|features)\//)
21
+ end
22
+
23
+ spec.bindir = 'exe'
24
+ spec.executables = spec.files.grep(/^exe\//) { |f| File.basename(f) }
25
+ spec.require_paths = %w(lib)
26
+
27
+ spec.add_dependency 'rails'
28
+ spec.add_dependency 'pg'
29
+
30
+ spec.add_development_dependency 'rspec-rails', '~> 3.2'
31
+ spec.add_development_dependency 'factory_girl_rails', '~> 4.5'
32
+ spec.add_development_dependency 'pry', '~> 0.10'
33
+ spec.add_development_dependency 'pry-rails', '~> 0.3'
34
+ spec.add_development_dependency 'better_errors', '~> 2.1'
35
+ spec.add_development_dependency 'binding_of_caller', '~> 0.7'
36
+ spec.add_development_dependency 'rake', '~> 10.0'
37
+ spec.add_development_dependency 'bundler'
38
+ end
metadata ADDED
@@ -0,0 +1,200 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pg_translatable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Stanko Krtalić Rusendić
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-08-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pg
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: factory_girl_rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '4.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.10'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.10'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: better_errors
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.1'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: binding_of_caller
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.7'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.7'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '10.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '10.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: bundler
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Store translations in your PG database as HSTORE, JSON or JSONB.
154
+ email:
155
+ - stanko.krtalic@gmail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - ".rspec"
162
+ - ".travis.yml"
163
+ - CODE_OF_CONDUCT.md
164
+ - Gemfile
165
+ - README.md
166
+ - Rakefile
167
+ - bin/console
168
+ - bin/setup
169
+ - lib/pg_translatable.rb
170
+ - lib/pg_translatable/translatable.rb
171
+ - lib/pg_translatable/translatable/methods.rb
172
+ - lib/pg_translatable/translatable/methods/class_methods.rb
173
+ - lib/pg_translatable/translatable/methods/instance_methods.rb
174
+ - lib/pg_translatable/version.rb
175
+ - pg_translatable.gemspec
176
+ homepage: https://github.com/Stankec/pg_translatable
177
+ licenses: []
178
+ metadata: {}
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 2.4.5
196
+ signing_key:
197
+ specification_version: 4
198
+ summary: Store translations in PG's non-sql store types
199
+ test_files: []
200
+ has_rdoc: