kete_translatable_content 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 (74) hide show
  1. data/.document +5 -0
  2. data/.gitignore +23 -0
  3. data/LICENSE +295 -0
  4. data/README.rdoc +80 -0
  5. data/README.rdoc.orig +72 -0
  6. data/Rakefile +53 -0
  7. data/VERSION +1 -0
  8. data/app/views/active_scaffold_overrides/_show.html.erb +8 -0
  9. data/app/views/active_scaffold_overrides/_update_form.html.erb +8 -0
  10. data/app/views/active_scaffold_overrides/list.html.erb +5 -0
  11. data/app/views/baskets/_additional_footer_content_fields.html.erb +33 -0
  12. data/app/views/baskets/_rss_feed.html.erb +42 -0
  13. data/app/views/baskets/_side_bar_html.html.erb +19 -0
  14. data/app/views/configure/section.rhtml +36 -0
  15. data/app/views/layouts/translations.html.erb +1 -0
  16. data/app/views/topics/_content_wrapper_start.rhtml +26 -0
  17. data/app/views/translations/_form.html.erb +54 -0
  18. data/app/views/translations/_translatable_value.html.erb +36 -0
  19. data/app/views/translations/_translation_field_input.html.erb +61 -0
  20. data/app/views/translations/show.html.erb +12 -0
  21. data/app/views/translations/versioned_edit.html.erb +9 -0
  22. data/config/locales/en.yml +51 -0
  23. data/config/routes.rb +11 -0
  24. data/config/translatables.yml +65 -0
  25. data/generators/kete_translatable_content_migration/USAGE +2 -0
  26. data/generators/kete_translatable_content_migration/kete_translatable_content_migration_generator.rb +7 -0
  27. data/generators/kete_translatable_content_migration/templates/migration.rb +82 -0
  28. data/generators/kete_translatable_content_tests/USAGE +2 -0
  29. data/generators/kete_translatable_content_tests/kete_translatable_content_tests_generator.rb +38 -0
  30. data/generators/kete_translatable_content_tests/templates/configure_kete_content_translation_controller_and_routes_test.rb +48 -0
  31. data/generators/kete_translatable_content_tests/templates/configure_kete_content_translation_test.rb +47 -0
  32. data/generators/kete_translatable_content_tests/templates/kete_translatable_content_helper_test.rb +19 -0
  33. data/generators/kete_translatable_content_tests/templates/kete_translatable_content_migration_test.rb +45 -0
  34. data/generators/kete_translatable_content_tests/templates/kete_translatable_content_oai_dc_helpers_test.rb +66 -0
  35. data/generators/kete_translatable_content_tests/templates/kete_translatable_content_translations_test.rb +23 -0
  36. data/generators/kete_translatable_content_tests/templates/kete_translations_test.rb +57 -0
  37. data/generators/kete_translatable_content_tests/templates/mongo_factories.rb +6 -0
  38. data/generators/kete_translatable_content_tests/templates/mongo_test_helper.rb +37 -0
  39. data/generators/kete_translatable_content_tests/templates/mongo_translatable_test.rb +262 -0
  40. data/lib/kete_translatable_content.rb +54 -0
  41. data/lib/kete_translatable_content/extensions/controllers/application_controller.rb +202 -0
  42. data/lib/kete_translatable_content/extensions/controllers/audio_controller.rb +7 -0
  43. data/lib/kete_translatable_content/extensions/controllers/baskets_controller.rb +3 -0
  44. data/lib/kete_translatable_content/extensions/controllers/documents_controller.rb +7 -0
  45. data/lib/kete_translatable_content/extensions/controllers/images_controller.rb +7 -0
  46. data/lib/kete_translatable_content/extensions/controllers/topics_controller.rb +7 -0
  47. data/lib/kete_translatable_content/extensions/controllers/translations_controller.rb +209 -0
  48. data/lib/kete_translatable_content/extensions/controllers/video_controller.rb +7 -0
  49. data/lib/kete_translatable_content/extensions/controllers/web_links_controller.rb +7 -0
  50. data/lib/kete_translatable_content/extensions/extended_content_translation.rb +54 -0
  51. data/lib/kete_translatable_content/extensions/helpers/application_helper.rb +156 -0
  52. data/lib/kete_translatable_content/extensions/helpers/extended_fields_helper.rb +17 -0
  53. data/lib/kete_translatable_content/extensions/helpers/search_helper.rb +5 -0
  54. data/lib/kete_translatable_content/extensions/helpers/translations_helper.rb +72 -0
  55. data/lib/kete_translatable_content/extensions/models/audio_recording.rb +12 -0
  56. data/lib/kete_translatable_content/extensions/models/basket.rb +34 -0
  57. data/lib/kete_translatable_content/extensions/models/comment.rb +12 -0
  58. data/lib/kete_translatable_content/extensions/models/document.rb +12 -0
  59. data/lib/kete_translatable_content/extensions/models/still_image.rb +12 -0
  60. data/lib/kete_translatable_content/extensions/models/system_setting.rb +13 -0
  61. data/lib/kete_translatable_content/extensions/models/tag.rb +37 -0
  62. data/lib/kete_translatable_content/extensions/models/topic.rb +12 -0
  63. data/lib/kete_translatable_content/extensions/models/user.rb +36 -0
  64. data/lib/kete_translatable_content/extensions/models/video.rb +12 -0
  65. data/lib/kete_translatable_content/extensions/models/web_link.rb +12 -0
  66. data/lib/kete_translatable_content/extensions/oai_dc_helpers_overrides.rb +99 -0
  67. data/lib/kete_translatable_content/extensions/tagging_controller_overrides.rb +21 -0
  68. data/lib/kete_translatable_content/extensions/tagging_overrides.rb +27 -0
  69. data/lib/kete_translatable_content/extensions/tinymce_controller_valid_action_override.rb +16 -0
  70. data/lib/kete_translatable_content/extensions/translation_from_version.rb +105 -0
  71. data/lib/kete_translatable_content/kete.rb +25 -0
  72. data/lib/kete_translatable_content/overwrites/oai_dc_helpers_test.rb +6 -0
  73. data/rails/init.rb +110 -0
  74. metadata +156 -0
data/config/routes.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'kete_translatable_content'
2
+
3
+ # extend routes for translations of kete content
4
+ ActionController::Routing::Routes.draw do |map|
5
+ # translations routes
6
+ # note that we don't want to override the standard routes handled below
7
+ # restful index is the same as our normal index action, so we limit it to that
8
+ Kete.translatables.keys.each do |name|
9
+ map.resources name.tableize.to_sym, :path_prefix => ':urlified_name', :only => [:index], :has_many => :translations
10
+ end
11
+ end
@@ -0,0 +1,65 @@
1
+ basket:
2
+ translatable_attributes: [:name, :index_page_extra_side_bar_html]
3
+ views: ['edit']
4
+ topic_type:
5
+ translatable_attributes: [:name, :description]
6
+ views: ['edit']
7
+ search_source:
8
+ translatable_attributes: [:title, :source_credit]
9
+ views: ['show', 'edit']
10
+ license:
11
+ translatable_attributes: [:name, :description]
12
+ views: ['show', 'edit']
13
+ extended_field:
14
+ translatable_attributes: [:label, :example]
15
+ views: ['show', 'edit']
16
+ redefine_find: false
17
+ system_setting:
18
+ translatable_attributes: [:value]
19
+ controllers: ['configure']
20
+ views: ['section']
21
+ additional_columns:
22
+ takes_translations:
23
+ type: boolean
24
+ default: false
25
+ configurable_setting:
26
+ translatable_attributes: [:value]
27
+ controllers: ['baskets']
28
+ views: ['appearance']
29
+ feed:
30
+ translatable_attributes: [:title]
31
+ controllers: ['baskets']
32
+ views: ['homepage_options']
33
+ choice:
34
+ translatable_attributes: [:label]
35
+ views: ['show', 'edit']
36
+ tag:
37
+ translatable_attributes: [:name]
38
+ views: ['show']
39
+ topic:
40
+ through_version: true
41
+ translatable_attributes: [:title, :short_summary, :description] # extended content is handled separately
42
+ views: ['show']
43
+ document:
44
+ through_version: true
45
+ translatable_attributes: [:title, :short_summary, :description] # extended content is handled separately
46
+ views: ['show']
47
+ audio_recording:
48
+ through_version: true
49
+ translatable_attributes: [:title, :description] # extended content is handled separately
50
+ views: ['show']
51
+ controllers: ['audio']
52
+ still_image:
53
+ through_version: true
54
+ translatable_attributes: [:title, :description] # extended content is handled separately
55
+ views: ['show']
56
+ controllers: ['images']
57
+ video:
58
+ through_version: true
59
+ translatable_attributes: [:title, :description] # extended content is handled separately
60
+ views: ['show']
61
+ controllers: ['video']
62
+ web_link:
63
+ through_version: true
64
+ translatable_attributes: [:title, :description] # extended content is handled separately
65
+ views: ['show']
@@ -0,0 +1,2 @@
1
+ Description:
2
+ Generates the migration necessary to track locale and original locale needed by the mongo_translatable functionality.
@@ -0,0 +1,7 @@
1
+ class KeteTranslatableContentMigrationGenerator < Rails::Generator::Base
2
+ def manifest
3
+ record do |m|
4
+ m.migration_template 'migration.rb', 'db/migrate', { :migration_file_name => "add_kete_translatable_content_fields" }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,82 @@
1
+ require 'kete_translatable_content'
2
+ class ActiveRecord::Migration
3
+
4
+ def self.add_additional_columns_for(name, table_name)
5
+ if Kete.translatables[name]['additional_columns'] && Kete.translatables[name]['additional_columns'].any?
6
+ Kete.translatables[name]['additional_columns'].each do |column|
7
+ column_name = column.first.to_sym
8
+ options = column.last
9
+ args = [table_name, column_name, options['type'].to_sym]
10
+ args << { :default => options['default'] } unless options['default'].nil?
11
+ add_column *args
12
+
13
+ if through_version?(name)
14
+ args[0] = resolve_to_table(name, :without_versions => true)
15
+ add_column *args
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ def self.remove_additional_columns_for(name, table_name)
22
+ if Kete.translatables[name]['additional_columns'] && Kete.translatables[name]['additional_columns'].any?
23
+ Kete.translatables[name]['additional_columns'].each do |column|
24
+ remove_column(table_name, column.first.to_sym) rescue nil
25
+
26
+ if through_version?(name)
27
+ remove_column(resolve_to_table(name, :without_versions => true), column.first.to_sym) rescue nil
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ def self.add_locale_columns_to(table_name)
34
+ add_column table_name, :locale, :string, :default => I18n.default_locale.to_s
35
+ add_column table_name, :original_locale, :string, :default => I18n.default_locale.to_s
36
+ end
37
+
38
+ def self.remove_locale_columns_to(table_name)
39
+ remove_column(table_name, :locale) rescue nil
40
+ remove_column(table_name, :original_locale) rescue nil
41
+ end
42
+
43
+ def self.through_version?(name)
44
+ Kete.translatables[name]['through_version'].present? ? Kete.translatables[name]['through_version'] : false
45
+ end
46
+
47
+ def self.resolve_to_table(name, options = { })
48
+ include_versions = options[:without_versions].present? ? options[:without_versions] : false
49
+
50
+ table_name = through_version?(name) && include_versions ? name + '_versions' : name.tableize
51
+
52
+ table_name = table_name.to_sym
53
+ end
54
+ end
55
+
56
+ class AddKeteTranslatableContentFields < ActiveRecord::Migration
57
+ def self.up
58
+ Kete.translatables.keys.each do |name|
59
+
60
+ table_name = resolve_to_table(name)
61
+
62
+ add_locale_columns_to(table_name)
63
+
64
+ add_locale_columns_to(resolve_to_table(name, :without_versions => true)) if through_version?(name)
65
+
66
+ add_additional_columns_for(name, table_name)
67
+ end
68
+ end
69
+
70
+ def self.down
71
+ Kete.translatables.keys.each do |name|
72
+ table_name = resolve_to_table(name)
73
+
74
+ remove_locale_columns_to(table_name)
75
+
76
+ remove_locale_columns_to(resolve_to_table(name, :without_versions => true)) if through_version?(name)
77
+
78
+ remove_additional_columns_for(name, table_name)
79
+ end
80
+ end
81
+ end
82
+
@@ -0,0 +1,2 @@
1
+ Description:
2
+ Generates the tests for the kete_translatable_content functionality that verifies that the gem's functionality are working.
@@ -0,0 +1,38 @@
1
+ class KeteTranslatableContentTestsGenerator < Rails::Generator::Base
2
+ def manifest
3
+ record do |m|
4
+ m.template 'configure_kete_content_translation_controller_and_routes_test.rb',
5
+ File.join('test/functional',
6
+ 'configure_kete_content_translation_controller_and_routes_test.rb')
7
+
8
+ m.template 'configure_kete_content_translation_test.rb',
9
+ File.join('test/unit',
10
+ 'configure_kete_content_translation_test.rb')
11
+
12
+ m.template 'kete_translatable_content_helper_test.rb',
13
+ File.join('test/unit/helpers',
14
+ "kete_translatable_content_helper_test.rb")
15
+
16
+ m.template 'kete_translatable_content_migration_test.rb',
17
+ File.join('test/unit',
18
+ 'kete_translatable_content_migration_test.rb')
19
+
20
+ m.template 'kete_translatable_content_translations_test.rb',
21
+ File.join('test/unit',
22
+ 'kete_translatable_content_translations_test.rb')
23
+
24
+ m.template 'kete_translations_test.rb',
25
+ File.join('test/integration',
26
+ 'kete_translations_test.rb')
27
+ m.template 'mongo_test_helper.rb',
28
+ File.join('test/',
29
+ 'mongo_test_helper.rb')
30
+ m.template 'mongo_factories.rb',
31
+ File.join('test/',
32
+ 'mongo_factories.rb')
33
+ m.template 'mongo_translatable_test.rb',
34
+ File.join('test/unit',
35
+ 'mongo_translatable_test.rb')
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+
3
+ # test that routes exist
4
+ # prepended with locale en which is added to all routes with a wrapper filter
5
+ class ConfigureKeteContentTranslationControllerAndRoutesTest < ActionController::TestCase
6
+
7
+ context "The application's routing for baskets" do
8
+
9
+ setup do
10
+ @location = {
11
+ :locale => "en",
12
+ :urlified_name => "site",
13
+ :controller => "translations",
14
+ :basket_id => "1"
15
+ }
16
+ end
17
+
18
+ should "have translations index" do
19
+ assert_routing({ :path => "en/site/baskets/1/translations", :method => :get }, @location.merge(:action => "index"))
20
+ end
21
+
22
+ should "have translations new" do
23
+ assert_routing({ :path => "en/site/baskets/1/translations/new", :method => :get }, @location.merge(:action => "new"))
24
+ end
25
+
26
+ should "have translations create" do
27
+ assert_routing({ :path => "en/site/baskets/1/translations", :method => :post }, @location.merge(:action => "create"))
28
+ end
29
+
30
+ should "have translations show for a translation" do
31
+ assert_routing({ :path => "en/site/baskets/1/translations/en", :method => :get }, @location.merge(:action => "show", :id => "en"))
32
+ end
33
+
34
+ should "have translations edit for a translation" do
35
+ assert_routing({ :path => "en/site/baskets/1/translations/en/edit", :method => :get }, @location.merge(:action => "edit", :id => "en"))
36
+ end
37
+
38
+ should "have translations update for a translation" do
39
+ assert_routing({ :path => "en/site/baskets/1/translations/en", :method => :put }, @location.merge(:action => "update", :id => "en"))
40
+ end
41
+
42
+ should "have translations destroy for a translation" do
43
+ assert_routing({ :path => "en/site/baskets/1/translations/en", :method => :delete }, @location.merge(:action => "destroy", :id => "en"))
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ # test that models are translatable by making sure they respond
4
+ # to mongo_translatable instance methods
5
+ class ConfigureKeteContentTranslationTest < ActiveSupport::TestCase
6
+
7
+ Kete.translatables.keys.each do |name|
8
+
9
+ context "A #{name.humanize}" do
10
+
11
+ setup do
12
+ @record = name.camelize.constantize.new
13
+ end
14
+
15
+ should "respond to locale" do
16
+ assert @record.respond_to?(:locale)
17
+ end
18
+
19
+ should "respond to translations" do
20
+ assert @record.respond_to?(:translations)
21
+ end
22
+
23
+ should "respond to translations_locales" do
24
+ assert @record.respond_to?(:translations_locales)
25
+ end
26
+
27
+ should "respond to translate" do
28
+ assert @record.respond_to?(:translate)
29
+ end
30
+
31
+ should "respond to translation_for" do
32
+ assert @record.respond_to?(:translation_for)
33
+ end
34
+
35
+ should "respond to available_in_these_locales" do
36
+ assert @record.respond_to?(:available_in_these_locales)
37
+ end
38
+
39
+ should "respond to needed_in_these_locales" do
40
+ assert @record.respond_to?(:needed_in_these_locales)
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+
3
+ # test that ApplicationHelper includes the mongo_translatable's gem
4
+ # helper is included
5
+ class KeteTranslatableContentHelperTest < ActionView::TestCase
6
+
7
+ context "The ActionController Helpers" do
8
+
9
+ should "include TranslatablesHelper#needed_in_locales_for" do
10
+ assert ApplicationController.helpers.methods.include?('needed_in_locales_for')
11
+ end
12
+
13
+ should "include KeteTranslatableContentHelper#kete_translatable_content?" do
14
+ assert ApplicationController.helpers.methods.include?('kete_translatable_content?')
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_helper.rb'
2
+ require 'rails_generator'
3
+ require 'rails_generator/scripts/generate'
4
+
5
+ # skipping tests here, as this testcase can only be run in isolation from other testcases
6
+ # uncomment and run "cd test; ruby unit/kete_translatable_content_migration_test.rb"
7
+ # from command line, if you need to test this
8
+ class MigrationGeneratorTest < ActiveSupport::TestCase
9
+ test "the truth" do
10
+ assert true
11
+ end
12
+
13
+ # context "Calling script/generate kete_translatable_content_migration" do
14
+
15
+ # setup do
16
+ # FileUtils.mkdir_p(fake_rails_root)
17
+ # @original_files = file_list
18
+ # end
19
+
20
+ # should "generate correct file with kete's translatable models" do
21
+ # Rails::Generator::Scripts::Generate.new.run(["kete_translatable_content_migration"],
22
+ # :destination => fake_rails_root)
23
+ # new_file = (file_list - @original_files).first
24
+ # assert_match /add_kete_translatable_content_fields/, new_file
25
+ # assert_match /require \'kete_translatable_content\'/, File.read(new_file)
26
+ # assert_match /Kete.translatables.keys.each/, File.read(new_file)
27
+ # end
28
+
29
+ # teardown do
30
+ # FileUtils.rm_r(fake_rails_root)
31
+ # end
32
+
33
+ # end
34
+
35
+ # private
36
+
37
+ # def fake_rails_root
38
+ # File.join(File.dirname(__FILE__), 'rails_root')
39
+ # end
40
+
41
+ # def file_list
42
+ # Dir.glob(File.join(fake_rails_root, "db", "migrate", "*"))
43
+ # end
44
+
45
+ end
@@ -0,0 +1,66 @@
1
+ require 'test_helper'
2
+ require 'mongo_test_helper'
3
+
4
+ # test that the oai dc helpers we use are overridden
5
+ # to return translations as well as locale's xml:lang
6
+ class KeteTranslatableContentOaiDcHelpersTest < ActiveSupport::TestCase
7
+
8
+ zoom_translatables = Array.new
9
+ Kete.translatables.each { |k,v| zoom_translatables << k.camelize if v['through_version'] }
10
+
11
+ zoom_translatables.each do |zoom_class|
12
+
13
+ context "#{zoom_class.humanize}" do
14
+ setup do
15
+ I18n.locale = I18n.default_locale
16
+
17
+ item_for(zoom_class)
18
+
19
+ create_translations_for(@item, [:title, :description])
20
+ end
21
+
22
+ should "return xml for title in original locale plus all translated titles" do
23
+ builder = Nokogiri::XML::Builder.new
24
+ builder.root do |xml|
25
+ @item.oai_dc_xml_dc_title(xml)
26
+ end
27
+ assert builder.to_stripped_xml.include?("<dc:title xml:lang=\"#{I18n.default_locale}\">Item</dc:title>")
28
+ ALL_TRANSLATION_LOCALE_KEYS_EXCEPT_EN.each do |key|
29
+ assert builder.to_stripped_xml.include?("<dc:title xml:lang=\"#{key.to_s}\">#{LOCALE_LABELS[key]}</dc:title>")
30
+ end
31
+ end
32
+
33
+ should "return xml for description in original locale plus all translated descriptions" do
34
+ builder = Nokogiri::XML::Builder.new
35
+ builder.root do |xml|
36
+ @item.oai_dc_xml_dc_description(xml)
37
+ end
38
+ assert builder.to_stripped_xml.include?("<dc:description xml:lang=\"#{I18n.default_locale}\"><![CDATA[Description]]></dc:description>")
39
+ ALL_TRANSLATION_LOCALE_KEYS_EXCEPT_EN.each do |key|
40
+ assert builder.to_stripped_xml.include?("<dc:description xml:lang=\"#{key.to_s}\"><![CDATA[#{LOCALE_LABELS[key]}]]></dc:description>")
41
+ end
42
+ end
43
+
44
+ should "return xml for tags in original locale plus all translated tags" do
45
+ @item.tag_list << "tag"
46
+ @item.save
47
+ @item.reload
48
+ @item.add_as_contributor(User.first, @item.version)
49
+
50
+ # translate tag
51
+ tag = @item.tags.first
52
+ create_translations_for(tag, [:name])
53
+
54
+ builder = Nokogiri::XML::Builder.new
55
+ builder.root do |xml|
56
+ @item.oai_dc_xml_tags_to_dc_subjects(xml)
57
+ end
58
+ assert builder.to_stripped_xml.include?("<dc:subject xml:lang=\"#{I18n.default_locale}\"><![CDATA[tag]]></dc:subject>")
59
+
60
+ ALL_TRANSLATION_LOCALE_KEYS_EXCEPT_EN.each do |key|
61
+ assert builder.to_stripped_xml.include?("<dc:subject xml:lang=\"#{key.to_s}\"><![CDATA[#{LOCALE_LABELS[key]}]]></dc:subject>")
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end