transdifflation 0.0.1 → 0.0.2
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.
- data/.gitignore +1 -0
- data/Fudgefile +1 -1
- data/Gemfile +1 -0
- data/README.md +24 -3
- data/Rakefile +2 -1
- data/lib/tasks/lost_in_translation.rake +59 -0
- data/lib/tasks/translation_coverage.rake +33 -0
- data/lib/transdifflation.rb +76 -18
- data/lib/transdifflation/railtie.rb +9 -3
- data/lib/transdifflation/utilities.rb +22 -1
- data/lib/transdifflation/version.rb +1 -1
- data/lib/transdifflation/yaml_reader.rb +1 -3
- data/lib/transdifflation/yaml_writer.rb +1 -1
- data/spec/assets/testfile +7 -0
- data/spec/coverage_spec.rb +141 -0
- data/spec/lost_in_translation_spec.rb +28 -0
- data/spec/transdifflation_spec.rb +267 -13
- data/spec/utilities_spec.rb +10 -3
- data/spec/yaml_reader_spec.rb +2 -1
- data/spec/yaml_writer_spec.rb +14 -0
- data/transdifflation.gemspec +1 -1
- metadata +10 -2
    
        data/.gitignore
    CHANGED
    
    
    
        data/Fudgefile
    CHANGED
    
    
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -4,6 +4,8 @@ What is Transdifflation? Transdifflation is an acronym of 'Translation' and 'Dif | |
| 4 4 | 
             
            It compares two .yml locate files, one in your source code (target) and one in others' (gems, other projects) source code (source) and generates a beside-file with the keys you hadn't translated yet.  
         | 
| 5 5 | 
             
            Then you can merge it. It is designed to detect changes between versions. By now, target file cannot be renamed, and it is generated in 'config/locales/' + to_locale (param in task). Names are inferred by the task params too.
         | 
| 6 6 |  | 
| 7 | 
            +
            Also, it has three new rake tasks to provide information to you about missing translations between two locales, and continuous integration support.
         | 
| 8 | 
            +
             | 
| 7 9 | 
             
            IT NEVER CHANGES YOUR SOURCE FILE, unless it doesn't exists, so it creates for you. 
         | 
| 8 10 |  | 
| 9 11 | 
             
            ## Installation
         | 
| @@ -22,7 +24,9 @@ Or install it yourself as: | |
| 22 24 |  | 
| 23 25 | 
             
            ## Usage
         | 
| 24 26 |  | 
| 25 | 
            -
             | 
| 27 | 
            +
            ### How to configure your Rake tasks
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            It needs a config file (**transdifflation.yml**) placed on your host root, or in 'config'. If not exists, a rake task is set up to generate it: ```rake transdifflation:config```. Config file looks like:
         | 
| 26 30 |  | 
| 27 31 | 
             
            ```yml
         | 
| 28 32 | 
             
            tasks:
         | 
| @@ -58,9 +62,26 @@ These nodes generates rake tasks. There are two types of tasks: | |
| 58 62 |  | 
| 59 63 | 
             
            *   type **file**: When it rans, it looks for the file in 'file_path_from_rails_root' is installed. It uses from_locale and to_locale to translate names and keys inside yaml. Tag_name is used to name target file in our host.
         | 
| 60 64 |  | 
| 61 | 
            -
             | 
| 65 | 
            +
            Also, you can create grouped tasks in a node called 'grouped_taks'. Task ```transdifflation:all``` is automatically generated.  
         | 
| 66 | 
            +
             | 
| 67 | 
            +
            Execute ```rake -T``` to determine sucess of config file. Your tasks should appear there, under namespace ```transdifflation:``
         | 
| 68 | 
            +
             | 
| 69 | 
            +
             | 
| 70 | 
            +
            ### _'Out of the box'_ rake tasks
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            There are two new tasks in the town:
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            *   ```rake transdifflation:lost_in_translation[from_locale,to_locale]```
         | 
| 75 | 
            +
            *   ```rake transdifflation:lost_in_translation_ci[from_locale,to_locale]```
         | 
| 76 | 
            +
            *   ```rake transdifflation:coverage[from_locale,to_locale]```
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            These tasks are intended to be used to know what keys are missing between two locales. ```rake transdifflation:lost_in_translation[from_locale,to_locale]``` creates a file in ```[Rails.root]/config/locales/[from_locale]/missing_translations.yml.diff```(on YAML format), that you can use as a template to fulfill your translation.
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            ```rake transdifflation:lost_in_translation_ci[from_locale,to_locale]``` doesn't create a file, it just fails if missing translations needed, so you can use it in a continuous integration environment, if you want to test that your translations are always completed between your third party gems' new versions, or other vendor's project new releases, or stuff like that...
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            ```rake transdifflation:coverage[from_locale,to_locale]``` gives you information and statistics of translations. 
         | 
| 83 | 
            +
             | 
| 62 84 |  | 
| 63 | 
            -
            Also, you can create grouped tasks in a node called 'grouped_taks'. Task **all** is automatially generated.  
         | 
| 64 85 |  | 
| 65 86 |  | 
| 66 87 | 
             
            ## Contributing
         | 
    
        data/Rakefile
    CHANGED
    
    
| @@ -0,0 +1,59 @@ | |
| 1 | 
            +
            require 'rails'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
             | 
| 4 | 
            +
            namespace :transdifflation do
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def get_differences (from_locale, to_locale)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                #this will access translations method, that is protected in BackEnd in I18n
         | 
| 9 | 
            +
                translations = I18n.backend.send(:translations)
         | 
| 10 | 
            +
                hash_from_locale = translations[from_locale]
         | 
| 11 | 
            +
                hash_to_locale = translations[to_locale]
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                comparer = Transdifflation::Comparer.new
         | 
| 14 | 
            +
                differences = comparer.get_rest_of_translation(hash_from_locale, hash_to_locale, from_locale, to_locale)
         | 
| 15 | 
            +
                differences = { to_locale.to_s => differences } if !differences.empty?
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              desc "What is not translated in our app"
         | 
| 20 | 
            +
              task :lost_in_translation, [:from_locale, :to_locale] => [:environment] do |t, args|
         | 
| 21 | 
            +
             | 
| 22 | 
            +
             | 
| 23 | 
            +
                args.with_defaults(:from_locale => I18n.default_locale, :to_locale => I18n.locale)
         | 
| 24 | 
            +
                puts "\nExecuting lost_in_translation ************************** "
         | 
| 25 | 
            +
                from_locale = args[:from_locale].to_sym
         | 
| 26 | 
            +
                to_locale = args[:to_locale].to_sym
         | 
| 27 | 
            +
                differences = get_differences(from_locale, to_locale)
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                if !differences.empty?
         | 
| 30 | 
            +
                  missing_translations_file = File.join( Rails.root, "config/locales/#{to_locale}/missing_translations.yml.diff")
         | 
| 31 | 
            +
                  missing_translations_stream = File.new(missing_translations_file, "w+:UTF-8")
         | 
| 32 | 
            +
                  begin
         | 
| 33 | 
            +
                    missing_translations_stream.write("#These are the missing translations Transdifflation found for you\n")
         | 
| 34 | 
            +
                    missing_translations_stream.write(Transdifflation::YAMLWriter.to_yaml(differences))  #we can't use YAML#dump due to issues wuth Utf8 chars
         | 
| 35 | 
            +
                    puts "Detected missing translations, file '#{missing_translations_file}' has them:\n\n#{differences.to_yaml}" if !differences.empty?
         | 
| 36 | 
            +
                  ensure
         | 
| 37 | 
            +
                    missing_translations_stream.close
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                else
         | 
| 41 | 
            +
                  puts "Sucess! All translation are done!"
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              desc "Testing in CI what is not translated in our app"
         | 
| 46 | 
            +
              task :lost_in_translation_ci, [:from_locale, :to_locale] => [:environment] do |t, args|
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                args.with_defaults(:from_locale => I18n.default_locale, :to_locale => I18n.locale)
         | 
| 49 | 
            +
                puts "\nExecuting lost_in_translation_ci ************************** "
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                differences = get_differences(args[:from_locale].to_sym, args[:to_locale].to_sym)
         | 
| 52 | 
            +
                fail "Detected missing translations: \n\n#{differences.to_yaml}" if !differences.empty?
         | 
| 53 | 
            +
                puts "Sucess! All translation are done!"
         | 
| 54 | 
            +
             | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
             | 
| 58 | 
            +
             | 
| 59 | 
            +
            end
         | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            require 'rails'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
             | 
| 4 | 
            +
            namespace :transdifflation do
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def get_coverage_rate(from_locale, to_locale)
         | 
| 7 | 
            +
                #this will access translations method, that is protected in BackEnd in I18n
         | 
| 8 | 
            +
                translations = I18n.backend.send(:translations)
         | 
| 9 | 
            +
                hash_from_locale = translations[from_locale]
         | 
| 10 | 
            +
                hash_to_locale = translations[to_locale]
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                comparer = Transdifflation::Comparer.new
         | 
| 13 | 
            +
                comparer.coverage_rate(hash_from_locale, hash_to_locale)
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              desc "A task to check a translation coverage"
         | 
| 18 | 
            +
              task :coverage, [:from_locale, :to_locale] => [:environment] do |t, args|
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                args.with_defaults(:from_locale => I18n.default_locale, :to_locale => I18n.locale)
         | 
| 21 | 
            +
                puts "\nChecking how much work you have left...\n"
         | 
| 22 | 
            +
                from_locale = args[:from_locale].to_sym
         | 
| 23 | 
            +
                to_locale = args[:to_locale].to_sym
         | 
| 24 | 
            +
                #token = args[:token]
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                differences = get_coverage_rate(from_locale, to_locale)
         | 
| 27 | 
            +
                puts "You have #{differences}"
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
             | 
| 32 | 
            +
             | 
| 33 | 
            +
            end
         | 
    
        data/lib/transdifflation.rb
    CHANGED
    
    | @@ -4,6 +4,8 @@ require 'transdifflation/yaml_writer' | |
| 4 4 | 
             
            require 'transdifflation/exceptions'
         | 
| 5 5 | 
             
            require 'transdifflation/utilities'
         | 
| 6 6 |  | 
| 7 | 
            +
            require 'pry'
         | 
| 8 | 
            +
             | 
| 7 9 | 
             
            # The main module for the program
         | 
| 8 10 | 
             
            module Transdifflation
         | 
| 9 11 |  | 
| @@ -30,8 +32,9 @@ module Transdifflation | |
| 30 32 | 
             
                def get_transdifflation_from_gem(gem_name, path_to_yaml_in_gem, from_locale=:en, to_locale=:es )
         | 
| 31 33 |  | 
| 32 34 | 
             
                  #default values in optional params
         | 
| 33 | 
            -
                  from_locale ||=  | 
| 34 | 
            -
                  to_locale ||=  | 
| 35 | 
            +
                  from_locale ||= I18n.default_locale
         | 
| 36 | 
            +
                  to_locale ||= I18n.locale
         | 
| 37 | 
            +
             | 
| 35 38 |  | 
| 36 39 | 
             
                  yml_gem_content = YAMLReader.read_YAML_from_gem(gem_name, path_to_yaml_in_gem)
         | 
| 37 40 | 
             
                  puts "Loaded YAML content from gem '#{gem_name}', file '#{path_to_yaml_in_gem}'"
         | 
| @@ -64,8 +67,8 @@ module Transdifflation | |
| 64 67 | 
             
                def get_transdifflation_from_file(tag_name, path_to_yaml_relative_from_rails_root, from_locale=:en, to_locale=:es )
         | 
| 65 68 |  | 
| 66 69 | 
             
                  #default values in optional params
         | 
| 67 | 
            -
                  from_locale ||=  | 
| 68 | 
            -
                  to_locale ||=  | 
| 70 | 
            +
                  from_locale ||= I18n.default_locale
         | 
| 71 | 
            +
                  to_locale ||= I18n.locale
         | 
| 69 72 |  | 
| 70 73 | 
             
                  yml_source_content = YAMLReader.read_YAML_from_pathfile(path_to_yaml_relative_from_rails_root)
         | 
| 71 74 | 
             
                  puts "Loaded YAML content from file '#{path_to_yaml_relative_from_rails_root}'"
         | 
| @@ -87,10 +90,77 @@ module Transdifflation | |
| 87 90 | 
             
                end
         | 
| 88 91 |  | 
| 89 92 |  | 
| 93 | 
            +
                # Get Diff from YAML translation locale file from filesystem and generate differences in a file on our host
         | 
| 94 | 
            +
                #
         | 
| 95 | 
            +
                # @param [String] source I18n source translation to compare
         | 
| 96 | 
            +
                # @param [String] target I18n target translation to compare
         | 
| 97 | 
            +
                # @param [Symbol] from_locale Default locale in gem. Used to translate 'from'
         | 
| 98 | 
            +
                # @param [Symbol] to_locale   Default locale in host. Used to translate 'to'
         | 
| 99 | 
            +
                def get_rest_of_translation(source, target, from_locale, to_locale)
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                  added_diff_hash = {}
         | 
| 102 | 
            +
                  generate_added_diff(source, target, added_diff_hash, Array.new,  from_locale, to_locale, false)
         | 
| 103 | 
            +
                  added_diff_hash.unsymbolize!
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
             | 
| 107 | 
            +
                # Get Coverage rate from two hashes, depending on the number of keys that have a given token
         | 
| 108 | 
            +
                #
         | 
| 109 | 
            +
                # @param [Hash] hash_from_locale I18n source translation to compare
         | 
| 110 | 
            +
                # @param [Hash] hash_to_locale I18n target translation to compare
         | 
| 111 | 
            +
                # @param [String] token The string you want to compare. example: **NOT TRANSLATED**
         | 
| 112 | 
            +
                def coverage_rate(hash_from_locale, hash_to_locale, token = NOT_TRANSLATED)      
         | 
| 113 | 
            +
                    
         | 
| 114 | 
            +
                  if hash_from_locale.nil?
         | 
| 115 | 
            +
                    return "Translation coverage error: from_locale language not detected."
         | 
| 116 | 
            +
                  end
         | 
| 90 117 |  | 
| 118 | 
            +
                  if hash_to_locale.nil?
         | 
| 119 | 
            +
                    return "Translation coverage error: to_locale language not detected."
         | 
| 120 | 
            +
                  end
         | 
| 121 | 
            +
                  
         | 
| 122 | 
            +
                  if hash_from_locale.empty?
         | 
| 123 | 
            +
                    return "from_locale is empty, so you have everything translated"         
         | 
| 124 | 
            +
                  end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                  words = 0
         | 
| 127 | 
            +
                  found = 0
         | 
| 91 128 |  | 
| 129 | 
            +
                  words, found = rate_from_branch(hash_from_locale, hash_to_locale, token, words, found)
         | 
| 130 | 
            +
                  percent = (found.to_f/words.to_f) * 100
         | 
| 131 | 
            +
                  truncate = "%.2f" % percent
         | 
| 132 | 
            +
                  return "#{truncate}% #{found}/#{words} entries translated"
         | 
| 133 | 
            +
                end
         | 
| 92 134 |  | 
| 93 135 |  | 
| 136 | 
            +
                # Get the number of translated keys 
         | 
| 137 | 
            +
                #
         | 
| 138 | 
            +
                # @param [Hash] hash_from I18n source translation to compare
         | 
| 139 | 
            +
                # @param [Hash] hash_to I18n target translation to compare
         | 
| 140 | 
            +
                # @param [String] token The string you want to compare. example: **NOT TRANSLATED**
         | 
| 141 | 
            +
                # @param [Integer] words Number of keys (accumulated) from hash_from
         | 
| 142 | 
            +
                # @param [Integer] found Number of keys (accumulated) where token is not found in hash_to 
         | 
| 143 | 
            +
                def rate_from_branch(hash_from, hash_to, token, words, found)
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                  hash_from.each_pair{ |key, value|
         | 
| 146 | 
            +
                    if hash_from[key.to_sym].instance_of? Hash
         | 
| 147 | 
            +
                      if hash_to[key.to_sym]
         | 
| 148 | 
            +
                        words, found = rate_from_branch(hash_from[key.to_sym], hash_to[key.to_sym], token, words, found)
         | 
| 149 | 
            +
                      else
         | 
| 150 | 
            +
                      # Sum other words
         | 
| 151 | 
            +
                      # could have nested branches, so we call it with hash_from[key.to_sym] to count the number of words, returning the found to a temporal var
         | 
| 152 | 
            +
                      words, temp = rate_from_branch(hash_from[key.to_sym], hash_from[key.to_sym], token, words, found)
         | 
| 153 | 
            +
                      end
         | 
| 154 | 
            +
                    else
         | 
| 155 | 
            +
                      words += 1
         | 
| 156 | 
            +
                      if hash_to[key.to_sym]
         | 
| 157 | 
            +
                        found += 1 if !hash_to[key.to_sym].to_s.include?(token) 
         | 
| 158 | 
            +
                      end          
         | 
| 159 | 
            +
                    end
         | 
| 160 | 
            +
                  }
         | 
| 161 | 
            +
                  return words, found
         | 
| 162 | 
            +
                end      
         | 
| 163 | 
            +
             | 
| 94 164 | 
             
                private
         | 
| 95 165 |  | 
| 96 166 | 
             
                # Build the initial translation file
         | 
| @@ -102,12 +172,10 @@ module Transdifflation | |
| 102 172 | 
             
                def get_first_time_file(yml_source_content, host_target_file, from_locale, to_locale)
         | 
| 103 173 |  | 
| 104 174 | 
             
                  puts "Target translation file '#{host_target_file}' not found, generating it for the first time"
         | 
| 105 | 
            -
             | 
| 106 175 | 
             
                  #create a file
         | 
| 107 176 | 
             
                  host_target_file_stream = File.open(host_target_file, "a+:UTF-8")
         | 
| 108 177 |  | 
| 109 178 | 
             
                  begin
         | 
| 110 | 
            -
             | 
| 111 179 | 
             
                    translated_yaml = {}
         | 
| 112 180 | 
             
                    #translate from source yaml content, to target existant yml
         | 
| 113 181 | 
             
                    translate_keys_in_same_yaml(yml_source_content, translated_yaml, from_locale, to_locale)
         | 
| @@ -115,10 +183,8 @@ module Transdifflation | |
| 115 183 | 
             
                    host_target_file_stream.write(YAMLWriter.to_yaml(translated_yaml))
         | 
| 116 184 | 
             
                    @has_changes = true
         | 
| 117 185 | 
             
                  ensure
         | 
| 118 | 
            -
             | 
| 119 186 | 
             
                    host_target_file_stream.close
         | 
| 120 187 | 
             
                  end
         | 
| 121 | 
            -
             | 
| 122 188 | 
             
                end
         | 
| 123 189 |  | 
| 124 190 |  | 
| @@ -140,13 +206,10 @@ module Transdifflation | |
| 140 206 |  | 
| 141 207 | 
             
                    #if value is a hash, we call it recursively
         | 
| 142 208 | 
             
                    if (source_value.instance_of? Hash)
         | 
| 143 | 
            -
             | 
| 144 209 | 
             
                      if(!target.has_key? (source_key_translated))
         | 
| 145 210 | 
             
                        target[source_key_translated] = Hash.new
         | 
| 146 211 | 
             
                      end
         | 
| 147 | 
            -
             | 
| 148 212 | 
             
                      translate_keys_in_same_yaml(source_value, target[source_key_translated], from_locale, to_locale, add_NOT_TRANSLATED) #recurrence of other hashes
         | 
| 149 | 
            -
             | 
| 150 213 | 
             
                    else
         | 
| 151 214 | 
             
                      #it's a leaf node
         | 
| 152 215 | 
             
                      target[source_key_translated] = (add_NOT_TRANSLATED ? "#{NOT_TRANSLATED}#{source_value}" : "#{source_value}") if  !target.has_key? (source_key_translated)
         | 
| @@ -176,7 +239,7 @@ module Transdifflation | |
| 176 239 | 
             
                    diff_file = File.join(File.dirname(host_target_file), "#{File.basename(host_target_file)}.diff")
         | 
| 177 240 | 
             
                    diff_file_stream = File.new(diff_file, "w+:UTF-8")
         | 
| 178 241 | 
             
                    begin
         | 
| 179 | 
            -
             | 
| 242 | 
            +
                       
         | 
| 180 243 | 
             
                      if (added_diff_hash.length > 0)
         | 
| 181 244 | 
             
                        diff_file_stream.write("ADDED KEYS (Keys not found in your file, founded in source file) ********************\n")
         | 
| 182 245 | 
             
                        diff_file_stream.write(YAMLWriter.to_yaml(added_diff_hash))  #we can't use YAML#dump due to issues wuth Utf8 chars
         | 
| @@ -221,7 +284,7 @@ module Transdifflation | |
| 221 284 | 
             
                    if (source_value.instance_of? Hash)
         | 
| 222 285 | 
             
                      key_trace.push source_key_translated #add the key to the trace to be generated if necessary
         | 
| 223 286 | 
             
                      target[source_key_translated] = Hash.new if(!target.has_key? (source_key_translated))  #to continue trace, otherwise, node will not exist in next iteration
         | 
| 224 | 
            -
                      generate_added_diff(source_value, target[source_key_translated], added_diff_hash, key_trace, from_locale, to_locale) #recursively call
         | 
| 287 | 
            +
                      generate_added_diff(source_value, target[source_key_translated], added_diff_hash, key_trace, from_locale, to_locale, add_NOT_TRANSLATED) #recursively call
         | 
| 225 288 | 
             
                    else #it's a leaf node
         | 
| 226 289 |  | 
| 227 290 | 
             
                      if !target.has_key? (source_key_translated)
         | 
| @@ -236,13 +299,8 @@ module Transdifflation | |
| 236 299 | 
             
                  }
         | 
| 237 300 | 
             
                end
         | 
| 238 301 |  | 
| 239 | 
            -
               
         | 
| 240 | 
            -
             | 
| 241 | 
            -
             | 
| 242 | 
            -
             | 
| 243 302 | 
             
                def self.generate_config_example_file(path)
         | 
| 244 303 | 
             
                  FileUtils.copy(File.expand_path('./transdifflation/transdifflation.yml', File.dirname( __FILE__ )), path)
         | 
| 245 304 | 
             
                end
         | 
| 246 | 
            -
             | 
| 247 305 | 
             
              end
         | 
| 248 306 | 
             
            end
         | 
| @@ -1,15 +1,22 @@ | |
| 1 | 
            -
            require 'transdifflation'
         | 
| 2 1 | 
             
            require 'rails'
         | 
| 2 | 
            +
            require 'transdifflation'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 3 8 |  | 
| 4 9 | 
             
            module Transdifflation
         | 
| 5 10 |  | 
| 6 11 | 
             
              # Adds behaviours to Rails
         | 
| 7 12 | 
             
              class Railtie < Rails::Railtie
         | 
| 8 13 | 
             
                search_locations = %w[config/transdifflation.yml transdifflation.yml]
         | 
| 9 | 
            -
             | 
| 10 14 | 
             
                railtie_name :transdifflation
         | 
| 11 15 | 
             
                rake_tasks do
         | 
| 12 16 | 
             
                  begin
         | 
| 17 | 
            +
                    
         | 
| 18 | 
            +
                    Dir[ File.join(File.dirname(__FILE__), '../tasks/*.rake')] .each { |f| load f }  #Load static tasks
         | 
| 19 | 
            +
             | 
| 13 20 |  | 
| 14 21 | 
             
                    file_task_config = nil
         | 
| 15 22 | 
             
                    search_locations.each do |path| #Take config file from these locations
         | 
| @@ -91,7 +98,6 @@ module Transdifflation | |
| 91 98 | 
             
                    end
         | 
| 92 99 |  | 
| 93 100 | 
             
                  rescue Transdifflation::ConfigFileNotFound
         | 
| 94 | 
            -
                   
         | 
| 95 101 | 
             
                    #Generate task to set-up 
         | 
| 96 102 | 
             
                    namespace :transdifflation do
         | 
| 97 103 | 
             
                      desc "Task to set-up config file in host"
         | 
| @@ -4,7 +4,7 @@ module Transdifflation | |
| 4 4 |  | 
| 5 5 | 
             
              #Class used to convert all keys in a hash (included sub-hashes) in symbols
         | 
| 6 6 | 
             
              class HashSymbolTranslator
         | 
| 7 | 
            -
                # Convert keys
         | 
| 7 | 
            +
                # Convert keys (strings) into symbols
         | 
| 8 8 | 
             
                def symbolize(hash)
         | 
| 9 9 | 
             
                  hash = hash.inject({}) { |memo,(k,v)| 
         | 
| 10 10 | 
             
                      if(v.instance_of? Hash)
         | 
| @@ -15,6 +15,19 @@ module Transdifflation | |
| 15 15 | 
             
                  }
         | 
| 16 16 | 
             
                  hash
         | 
| 17 17 | 
             
                end
         | 
| 18 | 
            +
                 # Convert keys into string
         | 
| 19 | 
            +
                 def unsymbolize(hash)
         | 
| 20 | 
            +
                  hash = hash.inject({}) { |memo,(k,v)| 
         | 
| 21 | 
            +
                      if(v.instance_of? Hash)
         | 
| 22 | 
            +
                         v = unsymbolize(v)
         | 
| 23 | 
            +
                      end 
         | 
| 24 | 
            +
                      memo[k.to_s] = v
         | 
| 25 | 
            +
                      memo
         | 
| 26 | 
            +
                  }
         | 
| 27 | 
            +
                  hash
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
             | 
| 18 31 | 
             
              end
         | 
| 19 32 | 
             
            end
         | 
| 20 33 |  | 
| @@ -28,4 +41,12 @@ class Hash | |
| 28 41 | 
             
                self.merge!(new_self)
         | 
| 29 42 | 
             
              end
         | 
| 30 43 |  | 
| 44 | 
            +
              #convert all keys in a Hash (presumily from YAML) in symbols
         | 
| 45 | 
            +
              def unsymbolize!
         | 
| 46 | 
            +
                symbolizer = Transdifflation::HashSymbolTranslator.new
         | 
| 47 | 
            +
                new_self = symbolizer.unsymbolize(self)
         | 
| 48 | 
            +
                self.clear
         | 
| 49 | 
            +
                self.merge!(new_self)
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 31 52 | 
             
            end
         | 
| @@ -18,7 +18,6 @@ module Transdifflation | |
| 18 18 |  | 
| 19 19 | 
             
                  #read the yml content file
         | 
| 20 20 | 
             
                  get_YAML_content_from_YAML_file(yaml_file_in_gem_SRC)
         | 
| 21 | 
            -
                 
         | 
| 22 21 | 
             
                end
         | 
| 23 22 |  | 
| 24 23 | 
             
                # Get YAML content from a file in filesystem
         | 
| @@ -33,7 +32,6 @@ module Transdifflation | |
| 33 32 |  | 
| 34 33 | 
             
                  #read the yml content file
         | 
| 35 34 | 
             
                  get_YAML_content_from_YAML_file(yaml_file_path)
         | 
| 36 | 
            -
                 
         | 
| 37 35 | 
             
                end
         | 
| 38 36 |  | 
| 39 37 | 
             
                # Get YAML content from a file in filesystem
         | 
| @@ -46,7 +44,7 @@ module Transdifflation | |
| 46 44 | 
             
                  raise ArgumentError.new("File '#{yaml_file_name}' does not exists in path '#{path_to_yaml}'") if (!File.file?(path_to_yaml))
         | 
| 47 45 |  | 
| 48 46 | 
             
                  #read the yml content file
         | 
| 49 | 
            -
                  get_YAML_content_from_YAML_file(path_to_yaml) | 
| 47 | 
            +
                  get_YAML_content_from_YAML_file(path_to_yaml)
         | 
| 50 48 | 
             
                end
         | 
| 51 49 |  | 
| 52 50 | 
             
                private
         | 
| @@ -8,7 +8,7 @@ module Transdifflation | |
| 8 8 | 
             
                  method = hash.respond_to?(:ya2yaml) ? :ya2yaml : :to_yaml
         | 
| 9 9 | 
             
                  string = hash.deep_stringify_keys.send(method)
         | 
| 10 10 | 
             
                  yaml_string = string.gsub("!ruby/symbol ", ":").sub("---","")
         | 
| 11 | 
            -
                  yaml_string = yaml_string.gsub(/(\?) "([\w\s\\]+)"\n/) do |match|
         | 
| 11 | 
            +
                  yaml_string = yaml_string.gsub(/(\?) "([\w\s\\]+)"\n/) do |match| #Regex ? "es" \n
         | 
| 12 12 | 
             
                    match.sub(/\?\s+/, "").chomp
         | 
| 13 13 | 
             
                  end
         | 
| 14 14 | 
             
                  yaml_string = yaml_string.split("\n").map(&:rstrip).join("\n").strip
         | 
| @@ -0,0 +1,141 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'transdifflation'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe :translation_coverage do
         | 
| 5 | 
            +
            	describe :coverage_rate do
         | 
| 6 | 
            +
            		it 'should return a message when hash_from_locale is an nil hash' do
         | 
| 7 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 8 | 
            +
            			hash_from_locale = nil
         | 
| 9 | 
            +
            			hash_to_locale  = {}
         | 
| 10 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 11 | 
            +
            			
         | 
| 12 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "Translation coverage error: from_locale language not detected."
         | 
| 13 | 
            +
            		end
         | 
| 14 | 
            +
            		it 'should return a message when hash_to_locale is an nil hash' do
         | 
| 15 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 16 | 
            +
            			hash_from_locale = {}
         | 
| 17 | 
            +
            			hash_to_locale  = nil
         | 
| 18 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 19 | 
            +
            			
         | 
| 20 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "Translation coverage error: to_locale language not detected."
         | 
| 21 | 
            +
            		end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            		it 'should return 100% when hash_from_locale is empty' do
         | 
| 24 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 25 | 
            +
            			hash_from_locale = {}
         | 
| 26 | 
            +
            			hash_to_locale  = {}
         | 
| 27 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 28 | 
            +
            			
         | 
| 29 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "from_locale is empty, so you have everything translated"
         | 
| 30 | 
            +
            		end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            		it 'should return 100% when hash_from_locale is empty, even if there is something at hash_to_locale' do
         | 
| 33 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 34 | 
            +
            			hash_from_locale = {}
         | 
| 35 | 
            +
            			hash_to_locale  = {:home => "hogar"}
         | 
| 36 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "from_locale is empty, so you have everything translated"
         | 
| 39 | 
            +
            		end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            		it 'should return 0% when theres all to translate' do
         | 
| 42 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 43 | 
            +
            			hash_from_locale = {:home => "home"}
         | 
| 44 | 
            +
            			hash_to_locale  = {}
         | 
| 45 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "0.00% 0/1 entries translated"
         | 
| 48 | 
            +
            		end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            		it 'should return 100% when you have everything translated (5/5)' do
         | 
| 51 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 52 | 
            +
            			hash_from_locale = { :one => "one", :two => "two", :three => "tree", :four => "four", :five => "five" }
         | 
| 53 | 
            +
            			hash_to_locale =   { :one => "uno", :two => "dos", :three => "tres", :four => "cuatro", :five => "cinco" }
         | 
| 54 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "100.00% 5/5 entries translated"
         | 
| 57 | 
            +
            		end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            		it 'should return 80% when you have 8/10 terms translated' do
         | 
| 60 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 61 | 
            +
            			hash_from_locale = { :one => "one", :two => "two", :three => "tree", :four => "four", :five => "five", :six => "six", :seven => "seven", :eight => "eight", :nine => "nine", :ten => "ten" }
         | 
| 62 | 
            +
            			hash_to_locale =   { :one => "uno", :two => "dos", :three => "tres", :four => "cuatro", :five => "cinco", :six => "**NOT TRANSLATED** six", :seven => "**NOT TRANSLATED** seven", :eight => "ocho", :nine => "nueve", :ten => "diez" }
         | 
| 63 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "80.00% 8/10 entries translated"
         | 
| 66 | 
            +
            		end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
             | 
| 69 | 
            +
            		it 'should return 70% when you have 7/10 terms translated, but you dont have a term, even in the hash and 2 of them are not translated' do
         | 
| 70 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 71 | 
            +
            			hash_from_locale = { :one => "one", :two => "two", :three => "tree", :four => "four", :five => "five", :six => "six", :seven => "seven", :eight => "eight", :nine => "nine", :ten => "ten" }
         | 
| 72 | 
            +
            			hash_to_locale =   { :one => "uno", :two => "dos", :three => "tres", :four => "cuatro", :five => "cinco", :six => "**NOT TRANSLATED** six", :seven => "**NOT TRANSLATED** seven", :eight => "ocho", :nine => "nueve" }
         | 
| 73 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "70.00% 7/10 entries translated"
         | 
| 76 | 
            +
            		end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            		it 'should return 62.50% when you have 5/8 terms translated' do
         | 
| 79 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 80 | 
            +
            			hash_from_locale = { :one => "one", :two => "two", :three => "tree", :four => "four", :five => "five", :six => "six", :seven => "seven", :eight => "eight" }
         | 
| 81 | 
            +
            			hash_to_locale =   { :one => "uno", :two => "**NOT TRANSLATED** two", :three => "tres", :four => "cuatro", :five => "cinco", :six => "**NOT TRANSLATED** six", :seven => "**NOT TRANSLATED** seven", :eight => "ocho"}
         | 
| 82 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 83 | 
            +
             | 
| 84 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "62.50% 5/8 entries translated"
         | 
| 85 | 
            +
            		end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
            		it 'should return 62.50% when you have 5/8 terms translated, having extra terms at the hash_to_locale hash' do
         | 
| 88 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 89 | 
            +
            			hash_from_locale = { :one => "one", :two => "two", :three => "tree", :four => "four", :five => "five", :six => "six", :seven => "seven", :eight => "eight" }
         | 
| 90 | 
            +
            			hash_to_locale =   { :one => "uno", :two => "**NOT TRANSLATED** two", :three => "tres", :four => "cuatro", :five => "cinco", :six => "**NOT TRANSLATED** six", :seven => "**NOT TRANSLATED** seven", :eight => "ocho", :puerta => "Puerta"}
         | 
| 91 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "62.50% 5/8 entries translated"
         | 
| 94 | 
            +
            		end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            		it 'should return 100.00% in nested hash' do
         | 
| 97 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 98 | 
            +
            			hash_from_locale = { :house => "house", :street => {:street_name => "street name", :postal => "postal code"}}
         | 
| 99 | 
            +
            			hash_to_locale = { :house => "casa", :street => {:street_name => "Nombre de la calle", :postal => "codigo postal"}}
         | 
| 100 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 101 | 
            +
             | 
| 102 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "100.00% 3/3 entries translated"
         | 
| 103 | 
            +
            		end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
            		it 'should return 3 entries, 2 translations found' do
         | 
| 106 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 107 | 
            +
            			hash_from_locale = { :house => "house", :street => {:street_name => "street name", :postal => "postal code"}}
         | 
| 108 | 
            +
            			hash_to_locale = { :house => "casa", :street => {:street_name => "**NOT TRANSLATED** Nombre de la calle", :postal => "codigo postal"}}
         | 
| 109 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "66.67% 2/3 entries translated"
         | 
| 112 | 
            +
            		end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
            		it 'should return 0.00% in nested hash' do
         | 
| 115 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 116 | 
            +
            			hash_from_locale = { :street => {:street_name => "**NOT TRANSLATED** Nombre de la calle", :postal => "codigo postal", :number => { :one => "one", :two => "two", :three => "tree"}}}
         | 
| 117 | 
            +
            			hash_to_locale =   { :one => "uno"}
         | 
| 118 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 119 | 
            +
             | 
| 120 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "0.00% 0/5 entries translated"
         | 
| 121 | 
            +
            		end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
            		it 'should return 10.00% in nested hash' do
         | 
| 124 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 125 | 
            +
            			hash_from_locale = { :one => "one", :two => "two", :three => "tree", :four => "four", :five => "five", :six => "six", :seven => "seven", :eight => "eight", :nine => "nine", :ten => "ten", :street => {:street_name => "**NOT TRANSLATED** Nombre de la calle", :postal => "codigo postal"}}
         | 
| 126 | 
            +
            			hash_to_locale =   { :one => "uno"}
         | 
| 127 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 128 | 
            +
             | 
| 129 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "8.33% 1/12 entries translated"
         | 
| 130 | 
            +
            		end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
            		it 'should return 8.33% in nested hash with only one term' do
         | 
| 133 | 
            +
            			@comparer = Transdifflation::Comparer.new
         | 
| 134 | 
            +
            			hash_from_locale = { :one => "one", :two => "two", :three => "tree", :four => "four", :five => "five", :six => "six", :seven => "seven", :eight => "eight", :nine => "nine", :ten => "ten", :street => {:street_name => "Nombre de la calle", :postal => "codigo postal"}}
         | 
| 135 | 
            +
            			hash_to_locale =   { :one => "uno"}
         | 
| 136 | 
            +
            			token = "**NOT TRANSLATED**"
         | 
| 137 | 
            +
             | 
| 138 | 
            +
            			@comparer.coverage_rate(hash_from_locale, hash_to_locale, token).should == "8.33% 1/12 entries translated"
         | 
| 139 | 
            +
            		end
         | 
| 140 | 
            +
            	end
         | 
| 141 | 
            +
            end
         | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'transdifflation'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe :lost_in_translation do
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            	before (:each) do
         | 
| 7 | 
            +
            		@comparer = Transdifflation::Comparer.new
         | 
| 8 | 
            +
            	end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            	describe :inner_functionallity do
         | 
| 11 | 
            +
            		it 'should return no differences with same data' do
         | 
| 12 | 
            +
            			i18n = { :es => {:one_key => 'uno', :another_key => 'dos'} }
         | 
| 13 | 
            +
            			@comparer.get_rest_of_translation(i18n, i18n, :es, :es).should eql({})
         | 
| 14 | 
            +
            		end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            		it 'should return differences with different data' do
         | 
| 17 | 
            +
            			i18n_en = { :en => {:one_key => 'one', :another_key => 'another', :another_one => 'another_one_even'} }
         | 
| 18 | 
            +
            			i18n_es = { :es => {:one_key => 'uno', :another_key => 'dos'} }
         | 
| 19 | 
            +
            			@comparer.get_rest_of_translation(i18n_en, i18n_es, :en, :es).should eql( {"es" => {"another_one" => "another_one_even" }} )
         | 
| 20 | 
            +
            		end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            		it 'should return no differences if target has more info than source' do
         | 
| 23 | 
            +
            			i18n_en = { :en => {:one_key => 'one', :another_key => 'another'} }
         | 
| 24 | 
            +
            			i18n_es = { :es => {:one_key => 'uno', :another_key => 'dos', :another_one => 'tres'} }
         | 
| 25 | 
            +
            			@comparer.get_rest_of_translation(i18n_en, i18n_es, :en, :es).should eql({})
         | 
| 26 | 
            +
            		end
         | 
| 27 | 
            +
            	end
         | 
| 28 | 
            +
            end
         | 
| @@ -1,20 +1,274 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require_relative "../lib/transdifflation"
         | 
| 3 3 |  | 
| 4 | 
            -
             | 
| 5 | 
            -
            #  it 'convert a key in a Hash (presumily from YAML) in symbol' do
         | 
| 6 | 
            -
            #    gem_name = 'rake'
         | 
| 7 | 
            -
            #    path_to_yaml_in_gem = '.'
         | 
| 8 | 
            -
            #    from_locale= :en
         | 
| 9 | 
            -
            #    to_locale = :es
         | 
| 10 | 
            -
            #    Transdifflation::Comparer 
         | 
| 11 | 
            -
            #  end
         | 
| 12 | 
            -
            #  xit 'another test' do
         | 
| 4 | 
            +
            describe :get_transdifflation_from_gem do
         | 
| 13 5 |  | 
| 6 | 
            +
              before(:each) do
         | 
| 7 | 
            +
                unless defined?(::Rails)
         | 
| 8 | 
            +
                  @mocked_rails_class = true
         | 
| 9 | 
            +
                  class ::Rails
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                end
         | 
| 14 12 |  | 
| 15 | 
            -
             | 
| 13 | 
            +
                @gem_name = 'rake'
         | 
| 14 | 
            +
                @path_to_yaml_in_gem = 'spec/spec_helper.rb'
         | 
| 15 | 
            +
                @from_locale= :en
         | 
| 16 | 
            +
                @to_locale = :es
         | 
| 16 17 |  | 
| 18 | 
            +
                @comparer = Transdifflation::Comparer.new
         | 
| 17 19 |  | 
| 20 | 
            +
                #YAMLReader should returnb a valid hash
         | 
| 21 | 
            +
                Transdifflation::YAMLReader.stub(:read_YAML_from_gem).and_return({es: {:home => "hogar"}})
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                #We require to simulate "Rails.root"
         | 
| 24 | 
            +
                ::Rails.stub(:root).and_return('/rails')
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              it 'should call get_first_time_file if the files does not exist' do
         | 
| 28 | 
            +
             | 
| 29 | 
            +
             | 
| 30 | 
            +
                #We actually don't care about basename, and we want to generate a testfile in our tests
         | 
| 31 | 
            +
                File.stub(:basename).and_return('/dir/file_or_something')
         | 
| 32 | 
            +
                File.stub(:join).and_return(File.join(File.dirname(__FILE__), '/assets/testfile'))
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                File.stub(:gsub).and_return('idontcare')
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                #File? Should return false, to simulate that the file is not created
         | 
| 37 | 
            +
                File.stub(:file?).and_return(false)
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                @comparer = Transdifflation::Comparer.new
         | 
| 40 | 
            +
                # And finally we are checking which method is being called, making them throw different exceptions
         | 
| 41 | 
            +
                @comparer.stub(:get_first_time_file).and_raise(ArgumentError)
         | 
| 42 | 
            +
                @comparer.stub(:generate_diff_file).and_raise(NameError)
         | 
| 43 | 
            +
                @comparer.should_receive(:get_first_time_file)
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                expect {@comparer.get_transdifflation_from_gem(@gem_name, @path_to_yaml_in_gem, @from_locale, @to_locale) }.to raise_error(ArgumentError)
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              it 'should call generate_diff_file if the files exists' do
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                #We actually don't care about basename, and we want to generate a testfile in our tests
         | 
| 51 | 
            +
                File.stub(:basename).and_return('/dir/file_or_something')
         | 
| 52 | 
            +
                File.stub(:join).and_return(File.join(File.dirname(__FILE__), '/assets/testfile'))
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                File.stub(:gsub).and_return('idontcare')
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                #File? Should return true, to simulate that the file is exists
         | 
| 57 | 
            +
                File.stub(:file?).and_return(true)
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                # And finally we are checking which method is being called, making them throw different exceptions
         | 
| 60 | 
            +
                @comparer.stub(:get_first_time_file).and_raise(ArgumentError)
         | 
| 61 | 
            +
                @comparer.stub(:generate_diff_file).and_raise(NameError)
         | 
| 62 | 
            +
                @comparer.should_receive(:generate_diff_file)
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                expect {@comparer.get_transdifflation_from_gem(@gem_name, @path_to_yaml_in_gem, @from_locale, @to_locale) }.to raise_error(NameError)
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
              it 'should translate yaml name from source locale to target locale' do
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                @path_to_yaml_in_gem = 'config/locales/en/gem_name.en.yml'  #source file, it has to be translated, and match inner reg exp
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                #File? Should return true, to simulate that the file is exists
         | 
| 72 | 
            +
                File.stub(:file?).and_return(true)
         | 
| 73 | 
            +
                #Finally simulate the call to generate_diff_file
         | 
| 74 | 
            +
                @comparer.stub(:generate_diff_file).and_return(nil)
         | 
| 75 | 
            +
             | 
| 76 | 
            +
             | 
| 77 | 
            +
             | 
| 78 | 
            +
             | 
| 79 | 
            +
             | 
| 80 | 
            +
                #call to method
         | 
| 81 | 
            +
                expect { @comparer.get_transdifflation_from_gem(@gem_name, @path_to_yaml_in_gem, @from_locale, @to_locale) }.to_not raise_error
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
            end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            describe :get_transdifflation_from_file do
         | 
| 87 | 
            +
             | 
| 88 | 
            +
              before(:each) do
         | 
| 89 | 
            +
                unless defined?(::Rails)
         | 
| 90 | 
            +
                  @mocked_rails_class = true
         | 
| 91 | 
            +
                  class ::Rails
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                @tag_name = 'my_tag'
         | 
| 96 | 
            +
                @path_to_yaml_relative_from_rails_root = 'spec/spec_helper.rb'
         | 
| 97 | 
            +
                @from_locale= :en
         | 
| 98 | 
            +
                @to_locale = :es
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                @comparer = Transdifflation::Comparer.new
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                #YAMLReader should returnb a valid hash
         | 
| 103 | 
            +
                Transdifflation::YAMLReader.stub(:read_YAML_from_pathfile).and_return({es: {:home => "hogar"}})
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                #We require to simulate "Rails.root"
         | 
| 106 | 
            +
                ::Rails.stub(:root).and_return('/rails')
         | 
| 107 | 
            +
             | 
| 108 | 
            +
              end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
              it 'should call get_first_time_file if the files does not exist' do
         | 
| 111 | 
            +
             | 
| 112 | 
            +
             | 
| 113 | 
            +
                #We actually don't care about basename, and we want to generate a testfile in our tests
         | 
| 114 | 
            +
                File.stub(:basename).and_return('/dir/file_or_something')
         | 
| 115 | 
            +
                File.stub(:join).and_return('./spec/assets/testfile_path')
         | 
| 116 | 
            +
                #We require to simulate "Rails.root"
         | 
| 117 | 
            +
                ::Rails.should_receive(:root).and_return('/rails')
         | 
| 118 | 
            +
                File.stub(:gsub).and_return('idontcare')
         | 
| 119 | 
            +
                #File? Should return false, to simulate that the file is not created
         | 
| 120 | 
            +
                File.stub(:file?).and_return(false)
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                # And finally we are checking which method is being called, making them throw different exceptions
         | 
| 123 | 
            +
                @comparer.stub(:get_first_time_file).and_raise(ArgumentError)
         | 
| 124 | 
            +
                @comparer.stub(:generate_diff_file).and_raise(NameError)
         | 
| 125 | 
            +
                @comparer.should_receive(:get_first_time_file)
         | 
| 126 | 
            +
                expect { @comparer.get_transdifflation_from_file(@tag_name, @path_to_yaml_relative_from_rails_root, @from_locale, @to_locale) }.to raise_error(ArgumentError)
         | 
| 127 | 
            +
              end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
              it 'should call generate_diff_file if the files exists' do
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                #We actually don't care about basename, and we want to generate a testfile in our tests
         | 
| 132 | 
            +
                File.stub(:basename).and_return('/dir/file_or_something')
         | 
| 133 | 
            +
                File.stub(:join).and_return('./spec/assets/testfile')
         | 
| 134 | 
            +
                #We require to simulate "Rails.root"
         | 
| 135 | 
            +
                ::Rails.should_receive(:root).and_return('/rails')
         | 
| 136 | 
            +
                File.stub(:gsub).and_return('idontcare')
         | 
| 137 | 
            +
                #File? Should return false, to simulate that the file is not created
         | 
| 138 | 
            +
                File.stub(:file?).and_return(true)
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                # And finally we are checking which method is being called, making them throw different exceptions
         | 
| 141 | 
            +
                @comparer.stub(:get_first_time_file).and_raise(ArgumentError)
         | 
| 142 | 
            +
                @comparer.stub(:generate_diff_file).and_raise(NameError)
         | 
| 143 | 
            +
                @comparer.should_receive(:generate_diff_file)
         | 
| 144 | 
            +
                expect { @comparer.get_transdifflation_from_file(@tag_name, @path_to_yaml_relative_from_rails_root, @from_locale, @to_locale) }.to raise_error(NameError)
         | 
| 145 | 
            +
              end
         | 
| 146 | 
            +
             | 
| 147 | 
            +
              it 'should translate yaml name from source locale to target locale' do
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                @path_to_yaml_relative_from_rails_root = '../config/locales/en/file_name.en.yml'  #source file, it has to be translated, and match inner reg exp
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                #File? Should return true, to simulate that the file is exists
         | 
| 152 | 
            +
                File.stub(:join).and_return('idontcare')
         | 
| 153 | 
            +
                File.stub(:file?).and_return(true)
         | 
| 154 | 
            +
                #Finally simulate the call to generate_diff_file
         | 
| 155 | 
            +
                @comparer.stub(:generate_diff_file).and_return(nil)
         | 
| 156 | 
            +
             | 
| 157 | 
            +
             | 
| 158 | 
            +
             | 
| 159 | 
            +
                #call to method
         | 
| 160 | 
            +
                expect { @comparer.get_transdifflation_from_file(@tag_name, @path_to_yaml_relative_from_rails_root, @from_locale, @to_locale) }.to_not raise_error
         | 
| 161 | 
            +
              end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
            end
         | 
| 164 | 
            +
             | 
| 165 | 
            +
             | 
| 166 | 
            +
            describe :comparer_common_methods do
         | 
| 167 | 
            +
             | 
| 168 | 
            +
              before(:each) do
         | 
| 169 | 
            +
                unless defined?(::Rails)
         | 
| 170 | 
            +
                  @mocked_rails_class = true
         | 
| 171 | 
            +
                  class ::Rails
         | 
| 172 | 
            +
                  end
         | 
| 173 | 
            +
                end
         | 
| 174 | 
            +
             | 
| 175 | 
            +
                @gem_name = 'rake'
         | 
| 176 | 
            +
                @path_to_yaml_in_gem = 'spec/spec_helper.rb'
         | 
| 177 | 
            +
                @from_locale= :en
         | 
| 178 | 
            +
                @to_locale = :es
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                @comparer = Transdifflation::Comparer.new
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                #YAMLReader should returnb a valid hash
         | 
| 183 | 
            +
                Transdifflation::YAMLReader.stub(:read_YAML_from_gem).and_return({en: {:home => "hogar"}})
         | 
| 184 | 
            +
             | 
| 185 | 
            +
             | 
| 186 | 
            +
                #We require to simulate "Rails.root"
         | 
| 187 | 
            +
                ::Rails.stub(:root).and_return('/rails')
         | 
| 188 | 
            +
              end
         | 
| 189 | 
            +
             | 
| 190 | 
            +
              it 'should generate first timefile if the files does not exist' do
         | 
| 191 | 
            +
             | 
| 192 | 
            +
             | 
| 193 | 
            +
                #We actually don't care about basename, and we want to generate a testfile in our tests
         | 
| 194 | 
            +
                File.stub(:basename).and_return('config/locales/en/gem_name.en.yml')
         | 
| 195 | 
            +
             | 
| 196 | 
            +
             | 
| 197 | 
            +
                #File? Should return false, to simulate that the file is not created
         | 
| 198 | 
            +
                File.stub(:file?).and_return(false)
         | 
| 199 | 
            +
             | 
| 200 | 
            +
             | 
| 201 | 
            +
                #now we must stub File.open, write and close in order to avoid fails on get_first_time_file
         | 
| 202 | 
            +
                mock_file = mock("File")
         | 
| 203 | 
            +
                mock_file.stub(:write).and_return(nil)
         | 
| 204 | 
            +
                mock_file.stub(:close).and_return(nil)
         | 
| 205 | 
            +
                File.stub(:open).and_return(mock_file)
         | 
| 206 | 
            +
             | 
| 207 | 
            +
             | 
| 208 | 
            +
                expect {@comparer.get_transdifflation_from_gem(@gem_name, @path_to_yaml_in_gem, @from_locale, @to_locale) }.to_not raise_error
         | 
| 209 | 
            +
              end
         | 
| 210 | 
            +
             | 
| 211 | 
            +
              it 'should try to copy config_example_file if asked' do
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                FileUtils.stub(:copy).and_return(nil)
         | 
| 214 | 
            +
                expect { Transdifflation::Comparer.generate_config_example_file('foo/bar') }.to_not raise_error
         | 
| 215 | 
            +
              end
         | 
| 216 | 
            +
             | 
| 217 | 
            +
              it 'should generate a valid diff_file when differences not exists' do
         | 
| 218 | 
            +
             | 
| 219 | 
            +
                #We actually don't care about basename, and we want to generate a testfile in our tests
         | 
| 220 | 
            +
                File.stub(:basename).and_return('/dir/file_or_something')
         | 
| 221 | 
            +
                File.stub(:join).and_return('./spec/assets/testfile')
         | 
| 222 | 
            +
                #We require to simulate "Rails.root"
         | 
| 223 | 
            +
                ::Rails.should_receive(:root).and_return('/rails')
         | 
| 224 | 
            +
                File.stub(:gsub).and_return('idontcare')
         | 
| 225 | 
            +
                #File? Should return false, to simulate that the file is not created
         | 
| 226 | 
            +
                File.stub(:file?).and_return(true)
         | 
| 227 | 
            +
             | 
| 228 | 
            +
             | 
| 229 | 
            +
                #YAMLReader should return TWO valid hashes
         | 
| 230 | 
            +
                Transdifflation::YAMLReader.stub(:read_YAML_from_pathfile).and_return( {es: {:dorothy => "Dorothy"}})
         | 
| 231 | 
            +
             | 
| 232 | 
            +
                #now we must stub File.open, write and close in order to avoid fails on get_first_time_file
         | 
| 233 | 
            +
                mock_file = mock("File")
         | 
| 234 | 
            +
                mock_file.stub(:write).and_return(nil)
         | 
| 235 | 
            +
                mock_file.stub(:close).and_return(nil)
         | 
| 236 | 
            +
                File.stub(:open).and_return(mock_file)
         | 
| 237 | 
            +
             | 
| 238 | 
            +
             | 
| 239 | 
            +
                expect { @comparer.get_transdifflation_from_gem(@gem_name, @path_to_yaml_in_gem, @from_locale, @to_locale) }.to_not raise_error
         | 
| 240 | 
            +
             | 
| 241 | 
            +
             | 
| 242 | 
            +
              end
         | 
| 243 | 
            +
             | 
| 244 | 
            +
              it 'should generate a clear diff_file when differences exists' do
         | 
| 245 | 
            +
             | 
| 246 | 
            +
                #We actually don't care about basename, and we want to generate a testfile in our tests
         | 
| 247 | 
            +
                File.stub(:basename).and_return('/dir/file_or_something')
         | 
| 248 | 
            +
                File.stub(:join).and_return('./spec/assets/testfile')
         | 
| 249 | 
            +
                #We require to simulate "Rails.root"
         | 
| 250 | 
            +
                ::Rails.should_receive(:root).and_return('/rails')
         | 
| 251 | 
            +
                File.stub(:gsub).and_return('idontcare')
         | 
| 252 | 
            +
                #File? Should return false, to simulate that the file is not created
         | 
| 253 | 
            +
                File.stub(:file?).and_return(true)
         | 
| 254 | 
            +
             | 
| 255 | 
            +
               
         | 
| 256 | 
            +
                #now we must stub File.open, write and close in order to avoid fails on get_first_time_file
         | 
| 257 | 
            +
                mock_file = mock("File")
         | 
| 258 | 
            +
                mock_file.stub(:write).and_return(nil)
         | 
| 259 | 
            +
                mock_file.stub(:close).and_return(nil)
         | 
| 260 | 
            +
                File.stub(:open).and_return(mock_file)
         | 
| 261 | 
            +
             | 
| 262 | 
            +
                #YAMLReader should return TWO valid hashes
         | 
| 263 | 
            +
                Transdifflation::YAMLReader.stub(:read_YAML_from_pathfile).and_return({en: {:home => "hogar"}})
         | 
| 264 | 
            +
             | 
| 265 | 
            +
             | 
| 266 | 
            +
                expect { @comparer.get_transdifflation_from_gem(@gem_name, @path_to_yaml_in_gem, @from_locale, @from_locale) }.to_not raise_error
         | 
| 267 | 
            +
             | 
| 268 | 
            +
             | 
| 269 | 
            +
              end
         | 
| 270 | 
            +
             | 
| 271 | 
            +
             | 
| 272 | 
            +
            end
         | 
| 18 273 |  | 
| 19 274 |  | 
| 20 | 
            -
            # end
         | 
    
        data/spec/utilities_spec.rb
    CHANGED
    
    | @@ -10,18 +10,25 @@ describe :symbolize! do | |
| 10 10 | 
             
              it 'convert all keys in a Hash (presumily from YAML) in symbols' do
         | 
| 11 11 | 
             
                example_hash = { "es" => 666, "lala" => "truururur" }
         | 
| 12 12 | 
             
                example_hash.symbolize!
         | 
| 13 | 
            -
             | 
| 13 | 
            +
            	 example_hash.should ==  { :es => 666, :lala => "truururur" }
         | 
| 14 14 | 
             
              end
         | 
| 15 15 |  | 
| 16 16 | 
             
              it 'convert all keys in a Hash (presumily from YAML) in symbols but if there is a hash it should leave it' do
         | 
| 17 17 | 
             
                example_hash = { :es => 666, "lala" => "truururur" }
         | 
| 18 18 | 
             
                example_hash.symbolize!
         | 
| 19 | 
            -
             | 
| 19 | 
            +
            	 example_hash.should ==  { :es => 666, :lala => "truururur" }
         | 
| 20 20 | 
             
              end
         | 
| 21 21 |  | 
| 22 22 | 
             
              it 'should return something usefull on nil' do
         | 
| 23 23 | 
             
                example_hash = Hash.new
         | 
| 24 24 | 
             
                example_hash.symbolize!
         | 
| 25 | 
            -
             | 
| 25 | 
            +
                example_hash.should ==  {}
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              it 'should call itself recursively' do
         | 
| 29 | 
            +
                example_hash = { :es => 666, "lala" => "truururur", :nested => {:another => "Call for simbolize"}}
         | 
| 30 | 
            +
                hash_translator = Transdifflation::HashSymbolTranslator.new
         | 
| 31 | 
            +
                hash_translator.symbolize(example_hash)
         | 
| 32 | 
            +
                example_hash.should ==  { :es => 666, "lala" => "truururur", :nested => {:another => "Call for simbolize"}}
         | 
| 26 33 | 
             
              end
         | 
| 27 34 | 
             
            end
         | 
    
        data/spec/yaml_reader_spec.rb
    CHANGED
    
    | @@ -26,6 +26,7 @@ describe :YAMLReader do | |
| 26 26 | 
             
                  File.stub(:file?).and_return(true)
         | 
| 27 27 | 
             
                  ::Rails.should_receive(:root).and_return('/rails')
         | 
| 28 28 |  | 
| 29 | 
            +
                  
         | 
| 29 30 | 
             
                  expect {Transdifflation::YAMLReader.read_YAML_from_filesystem('whatever')}.to_not raise_error(ArgumentError)
         | 
| 30 31 | 
             
                end
         | 
| 31 32 | 
             
              end
         | 
| @@ -84,4 +85,4 @@ describe :YAMLReader do | |
| 84 85 | 
             
                end
         | 
| 85 86 | 
             
              end
         | 
| 86 87 |  | 
| 87 | 
            -
            end
         | 
| 88 | 
            +
            end
         | 
    
        data/spec/yaml_writer_spec.rb
    CHANGED
    
    | @@ -12,6 +12,14 @@ describe :YAMLWriter do | |
| 12 12 | 
             
                  hashy = {:movie => "Avengers"}
         | 
| 13 13 | 
             
                  Transdifflation::YAMLWriter.to_yaml(hashy).should be == ":movie: Avengers"
         | 
| 14 14 | 
             
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                it 'should chomp if matches with the regex: /\?\s+/' do
         | 
| 17 | 
            +
                  hashy = {:movie => "Avengers"}
         | 
| 18 | 
            +
                  Regex = "!ruby/symbol ---? \"es\"\n"   
         | 
| 19 | 
            +
                  hashy.deep_stringify_keys.stub(:send).and_return(Regex)
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  Transdifflation::YAMLWriter.to_yaml(hashy).should be == ":\"es\""
         | 
| 22 | 
            +
                end
         | 
| 15 23 | 
             
              end
         | 
| 16 24 |  | 
| 17 25 | 
             
              describe :deep_stringify_keys do
         | 
| @@ -19,6 +27,12 @@ describe :YAMLWriter do | |
| 19 27 | 
             
                 hashy = {:en=>{:date=>{:formats=>{:default=>"%d/%m/%Y", :short=>"%d %b"}}}}
         | 
| 20 28 | 
             
                 hashy.deep_stringify_keys.should == {:en=>{:date=>{:formats=>{:default=>"%d/%m/%Y", :short=>"%d %b"}}}}
         | 
| 21 29 | 
             
                end
         | 
| 30 | 
            +
                
         | 
| 31 | 
            +
                it 'should print all the nodes from a hash in the exact same order' do
         | 
| 32 | 
            +
                 hashy = {:en=>{:date=>{:formats=>{:default=>"%d/%m/%Y", :short=>"%d %b"}}}}
         | 
| 33 | 
            +
                 hashy.deep_stringify_keys.should == hashy
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 22 36 | 
             
                it 'should print all the nodes from a hash in the exact same order' do
         | 
| 23 37 | 
             
                 hashy = {:en=>{:date=>{:formats=>{:default=>"%d/%m/%Y", :short=>"%d %b"}}}}
         | 
| 24 38 | 
             
                 hashy.deep_stringify_keys.should == hashy
         | 
    
        data/transdifflation.gemspec
    CHANGED
    
    | @@ -13,7 +13,7 @@ Gem::Specification.new do |gem| | |
| 13 13 | 
             
              gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
         | 
| 14 14 | 
             
              gem.name          = "transdifflation"
         | 
| 15 15 | 
             
              gem.require_paths = ["lib"]
         | 
| 16 | 
            -
              gem.version       =  | 
| 16 | 
            +
              gem.version       = Transdifflation::VERSION
         | 
| 17 17 |  | 
| 18 18 | 
             
              #Dependencies
         | 
| 19 19 | 
             
              gem.add_dependency 'rails', '~> 3.2.8'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: transdifflation
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.2
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012-10- | 
| 12 | 
            +
            date: 2012-10-17 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rails
         | 
| @@ -185,6 +185,8 @@ files: | |
| 185 185 | 
             
            - LICENSE
         | 
| 186 186 | 
             
            - README.md
         | 
| 187 187 | 
             
            - Rakefile
         | 
| 188 | 
            +
            - lib/tasks/lost_in_translation.rake
         | 
| 189 | 
            +
            - lib/tasks/translation_coverage.rake
         | 
| 188 190 | 
             
            - lib/transdifflation.rb
         | 
| 189 191 | 
             
            - lib/transdifflation/exceptions.rb
         | 
| 190 192 | 
             
            - lib/transdifflation/railtie.rb
         | 
| @@ -193,6 +195,9 @@ files: | |
| 193 195 | 
             
            - lib/transdifflation/version.rb
         | 
| 194 196 | 
             
            - lib/transdifflation/yaml_reader.rb
         | 
| 195 197 | 
             
            - lib/transdifflation/yaml_writer.rb
         | 
| 198 | 
            +
            - spec/assets/testfile
         | 
| 199 | 
            +
            - spec/coverage_spec.rb
         | 
| 200 | 
            +
            - spec/lost_in_translation_spec.rb
         | 
| 196 201 | 
             
            - spec/spec_helper.rb
         | 
| 197 202 | 
             
            - spec/transdifflation_spec.rb
         | 
| 198 203 | 
             
            - spec/utilities_spec.rb
         | 
| @@ -225,6 +230,9 @@ specification_version: 3 | |
| 225 230 | 
             
            summary: Compares yml locate files with yours and generate diff files to maintain
         | 
| 226 231 | 
             
              gems or adjacent projects
         | 
| 227 232 | 
             
            test_files:
         | 
| 233 | 
            +
            - spec/assets/testfile
         | 
| 234 | 
            +
            - spec/coverage_spec.rb
         | 
| 235 | 
            +
            - spec/lost_in_translation_spec.rb
         | 
| 228 236 | 
             
            - spec/spec_helper.rb
         | 
| 229 237 | 
             
            - spec/transdifflation_spec.rb
         | 
| 230 238 | 
             
            - spec/utilities_spec.rb
         |