abroad 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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: []