champollion 0.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.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +36 -0
  5. data/app/assets/javascripts/champollion/application.js +15 -0
  6. data/app/assets/stylesheets/champollion/application.css +15 -0
  7. data/app/controllers/champollion/application_controller.rb +4 -0
  8. data/app/controllers/champollion/translations_controller.rb +65 -0
  9. data/app/helpers/champollion/application_helper.rb +4 -0
  10. data/app/models/champollion/translation.rb +27 -0
  11. data/app/views/champollion/translations/_form.html.erb +38 -0
  12. data/app/views/champollion/translations/edit.html.erb +6 -0
  13. data/app/views/champollion/translations/index.html.erb +31 -0
  14. data/app/views/champollion/translations/new.html.erb +5 -0
  15. data/app/views/champollion/translations/show.html.erb +28 -0
  16. data/app/views/layouts/champollion/application.html.erb +14 -0
  17. data/config/initializers/locale.rb +4 -0
  18. data/config/routes.rb +5 -0
  19. data/db/migrate/20150417194342_create_translations.rb +13 -0
  20. data/db/migrate/20150504193440_create_versions.rb +13 -0
  21. data/lib/champollion.rb +4 -0
  22. data/lib/champollion/engine.rb +15 -0
  23. data/lib/champollion/version.rb +3 -0
  24. data/lib/tasks/champollion_tasks.rake +4 -0
  25. data/spec/controllers/champollion/translations_controller_spec.rb +153 -0
  26. data/spec/dummy/README.rdoc +28 -0
  27. data/spec/dummy/Rakefile +6 -0
  28. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  29. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  30. data/spec/dummy/app/controllers/application_controller.rb +7 -0
  31. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  32. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  33. data/spec/dummy/bin/bundle +3 -0
  34. data/spec/dummy/bin/rails +4 -0
  35. data/spec/dummy/bin/rake +4 -0
  36. data/spec/dummy/bin/setup +29 -0
  37. data/spec/dummy/config.ru +4 -0
  38. data/spec/dummy/config/application.rb +32 -0
  39. data/spec/dummy/config/boot.rb +5 -0
  40. data/spec/dummy/config/database.yml +25 -0
  41. data/spec/dummy/config/environment.rb +5 -0
  42. data/spec/dummy/config/environments/development.rb +41 -0
  43. data/spec/dummy/config/environments/production.rb +79 -0
  44. data/spec/dummy/config/environments/test.rb +42 -0
  45. data/spec/dummy/config/initializers/assets.rb +11 -0
  46. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  47. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  48. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  49. data/spec/dummy/config/initializers/inflections.rb +16 -0
  50. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  51. data/spec/dummy/config/initializers/session_store.rb +3 -0
  52. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  53. data/spec/dummy/config/locales/en.yml +23 -0
  54. data/spec/dummy/config/routes.rb +3 -0
  55. data/spec/dummy/config/secrets.yml +22 -0
  56. data/spec/dummy/db/development.sqlite3 +0 -0
  57. data/spec/dummy/db/migrate/20150504185150_create_translations.champollion.rb +14 -0
  58. data/spec/dummy/db/migrate/20150504193530_create_versions.champollion.rb +14 -0
  59. data/spec/dummy/db/schema.rb +37 -0
  60. data/spec/dummy/db/test.sqlite3 +0 -0
  61. data/spec/dummy/log/development.log +126 -0
  62. data/spec/dummy/log/test.log +21518 -0
  63. data/spec/dummy/public/404.html +67 -0
  64. data/spec/dummy/public/422.html +67 -0
  65. data/spec/dummy/public/500.html +66 -0
  66. data/spec/dummy/public/favicon.ico +0 -0
  67. data/spec/factories/translation.rb +7 -0
  68. data/spec/models/champollion/translation_spec.rb +51 -0
  69. data/spec/routing/champollion/translations_routing_spec.rb +39 -0
  70. data/spec/spec_helper.rb +17 -0
  71. metadata +249 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5ebbcfd645ca35bd4e73e1d1766ff5dfecc0dc0b
4
+ data.tar.gz: acb3be8233db305fcf643c6bec654f6565edee92
5
+ SHA512:
6
+ metadata.gz: 2180a468f62df7bd00c0637783d28256e7a18778ca14030027f2d17898619f7c136233332d4af6c5f211acea0a5b0d602dbb309986a25cf9f8fa9c066eb9680f
7
+ data.tar.gz: e080ccc9da6294d779c04946013e932c503a9b5167faf38e5597bd6832f6ba8467f2a4273c1a9f036901070e8e336f6a895d41c1fc96bac218245dbed3a0a4b6
@@ -0,0 +1,20 @@
1
+ Copyright 2015 Razvan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,3 @@
1
+ = Champollion
2
+
3
+ This project rocks and uses MIT-LICENSE.
@@ -0,0 +1,36 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Champollion'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+
24
+
25
+ Bundler::GemHelper.install_tasks
26
+
27
+
28
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
29
+
30
+ require 'rspec/core'
31
+ require 'rspec/core/rake_task'
32
+
33
+ desc "Run all specs in spec directory (excluding plugin specs)"
34
+ RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
35
+
36
+ task :default => :spec
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module Champollion
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,65 @@
1
+ require_dependency "champollion/application_controller"
2
+
3
+ module Champollion
4
+ class TranslationsController < ApplicationController
5
+ before_action :set_translation, only: [:show, :edit, :update, :destroy]
6
+
7
+ # GET /translations
8
+ def index
9
+ respond_to do |format|
10
+ format.html { @translations = Translation.all }
11
+ format.json { render json: Translation.all_translations.to_json }
12
+ end
13
+ end
14
+
15
+ # GET /translations/1
16
+ def show
17
+ end
18
+
19
+ # GET /translations/new
20
+ def new
21
+ @translation = Translation.new
22
+ end
23
+
24
+ # GET /translations/1/edit
25
+ def edit
26
+ end
27
+
28
+ # POST /translations
29
+ def create
30
+ @translation = Translation.new(translation_params)
31
+
32
+ if @translation.save
33
+ redirect_to @translation, notice: 'Translation was successfully created.'
34
+ else
35
+ render :new
36
+ end
37
+ end
38
+
39
+ # PATCH/PUT /translations/1
40
+ def update
41
+ if @translation.update(translation_params)
42
+ redirect_to @translation, notice: 'Translation was successfully updated.'
43
+ else
44
+ render :edit
45
+ end
46
+ end
47
+
48
+ # DELETE /translations/1
49
+ def destroy
50
+ @translation.destroy
51
+ redirect_to translations_url, notice: 'Translation was successfully destroyed.'
52
+ end
53
+
54
+ private
55
+ # Use callbacks to share common setup or constraints between actions.
56
+ def set_translation
57
+ @translation = Translation.find(params[:id])
58
+ end
59
+
60
+ # Only allow a trusted parameter "white list" through.
61
+ def translation_params
62
+ params.require(:translation).permit(:locale, :key, :value, :interpolations, :is_proc)
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,4 @@
1
+ module Champollion
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,27 @@
1
+ module Champollion
2
+ class Translation < ActiveRecord::Base
3
+ self.table_name = "translations"
4
+
5
+ has_paper_trail
6
+
7
+ validates :locale, presence: true
8
+ validates :key, presence: true
9
+ validates :value, presence: true
10
+
11
+ def self.all_translations
12
+ # create empty hash for locales
13
+ translation_hash = Hash.new { |k,v| k[v] = {} }
14
+
15
+ # iterate through the translation records
16
+ all.each do |translation|
17
+ # get the key components
18
+ key_scopes = translation.key.split(".")
19
+
20
+ translation_hash[translation.locale.to_sym] ||= {}
21
+ translation_hash[translation.locale.to_sym].merge!(key_scopes.reverse.inject(translation.value) {|a,n| { n.to_sym => a}})
22
+ end
23
+
24
+ translation_hash
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,38 @@
1
+ <%= form_for(@translation) do |f| %>
2
+ <% if @translation.errors.any? %>
3
+ <div id="error_explanation">
4
+ <h2><%= pluralize(@translation.errors.count, "error") %> prohibited this translation from being saved:</h2>
5
+
6
+ <ul>
7
+ <% @translation.errors.full_messages.each do |message| %>
8
+ <li><%= message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div class="field">
15
+ <%= f.label :locale %><br>
16
+ <%= f.text_field :locale %>
17
+ </div>
18
+ <div class="field">
19
+ <%= f.label :key %><br>
20
+ <%= f.text_field :key %>
21
+ </div>
22
+ <div class="field">
23
+ <%= f.label :value %><br>
24
+ <%= f.text_area :value %>
25
+ </div>
26
+ <div class="field">
27
+ <%= f.label :interpolations %><br>
28
+ <%= f.text_field :interpolations %>
29
+ </div>
30
+ <div class="field">
31
+ <%= f.label :is_proc %><br>
32
+ <%= f.check_box :is_proc %>
33
+ </div>
34
+
35
+ <div class="actions">
36
+ <%= f.submit %>
37
+ </div>
38
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <h1>Editing Translation</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Show', @tranlation %> |
6
+ <%= link_to 'Back', translations_path %>
@@ -0,0 +1,31 @@
1
+ <p id="notice"><%= notice %></p>
2
+
3
+ <h1>Listing Translations</h1>
4
+
5
+ <table>
6
+ <thead>
7
+ <tr>
8
+ <th>Locale</th>
9
+ <th>Key</th>
10
+ <th>Value</th>
11
+ <th colspan="3"></th>
12
+ </tr>
13
+ </thead>
14
+
15
+ <tbody>
16
+ <% @translations.each do |translation| %>
17
+ <tr>
18
+ <td><%= translation.locale %></td>
19
+ <td><%= translation.key %></td>
20
+ <td><%= translation.value %></td>
21
+ <td><%= link_to 'Show', translation %></td>
22
+ <td><%= link_to 'Edit', edit_translation_path(translation) %></td>
23
+ <td><%= link_to 'Destroy', translation, method: :delete, data: { confirm: 'Are you sure?' } %></td>
24
+ </tr>
25
+ <% end %>
26
+ </tbody>
27
+ </table>
28
+
29
+ <br>
30
+
31
+ <%= link_to 'New Translation', new_translation_path %>
@@ -0,0 +1,5 @@
1
+ <h1>New Translation</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Back', translations_path %>
@@ -0,0 +1,28 @@
1
+ <p id="notice"><%= notice %></p>
2
+
3
+ <p>
4
+ <strong>Locale:</strong>
5
+ <%= @translation.locale %>
6
+ </p>
7
+
8
+ <p>
9
+ <strong>Key:</strong>
10
+ <%= @translation.key %>
11
+ </p>
12
+
13
+ <p>
14
+ <strong>Value:</strong>
15
+ <%= @translation.value %>
16
+ </p>
17
+
18
+ <p>
19
+ <h2>Versions</h2>
20
+ <ul>
21
+ <% @translation.versions.each do |version| %>
22
+ <li><%= version.event %> | <%= version.index %> @ <%= version.created_at %></li>
23
+ <% end %>
24
+ </ul>
25
+ </p>
26
+
27
+ <%= link_to 'Edit', edit_translation_path(@translation) %> |
28
+ <%= link_to 'Back', translations_path %>
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Champollion</title>
5
+ <%= stylesheet_link_tag "champollion/application", media: "all" %>
6
+ <%= javascript_include_tag "champollion/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,4 @@
1
+ require "i18n/backend/active_record"
2
+
3
+ I18n.backend = I18n::Backend::ActiveRecord.new
4
+ I18n.config.enforce_available_locales = false
@@ -0,0 +1,5 @@
1
+ Champollion::Engine.routes.draw do
2
+ resources :translations
3
+
4
+ root 'translations#index'
5
+ end
@@ -0,0 +1,13 @@
1
+ class CreateTranslations < ActiveRecord::Migration
2
+ def change
3
+ create_table :translations do |t|
4
+ t.string :locale
5
+ t.string :key
6
+ t.text :value
7
+ t.text :interpolations
8
+ t.boolean :is_proc, default: false
9
+
10
+ t.timestamps null: false
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class CreateVersions < ActiveRecord::Migration
2
+ def change
3
+ create_table :versions do |t|
4
+ t.string :item_type, :null => false
5
+ t.integer :item_id, :null => false
6
+ t.string :event, :null => false
7
+ t.string :whodunnit
8
+ t.text :object
9
+ t.datetime :created_at
10
+ end
11
+ add_index :versions, [:item_type, :item_id]
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ require "champollion/engine"
2
+
3
+ module Champollion
4
+ end
@@ -0,0 +1,15 @@
1
+ require "paper_trail"
2
+
3
+ module Champollion
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace Champollion
6
+
7
+ config.generators do |g|
8
+ g.test_framework :rspec, :fixture => false
9
+ g.fixture_replacement :factory_girl, :dir => 'spec/factories'
10
+ g.assets false
11
+ g.helper false
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module Champollion
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :champollion do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,153 @@
1
+ require 'spec_helper'
2
+
3
+ module Champollion
4
+ RSpec.describe TranslationsController, :type => :controller do
5
+ routes { Champollion::Engine.routes }
6
+
7
+ let(:valid_attributes) {
8
+ {
9
+ locale: :en,
10
+ key: 'home.button',
11
+ value: 'Hello'
12
+ }
13
+ }
14
+
15
+ let(:invalid_attributes) {
16
+ {
17
+ locale: :en
18
+ }
19
+ }
20
+
21
+ describe "GET index" do
22
+ it "assigns all translations as @translations" do
23
+ translation = Translation.create! valid_attributes
24
+ get :index
25
+ expect(assigns(:translations)).to eq([translation])
26
+ end
27
+
28
+ it "returns json array when format is json" do
29
+ Translation.create! valid_attributes
30
+
31
+ get :index, format: :json
32
+ expect(response).to be_success
33
+
34
+ body = JSON.parse(response.body)
35
+ expect(body).to include("en")
36
+ expect(body).to eq({"en" => {"home" => {"button" => "Hello"}}})
37
+ end
38
+ end
39
+
40
+ describe "GET show" do
41
+ it "assigns the requested translation as @translation" do
42
+ translation = Translation.create! valid_attributes
43
+ get :show, {:id => translation.to_param}
44
+ expect(assigns(:translation)).to eq(translation)
45
+ end
46
+ end
47
+
48
+ describe "GET new" do
49
+ it "assigns a new translation as @translation" do
50
+ get :new
51
+ expect(assigns(:translation)).to be_a_new(Translation)
52
+ end
53
+ end
54
+
55
+ describe "GET edit" do
56
+ it "assigns the requested translation as @translation" do
57
+ translation = Translation.create! valid_attributes
58
+ get :edit, {:id => translation.to_param}
59
+ expect(assigns(:translation)).to eq(translation)
60
+ end
61
+ end
62
+
63
+ describe "POST create" do
64
+ describe "with valid params" do
65
+ it "creates a new Translation" do
66
+ expect {
67
+ post :create, {:translation => valid_attributes}
68
+ }.to change(Translation, :count).by(1)
69
+ end
70
+
71
+ it "assigns a newly created translation as @translation" do
72
+ post :create, {:translation => valid_attributes}
73
+ expect(assigns(:translation)).to be_a(Translation)
74
+ expect(assigns(:translation)).to be_persisted
75
+ end
76
+
77
+ it "redirects to the created translation" do
78
+ post :create, {:translation => valid_attributes}
79
+ expect(response).to redirect_to(Translation.last)
80
+ end
81
+ end
82
+
83
+ describe "with invalid params" do
84
+ it "assigns a newly created but unsaved translation as @translation" do
85
+ post :create, {:translation => invalid_attributes}
86
+ expect(assigns(:translation)).to be_a_new(Translation)
87
+ end
88
+
89
+ end
90
+ end
91
+
92
+ describe "PUT update" do
93
+ describe "with valid params" do
94
+ let(:new_attributes) {
95
+ {
96
+ locale: :en,
97
+ key: 'home.button',
98
+ value: 'New value'
99
+ }
100
+ }
101
+
102
+ it "updates the requested translation" do
103
+ translation = Translation.create! valid_attributes
104
+ put :update, {:id => translation.to_param, :translation => new_attributes}
105
+ translation.reload
106
+ expect(translation.value).to eq("New value")
107
+ end
108
+
109
+ it "assigns the requested translation as @translation" do
110
+ translation = Translation.create! valid_attributes
111
+ put :update, {:id => translation.to_param, :translation => valid_attributes}
112
+ expect(assigns(:translation)).to eq(translation)
113
+ end
114
+
115
+ it "redirects to the translation" do
116
+ translation = Translation.create! valid_attributes
117
+ put :update, {:id => translation.to_param, :translation => valid_attributes}
118
+ expect(response).to redirect_to(translation)
119
+ end
120
+ end
121
+
122
+ describe "with invalid params" do
123
+ it "assigns the translation as @translation" do
124
+ translation = Translation.create! valid_attributes
125
+ put :update, {:id => translation.to_param, :translation => invalid_attributes}
126
+ expect(assigns(:translation)).to eq(translation)
127
+ end
128
+
129
+ it "re-renders the 'edit' translation" do
130
+ translation = Translation.create! valid_attributes
131
+ put :update, {:id => translation.to_param, :translation => invalid_attributes}
132
+ expect(response).to redirect_to(translation)
133
+ end
134
+ end
135
+ end
136
+
137
+ describe "DELETE destroy" do
138
+ it "destroys the requested translation" do
139
+ translation = Translation.create! valid_attributes
140
+ expect {
141
+ delete :destroy, {:id => translation.to_param}
142
+ }.to change(Translation, :count).by(-1)
143
+ end
144
+
145
+ it "redirects to the translations list" do
146
+ translation = Translation.create! valid_attributes
147
+ delete :destroy, {:id => translation.to_param}
148
+ expect(response).to redirect_to(translations_url)
149
+ end
150
+ end
151
+
152
+ end
153
+ end