abroad 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +142 -0
  3. data/abroad.gemspec +25 -0
  4. data/lib/abroad/extractors/extractor.rb +46 -0
  5. data/lib/abroad/extractors/json/json_extractor.rb +17 -0
  6. data/lib/abroad/extractors/json/key_value_extractor.rb +38 -0
  7. data/lib/abroad/extractors/json.rb +8 -0
  8. data/lib/abroad/extractors/xml/android_extractor.rb +113 -0
  9. data/lib/abroad/extractors/xml/xml_extractor.rb +28 -0
  10. data/lib/abroad/extractors/xml.rb +8 -0
  11. data/lib/abroad/extractors/yaml/dotted_key_extractor.rb +40 -0
  12. data/lib/abroad/extractors/yaml/jruby_compat.rb +170 -0
  13. data/lib/abroad/extractors/yaml/rails_extractor.rb +15 -0
  14. data/lib/abroad/extractors/yaml/yaml_extractor.rb +28 -0
  15. data/lib/abroad/extractors/yaml.rb +9 -0
  16. data/lib/abroad/extractors.rb +28 -0
  17. data/lib/abroad/serializers/json/json_serializer.rb +27 -0
  18. data/lib/abroad/serializers/json/key_value_serializer.rb +20 -0
  19. data/lib/abroad/serializers/json.rb +8 -0
  20. data/lib/abroad/serializers/serializer.rb +52 -0
  21. data/lib/abroad/serializers/trie.rb +76 -0
  22. data/lib/abroad/serializers/xml/android_serializer.rb +143 -0
  23. data/lib/abroad/serializers/xml/xml_serializer.rb +23 -0
  24. data/lib/abroad/serializers/xml.rb +8 -0
  25. data/lib/abroad/serializers/yaml/rails_serializer.rb +110 -0
  26. data/lib/abroad/serializers/yaml/yaml_serializer.rb +19 -0
  27. data/lib/abroad/serializers/yaml.rb +8 -0
  28. data/lib/abroad/serializers.rb +29 -0
  29. data/lib/abroad/version.rb +3 -0
  30. data/lib/abroad.rb +37 -0
  31. data/lib/ext/htmlentities/android_xml_decoder.rb +15 -0
  32. data/lib/ext/htmlentities/android_xml_encoder.rb +23 -0
  33. data/spec/abroad_spec.rb +35 -0
  34. data/spec/extractors/json/fixtures/arrays.json +9 -0
  35. data/spec/extractors/json/fixtures/basic.json +5 -0
  36. data/spec/extractors/json/fixtures/objects.json +11 -0
  37. data/spec/extractors/json/fixtures.yml +22 -0
  38. data/spec/extractors/json/json_extractor_spec.rb +6 -0
  39. data/spec/extractors/xml/fixtures/basic_arrays.xml +9 -0
  40. data/spec/extractors/xml/fixtures/basic_plurals.xml +8 -0
  41. data/spec/extractors/xml/fixtures/basic_strings.xml +8 -0
  42. data/spec/extractors/xml/fixtures/entities.xml +4 -0
  43. data/spec/extractors/xml/fixtures/markup.xml +5 -0
  44. data/spec/extractors/xml/fixtures/newlines.xml +6 -0
  45. data/spec/extractors/xml/fixtures/quotes.xml +9 -0
  46. data/spec/extractors/xml/fixtures.yml +54 -0
  47. data/spec/extractors/xml/xml_extractor_spec.rb +6 -0
  48. data/spec/extractors/yaml/fixtures/arrays.yml +9 -0
  49. data/spec/extractors/yaml/fixtures/arrays_and_hashes.yml +29 -0
  50. data/spec/extractors/yaml/fixtures/invalid_single_quote_escape.yml +2 -0
  51. data/spec/extractors/yaml/fixtures/invalid_single_quote_escape_array.yml +3 -0
  52. data/spec/extractors/yaml/fixtures/nesting.yml +19 -0
  53. data/spec/extractors/yaml/fixtures/short.yml +2 -0
  54. data/spec/extractors/yaml/fixtures.yml +75 -0
  55. data/spec/extractors/yaml/jruby_compat_spec.rb +54 -0
  56. data/spec/extractors/yaml/yaml_extractor_spec.rb +6 -0
  57. data/spec/serializers/json/key_value_serializer_spec.rb +26 -0
  58. data/spec/serializers/xml/android_serializer_spec.rb +165 -0
  59. data/spec/serializers/yaml/rails_serializer_spec.rb +171 -0
  60. data/spec/spec_helper.rb +43 -0
  61. metadata +186 -0
@@ -0,0 +1,171 @@
1
+ require 'spec_helper'
2
+
3
+ include Abroad::Serializers
4
+
5
+ describe Yaml::RailsSerializer do
6
+ let(:stream) { StringIO.new }
7
+ let(:locale) { 'fr' }
8
+ let(:serializer) do
9
+ Yaml::RailsSerializer.new(stream, locale)
10
+ end
11
+
12
+ def serialize
13
+ yield
14
+ serializer.flush
15
+ YAML.load(stream.string)
16
+ end
17
+
18
+ it 'writes key/value pairs' do
19
+ result = serialize do
20
+ serializer.write_key_value('foo', 'bar')
21
+ end
22
+
23
+ expect(result).to eq('fr' => { 'foo' => 'bar' })
24
+ end
25
+
26
+ it 'nests dotted keys' do
27
+ result = serialize do
28
+ serializer.write_key_value('foo.bar.baz', 'boo')
29
+ end
30
+
31
+ expect(result).to eq({
32
+ 'fr' => { 'foo' => { 'bar' => { 'baz' => 'boo' } } }
33
+ })
34
+ end
35
+
36
+ it "doesn't strip trailing periods" do
37
+ result = serialize do
38
+ serializer.write_key_value('timezones.Solomon Is.', 'val')
39
+ end
40
+
41
+ expect(result).to eq({
42
+ 'fr' => {
43
+ 'timezones' => {
44
+ 'Solomon Is.' => 'val'
45
+ }
46
+ }
47
+ })
48
+ end
49
+
50
+ it 'strips trailing periods if they exist in the middle of the key' do
51
+ result = serialize do
52
+ serializer.write_key_value('timezones.Solomon Is.foobar', 'val')
53
+ end
54
+
55
+ expect(result).to eq({
56
+ 'fr' => {
57
+ 'timezones' => {
58
+ 'Solomon Is' => {
59
+ 'foobar' => 'val'
60
+ }
61
+ }
62
+ }
63
+ })
64
+ end
65
+
66
+ it "doesn't strip double periods" do
67
+ result = serialize do
68
+ serializer.write_key_value('timezones.Solomon Is..foobar', 'val')
69
+ end
70
+
71
+ expect(result).to eq({
72
+ 'fr' => {
73
+ 'timezones' => {
74
+ 'Solomon Is.' => {
75
+ 'foobar' => 'val'
76
+ }
77
+ }
78
+ }
79
+ })
80
+ end
81
+
82
+ it "doesn't split at periods if they exist before a space" do
83
+ result = serialize do
84
+ serializer.write_key_value('timezones.St. Petersburg.foobar', 'val')
85
+ end
86
+
87
+ expect(result).to eq({
88
+ 'fr' => {
89
+ 'timezones' => {
90
+ 'St. Petersburg' => {
91
+ 'foobar' => 'val'
92
+ }
93
+ }
94
+ }
95
+ })
96
+ end
97
+
98
+ it 'writes multiple key/value pairs independent of order' do
99
+ result = serialize do
100
+ serializer.write_key_value('i.like.burritos', 'beanz')
101
+ serializer.write_key_value('ham.cheese', 'sandwich')
102
+ serializer.write_key_value('i.like.cheesy.burritos', 'yum')
103
+ serializer.write_key_value('ham.lettuce', 'crunchay')
104
+ end
105
+
106
+ expect(result).to eq({
107
+ 'fr' => {
108
+ 'i' => {
109
+ 'like' => {
110
+ 'burritos' => 'beanz',
111
+ 'cheesy' => {
112
+ 'burritos' => 'yum'
113
+ }
114
+ }
115
+ },
116
+ 'ham' => {
117
+ 'cheese' => 'sandwich',
118
+ 'lettuce' => 'crunchay'
119
+ }
120
+ }
121
+ })
122
+ end
123
+
124
+ it 'writes arrays for sequential keys' do
125
+ result = serialize do
126
+ serializer.write_key_value('foo.1', 'b')
127
+ serializer.write_key_value('foo.0', 'a')
128
+ serializer.write_key_value('foo.2', 'c')
129
+ end
130
+
131
+ expect(result).to eq({
132
+ 'fr' => { 'foo' => ['a', 'b', 'c'] }
133
+ })
134
+ end
135
+
136
+ it 'does not write arrays for sequential but non-numeric keys' do
137
+ result = serialize do
138
+ serializer.write_key_value('foo.bar1', 'b')
139
+ serializer.write_key_value('foo.bar0', 'a')
140
+ serializer.write_key_value('foo.bar2', 'c')
141
+ end
142
+
143
+ expect(result).to eq({
144
+ 'fr' => {
145
+ 'foo' => {
146
+ 'bar1' => 'b',
147
+ 'bar0' => 'a',
148
+ 'bar2' => 'c'
149
+ }
150
+ }
151
+ })
152
+ end
153
+
154
+ it 'writes nested key/value pairs and arrays (in any order)' do
155
+ result = serialize do
156
+ serializer.write_key_value('foo.0.bar.0', 'a')
157
+ serializer.write_key_value('foo.0.bar.1', 'b')
158
+ serializer.write_key_value('foo.1.bar.0', 'c')
159
+ serializer.write_key_value('foo.1.bar.1', 'd')
160
+ end
161
+
162
+ expect(result).to eq({
163
+ 'fr' => {
164
+ 'foo' => [
165
+ { 'bar' => ['a', 'b'] },
166
+ { 'bar' => ['c', 'd'] }
167
+ ]
168
+ }
169
+ })
170
+ end
171
+ end
@@ -0,0 +1,43 @@
1
+ require 'pry-byebug' if RUBY_ENGINE == 'ruby'
2
+ require 'rake'
3
+ require 'rspec'
4
+ require 'abroad'
5
+ require 'yaml'
6
+
7
+ RSpec.configure do |config|
8
+ def camelize(str)
9
+ str.gsub(/(^\w|[-_]\w)/) { $1[-1].upcase }
10
+ end
11
+
12
+ shared_examples 'a fixture-based extractor' do |dir, namespace|
13
+ fixture_manifest = YAML.load_file(File.join(dir, 'fixtures.yml'))
14
+ fixture_dir = File.join(dir, 'fixtures')
15
+
16
+ fixture_manifest.each_pair do |extractor_name, expected_results|
17
+ describe extractor_name do
18
+ let(:extractor) do
19
+ Abroad.extractor(extractor_name)
20
+ end
21
+
22
+ expected_results.each_pair do |expected_file, expected_phrases|
23
+ it "extracts phrases correctly from #{expected_file}" do
24
+ source_file = File.join(fixture_dir, expected_file)
25
+
26
+ extractor.open(source_file).extract_each do |actual_key, actual_string|
27
+ expected_string_index = expected_phrases.find_index do |expected_phrase|
28
+ expected_phrase['key'] == actual_key
29
+ end
30
+
31
+ expected_phrase = expected_phrases[expected_string_index]
32
+ expect(expected_phrase).to_not be_nil
33
+ expect(expected_phrase['string']).to eq(actual_string)
34
+ expected_phrases.delete_at(expected_string_index)
35
+ end
36
+
37
+ expect(expected_phrases).to be_empty
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: abroad
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Cameron Dutro
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: htmlentities
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json-stream
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json-write-stream
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: xml-write-stream
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: yaml-write-stream
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.0'
97
+ description: A set of parsers and serializers for dealing with localization file formats.
98
+ email:
99
+ - camertron@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - README.md
105
+ - abroad.gemspec
106
+ - lib/abroad.rb
107
+ - lib/abroad/extractors.rb
108
+ - lib/abroad/extractors/extractor.rb
109
+ - lib/abroad/extractors/json.rb
110
+ - lib/abroad/extractors/json/json_extractor.rb
111
+ - lib/abroad/extractors/json/key_value_extractor.rb
112
+ - lib/abroad/extractors/xml.rb
113
+ - lib/abroad/extractors/xml/android_extractor.rb
114
+ - lib/abroad/extractors/xml/xml_extractor.rb
115
+ - lib/abroad/extractors/yaml.rb
116
+ - lib/abroad/extractors/yaml/dotted_key_extractor.rb
117
+ - lib/abroad/extractors/yaml/jruby_compat.rb
118
+ - lib/abroad/extractors/yaml/rails_extractor.rb
119
+ - lib/abroad/extractors/yaml/yaml_extractor.rb
120
+ - lib/abroad/serializers.rb
121
+ - lib/abroad/serializers/json.rb
122
+ - lib/abroad/serializers/json/json_serializer.rb
123
+ - lib/abroad/serializers/json/key_value_serializer.rb
124
+ - lib/abroad/serializers/serializer.rb
125
+ - lib/abroad/serializers/trie.rb
126
+ - lib/abroad/serializers/xml.rb
127
+ - lib/abroad/serializers/xml/android_serializer.rb
128
+ - lib/abroad/serializers/xml/xml_serializer.rb
129
+ - lib/abroad/serializers/yaml.rb
130
+ - lib/abroad/serializers/yaml/rails_serializer.rb
131
+ - lib/abroad/serializers/yaml/yaml_serializer.rb
132
+ - lib/abroad/version.rb
133
+ - lib/ext/htmlentities/android_xml_decoder.rb
134
+ - lib/ext/htmlentities/android_xml_encoder.rb
135
+ - spec/abroad_spec.rb
136
+ - spec/extractors/json/fixtures.yml
137
+ - spec/extractors/json/fixtures/arrays.json
138
+ - spec/extractors/json/fixtures/basic.json
139
+ - spec/extractors/json/fixtures/objects.json
140
+ - spec/extractors/json/json_extractor_spec.rb
141
+ - spec/extractors/xml/fixtures.yml
142
+ - spec/extractors/xml/fixtures/basic_arrays.xml
143
+ - spec/extractors/xml/fixtures/basic_plurals.xml
144
+ - spec/extractors/xml/fixtures/basic_strings.xml
145
+ - spec/extractors/xml/fixtures/entities.xml
146
+ - spec/extractors/xml/fixtures/markup.xml
147
+ - spec/extractors/xml/fixtures/newlines.xml
148
+ - spec/extractors/xml/fixtures/quotes.xml
149
+ - spec/extractors/xml/xml_extractor_spec.rb
150
+ - spec/extractors/yaml/fixtures.yml
151
+ - spec/extractors/yaml/fixtures/arrays.yml
152
+ - spec/extractors/yaml/fixtures/arrays_and_hashes.yml
153
+ - spec/extractors/yaml/fixtures/invalid_single_quote_escape.yml
154
+ - spec/extractors/yaml/fixtures/invalid_single_quote_escape_array.yml
155
+ - spec/extractors/yaml/fixtures/nesting.yml
156
+ - spec/extractors/yaml/fixtures/short.yml
157
+ - spec/extractors/yaml/jruby_compat_spec.rb
158
+ - spec/extractors/yaml/yaml_extractor_spec.rb
159
+ - spec/serializers/json/key_value_serializer_spec.rb
160
+ - spec/serializers/xml/android_serializer_spec.rb
161
+ - spec/serializers/yaml/rails_serializer_spec.rb
162
+ - spec/spec_helper.rb
163
+ homepage: https://github.com/camertron/abroad
164
+ licenses: []
165
+ metadata: {}
166
+ post_install_message:
167
+ rdoc_options: []
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ requirements: []
181
+ rubyforge_project:
182
+ rubygems_version: 2.2.3
183
+ signing_key:
184
+ specification_version: 4
185
+ summary: A set of parsers and serializers for dealing with localization file formats.
186
+ test_files: []