slang 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +28 -0
- data/LICENSE.md +20 -0
- data/README.md +242 -0
- data/Rakefile +12 -0
- data/lib/slang.rb +144 -0
- data/lib/slang/internal.rb +139 -0
- data/lib/slang/railtie.rb +16 -0
- data/lib/slang/snapshot.rb +131 -0
- data/lib/slang/snapshot/locale.rb +35 -0
- data/lib/slang/snapshot/rules.rb +239 -0
- data/lib/slang/snapshot/template.rb +58 -0
- data/lib/slang/snapshot/translation.rb +135 -0
- data/lib/slang/snapshot/warnings.rb +102 -0
- data/lib/slang/updater/abstract.rb +74 -0
- data/lib/slang/updater/development.rb +88 -0
- data/lib/slang/updater/http_helpers.rb +49 -0
- data/lib/slang/updater/key_reporter.rb +92 -0
- data/lib/slang/updater/production.rb +218 -0
- data/lib/slang/updater/shared_state.rb +59 -0
- data/lib/slang/updater/squelchable.rb +45 -0
- data/lib/slang/version.rb +3 -0
- data/slang.gemspec +20 -0
- data/test/data/snapshot.json +64 -0
- data/test/helper.rb +4 -0
- data/test/test_locale.rb +47 -0
- data/test/test_rules.rb +133 -0
- data/test/test_snapshot.rb +132 -0
- data/test/test_template.rb +49 -0
- data/test/test_translation.rb +94 -0
- data/test/test_warnings.rb +123 -0
- metadata +99 -0
| @@ -0,0 +1,94 @@ | |
| 1 | 
            +
            # TODO: test KEY_REGEX
         | 
| 2 | 
            +
            require "helper"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Slang
         | 
| 5 | 
            +
              class TestTranslation < Minitest::Test
         | 
| 6 | 
            +
                Locale = Snapshot::Locale
         | 
| 7 | 
            +
                Translation = Snapshot::Translation
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                parallelize_me!
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def setup
         | 
| 12 | 
            +
                  simple_key = [ "simple_key", "",
         | 
| 13 | 
            +
                    "lang0",
         | 
| 14 | 
            +
                    "lang1",
         | 
| 15 | 
            +
                    "" # missing template
         | 
| 16 | 
            +
                  ]
         | 
| 17 | 
            +
                  rule_key = [ "rule_key", "gender=G",
         | 
| 18 | 
            +
                    [ "female", "Hey girl", "male", "Hey guy", "unknown", "Hey there" ],
         | 
| 19 | 
            +
                    [ "female", "Yo girl", "male", "Yo guy", "unknown", "Yo there" ],
         | 
| 20 | 
            +
                    [] # missing rule templates
         | 
| 21 | 
            +
                  ]
         | 
| 22 | 
            +
                  multi_rule_key = [ "apples_bananas", "apples=N:bananas=N",
         | 
| 23 | 
            +
                    [
         | 
| 24 | 
            +
                      "one:one",     "I'll eat one apple and one banana.",
         | 
| 25 | 
            +
                      "one:other",   "I'll eat one apple, and then I'll eat {bananas} bananas.",
         | 
| 26 | 
            +
                      "one:zero",    "I'll eat one apple, but no bananas.",
         | 
| 27 | 
            +
                      "other:one",   "I'll eat {apples} apples, but just one banana.",
         | 
| 28 | 
            +
                      "other:other", "I'll eat {apples} apples and {bananas} bananas.",
         | 
| 29 | 
            +
                      "other:zero",  "I'll eat {apples} apples, but no bananas.",
         | 
| 30 | 
            +
                      "zero:one",    "I don't like apples, but I'll eat a banana.",
         | 
| 31 | 
            +
                      "zero:other",  "I don't like apples, but I'll eat {bananas} bananas.",
         | 
| 32 | 
            +
                      "zero:zero",   "I don't like to eat apples nor bananas."
         | 
| 33 | 
            +
                    ],
         | 
| 34 | 
            +
                    [], # missing
         | 
| 35 | 
            +
                    [] # missing
         | 
| 36 | 
            +
                  ]
         | 
| 37 | 
            +
                  interpolated_key = [ "interpolated_key", "", "Hi {a}", "Yo {a}", "", "" ]
         | 
| 38 | 
            +
                  unknown_rule_key = [ "unknown_rule", "foo=X", [], [] ]
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  @simple = Translation.new(simple_key)
         | 
| 41 | 
            +
                  @rule = Translation.new(rule_key)
         | 
| 42 | 
            +
                  @multi = Translation.new(multi_rule_key)
         | 
| 43 | 
            +
                  @interpolated = Translation.new(interpolated_key)
         | 
| 44 | 
            +
                  @unknown_rule = Translation.new(unknown_rule_key)
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  @locale0 = Locale.new(["en",nil,"one_other",true], 0)
         | 
| 47 | 
            +
                  @locale1 = Locale.new(["en",nil,"one_other",true], 1)
         | 
| 48 | 
            +
                  @locale2 = Locale.new(["en",nil,"one_other",true], 2)
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                def test_initialize
         | 
| 52 | 
            +
                  assert_equal("simple_key", @simple.key)
         | 
| 53 | 
            +
                  assert_empty(@simple.rule_pattern)
         | 
| 54 | 
            +
                  assert_empty(@simple.rules)
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  assert_equal("rule_key", @rule.key)
         | 
| 57 | 
            +
                  assert_equal("gender=G", @rule.rule_pattern)
         | 
| 58 | 
            +
                  assert_equal([[ "gender", :gender ]], @rule.rules)
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  assert_equal("apples_bananas", @multi.key)
         | 
| 61 | 
            +
                  assert_equal("apples=N:bananas=N", @multi.rule_pattern)
         | 
| 62 | 
            +
                  assert_equal([[ "apples", :pluralization ], [ "bananas", :pluralization ]], @multi.rules)
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  assert_equal("interpolated_key", @interpolated.key)
         | 
| 65 | 
            +
                  assert_empty(@interpolated.rule_pattern)
         | 
| 66 | 
            +
                  assert_empty(@interpolated.rules)
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  assert_nil(@unknown_rule.rules)
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                def test_evaluate
         | 
| 72 | 
            +
                  assert_equal([:success, "lang1"], @simple.evaluate(@locale1, {}))
         | 
| 73 | 
            +
                  assert_equal([:success, "Yo girl"], @rule.evaluate(@locale1, { "gender" => :female }))
         | 
| 74 | 
            +
                  assert_equal([:success, "Yo dog"], @interpolated.evaluate(@locale1, { "a" => "dog" }))
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                def test_evaluate_missing_template
         | 
| 78 | 
            +
                  assert_equal([:missing_template], @simple.evaluate(@locale2, {}))
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                def test_evaluate_missing_interpolation_variables
         | 
| 82 | 
            +
                  assert_equal([:missing_interpolation_variables, "Yo {a}", [ "a" ], nil], @interpolated.evaluate(@locale1, {}))
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                def test_evaluate_missing_rule_variables
         | 
| 86 | 
            +
                  assert_equal([:missing_rule_variables, "{{en:rule_key:<gender>}}", [ "gender" ]], @rule.evaluate(@locale1, {}))
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                def test_evaluate_missing_rule_templates
         | 
| 90 | 
            +
                  assert_equal([:missing_rule_templates, "{{en:rule_key:[female]}}", [ "female" ]], @rule.evaluate(@locale2, { "gender" => :female }))
         | 
| 91 | 
            +
                end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              end
         | 
| 94 | 
            +
            end
         | 
| @@ -0,0 +1,123 @@ | |
| 1 | 
            +
            require "helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Slang
         | 
| 4 | 
            +
              class TestWarnings < Minitest::Test
         | 
| 5 | 
            +
                Locale = Snapshot::Locale
         | 
| 6 | 
            +
                parallelize_me!
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def setup
         | 
| 9 | 
            +
                  @warnings = Snapshot.from_json(Snapshot::EMPTY_SNAPSHOT_JSON)
         | 
| 10 | 
            +
                  @locale = Locale.new(["de", "en", "one_other", true, "german"], 0)
         | 
| 11 | 
            +
                  def Slang.logger; Logger.new(StringIO.new); end # ignore logging
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def test_no_warnings
         | 
| 15 | 
            +
                  assert_empty(@warnings.warnings)
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def test_missing_key
         | 
| 19 | 
            +
                  Time.stub :now, Time.at(1406578476) do
         | 
| 20 | 
            +
                    @warnings.missing_key!(@locale, "foo", a: "a")
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                  h = @warnings.warnings["1:de:foo"]
         | 
| 23 | 
            +
                  refute_nil(h)
         | 
| 24 | 
            +
                  assert_equal(1, h[:warning])
         | 
| 25 | 
            +
                  assert_equal(:de, h[:locale])
         | 
| 26 | 
            +
                  assert_equal("foo", h[:key])
         | 
| 27 | 
            +
                  assert_equal([:a], h[:passed_variables])
         | 
| 28 | 
            +
                  assert_equal(1406578476, h[:timestamp])
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def test_missing_key_ignore_duplicate
         | 
| 32 | 
            +
                  Time.stub :now, Time.at(1406578476) do
         | 
| 33 | 
            +
                    @warnings.missing_key!(@locale, "foo", a: "a")
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                  Time.stub :now, Time.at(0) do
         | 
| 36 | 
            +
                    @warnings.missing_key!(@locale, "foo", a: "a")
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
                  h = @warnings.warnings["1:de:foo"]
         | 
| 39 | 
            +
                  refute_nil(h)
         | 
| 40 | 
            +
                  assert_equal(1406578476, h[:timestamp])
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def test_missing_interpolation_variables
         | 
| 44 | 
            +
                  Time.stub :now, Time.at(1406578476) do
         | 
| 45 | 
            +
                    @warnings.missing_interpolation_variables!(@locale, "foo", "selector", %w(var1 var2), a: "a")
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                  h = @warnings.warnings["2:de:foo:selector:var1,var2"]
         | 
| 48 | 
            +
                  refute_nil(h)
         | 
| 49 | 
            +
                  assert_equal(2, h[:warning])
         | 
| 50 | 
            +
                  assert_equal(:de, h[:locale])
         | 
| 51 | 
            +
                  assert_equal("foo", h[:key])
         | 
| 52 | 
            +
                  assert_equal("selector", h[:selector])
         | 
| 53 | 
            +
                  assert_equal(["var1", "var2"], h[:missing_variables])
         | 
| 54 | 
            +
                  assert_equal([:a], h[:passed_variables])
         | 
| 55 | 
            +
                  assert_equal(1406578476, h[:timestamp])
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                def test_missing_interpolation_variables_ignore_duplicate
         | 
| 59 | 
            +
                  Time.stub :now, Time.at(1406578476) do
         | 
| 60 | 
            +
                    @warnings.missing_interpolation_variables!(@locale, "foo", "selector", %w(var1 var2), a: "a")
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
                  Time.stub :now, Time.at(0) do
         | 
| 63 | 
            +
                    @warnings.missing_interpolation_variables!(@locale, "foo", "selector", %w(var1 var2), a: "a")
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
                  h = @warnings.warnings["2:de:foo:selector:var1,var2"]
         | 
| 66 | 
            +
                  refute_nil(h)
         | 
| 67 | 
            +
                  assert_equal(1406578476, h[:timestamp])
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                def test_missing_rule_variables
         | 
| 71 | 
            +
                  Time.stub :now, Time.at(1406578476) do
         | 
| 72 | 
            +
                    @warnings.missing_rule_variables!(@locale, "foo", %w(var1 var2), a: "a")
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
                  h = @warnings.warnings["3:de:foo:var1,var2"]
         | 
| 75 | 
            +
                  refute_nil(h)
         | 
| 76 | 
            +
                  assert_equal(3, h[:warning])
         | 
| 77 | 
            +
                  assert_equal(:de, h[:locale])
         | 
| 78 | 
            +
                  assert_equal("foo", h[:key])
         | 
| 79 | 
            +
                  assert_equal(["var1", "var2"], h[:missing_variables])
         | 
| 80 | 
            +
                  assert_equal([:a], h[:passed_variables])
         | 
| 81 | 
            +
                  assert_equal(1406578476, h[:timestamp])
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                def test_missing_rule_variables_ignore_duplicate
         | 
| 85 | 
            +
                  Time.stub :now, Time.at(1406578476) do
         | 
| 86 | 
            +
                    @warnings.missing_rule_variables!(@locale, "foo", %w(var1 var2), a: "a")
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
                  Time.stub :now, Time.at(0) do
         | 
| 89 | 
            +
                    @warnings.missing_rule_variables!(@locale, "foo", %w(var1 var2), a: "a")
         | 
| 90 | 
            +
                  end
         | 
| 91 | 
            +
                  h = @warnings.warnings["3:de:foo:var1,var2"]
         | 
| 92 | 
            +
                  refute_nil(h)
         | 
| 93 | 
            +
                  assert_equal(1406578476, h[:timestamp])
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                def test_missing_rule_templates
         | 
| 97 | 
            +
                  Time.stub :now, Time.at(1406578476) do
         | 
| 98 | 
            +
                    @warnings.missing_rule_templates!(@locale, "foo", %w(zero other), a: "a")
         | 
| 99 | 
            +
                  end
         | 
| 100 | 
            +
                  h = @warnings.warnings["4:de:foo:zero,other"]
         | 
| 101 | 
            +
                  refute_nil(h)
         | 
| 102 | 
            +
                  assert_equal(4, h[:warning])
         | 
| 103 | 
            +
                  assert_equal(:de, h[:locale])
         | 
| 104 | 
            +
                  assert_equal("foo", h[:key])
         | 
| 105 | 
            +
                  assert_equal(%w(zero other), h[:missing_templates])
         | 
| 106 | 
            +
                  assert_equal([:a], h[:passed_variables])
         | 
| 107 | 
            +
                  assert_equal(1406578476, h[:timestamp])
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                def test_missing_rule_templates_ignore_duplicate
         | 
| 111 | 
            +
                  Time.stub :now, Time.at(1406578476) do
         | 
| 112 | 
            +
                    @warnings.missing_rule_templates!(@locale, "foo", %w(zero other), a: "a")
         | 
| 113 | 
            +
                  end
         | 
| 114 | 
            +
                  Time.stub :now, Time.at(0) do
         | 
| 115 | 
            +
                    @warnings.missing_rule_templates!(@locale, "foo", %w(zero other), a: "a")
         | 
| 116 | 
            +
                  end
         | 
| 117 | 
            +
                  h = @warnings.warnings["4:de:foo:zero,other"]
         | 
| 118 | 
            +
                  refute_nil(h)
         | 
| 119 | 
            +
                  assert_equal(1406578476, h[:timestamp])
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
              end
         | 
| 123 | 
            +
            end
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,99 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: slang
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.34.0
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - Adrian B. Danieli
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
            date: 2015-05-14 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: oj
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - "~>"
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '2.12'
         | 
| 20 | 
            +
              type: :runtime
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - "~>"
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '2.12'
         | 
| 27 | 
            +
            description: 
         | 
| 28 | 
            +
            email:
         | 
| 29 | 
            +
            - support@getslang.com
         | 
| 30 | 
            +
            executables: []
         | 
| 31 | 
            +
            extensions: []
         | 
| 32 | 
            +
            extra_rdoc_files: []
         | 
| 33 | 
            +
            files:
         | 
| 34 | 
            +
            - ".gitignore"
         | 
| 35 | 
            +
            - CHANGELOG.md
         | 
| 36 | 
            +
            - Gemfile
         | 
| 37 | 
            +
            - Gemfile.lock
         | 
| 38 | 
            +
            - LICENSE.md
         | 
| 39 | 
            +
            - README.md
         | 
| 40 | 
            +
            - Rakefile
         | 
| 41 | 
            +
            - lib/slang.rb
         | 
| 42 | 
            +
            - lib/slang/internal.rb
         | 
| 43 | 
            +
            - lib/slang/railtie.rb
         | 
| 44 | 
            +
            - lib/slang/snapshot.rb
         | 
| 45 | 
            +
            - lib/slang/snapshot/locale.rb
         | 
| 46 | 
            +
            - lib/slang/snapshot/rules.rb
         | 
| 47 | 
            +
            - lib/slang/snapshot/template.rb
         | 
| 48 | 
            +
            - lib/slang/snapshot/translation.rb
         | 
| 49 | 
            +
            - lib/slang/snapshot/warnings.rb
         | 
| 50 | 
            +
            - lib/slang/updater/abstract.rb
         | 
| 51 | 
            +
            - lib/slang/updater/development.rb
         | 
| 52 | 
            +
            - lib/slang/updater/http_helpers.rb
         | 
| 53 | 
            +
            - lib/slang/updater/key_reporter.rb
         | 
| 54 | 
            +
            - lib/slang/updater/production.rb
         | 
| 55 | 
            +
            - lib/slang/updater/shared_state.rb
         | 
| 56 | 
            +
            - lib/slang/updater/squelchable.rb
         | 
| 57 | 
            +
            - lib/slang/version.rb
         | 
| 58 | 
            +
            - slang.gemspec
         | 
| 59 | 
            +
            - test/data/snapshot.json
         | 
| 60 | 
            +
            - test/helper.rb
         | 
| 61 | 
            +
            - test/test_locale.rb
         | 
| 62 | 
            +
            - test/test_rules.rb
         | 
| 63 | 
            +
            - test/test_snapshot.rb
         | 
| 64 | 
            +
            - test/test_template.rb
         | 
| 65 | 
            +
            - test/test_translation.rb
         | 
| 66 | 
            +
            - test/test_warnings.rb
         | 
| 67 | 
            +
            homepage: https://getslang.com/
         | 
| 68 | 
            +
            licenses: []
         | 
| 69 | 
            +
            metadata: {}
         | 
| 70 | 
            +
            post_install_message: 
         | 
| 71 | 
            +
            rdoc_options: []
         | 
| 72 | 
            +
            require_paths:
         | 
| 73 | 
            +
            - lib
         | 
| 74 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 75 | 
            +
              requirements:
         | 
| 76 | 
            +
              - - ">="
         | 
| 77 | 
            +
                - !ruby/object:Gem::Version
         | 
| 78 | 
            +
                  version: 2.0.0
         | 
| 79 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 80 | 
            +
              requirements:
         | 
| 81 | 
            +
              - - ">="
         | 
| 82 | 
            +
                - !ruby/object:Gem::Version
         | 
| 83 | 
            +
                  version: '0'
         | 
| 84 | 
            +
            requirements: []
         | 
| 85 | 
            +
            rubyforge_project: 
         | 
| 86 | 
            +
            rubygems_version: 2.4.5
         | 
| 87 | 
            +
            signing_key: 
         | 
| 88 | 
            +
            specification_version: 4
         | 
| 89 | 
            +
            summary: Slang Ruby Client
         | 
| 90 | 
            +
            test_files:
         | 
| 91 | 
            +
            - test/data/snapshot.json
         | 
| 92 | 
            +
            - test/helper.rb
         | 
| 93 | 
            +
            - test/test_locale.rb
         | 
| 94 | 
            +
            - test/test_rules.rb
         | 
| 95 | 
            +
            - test/test_snapshot.rb
         | 
| 96 | 
            +
            - test/test_template.rb
         | 
| 97 | 
            +
            - test/test_translation.rb
         | 
| 98 | 
            +
            - test/test_warnings.rb
         | 
| 99 | 
            +
            has_rdoc: 
         |