rosette-core 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +26 -0
  3. data/History.txt +3 -0
  4. data/README.md +94 -0
  5. data/Rakefile +18 -0
  6. data/lib/rosette/core.rb +110 -0
  7. data/lib/rosette/core/branch_utils.rb +152 -0
  8. data/lib/rosette/core/commands.rb +139 -0
  9. data/lib/rosette/core/commands/errors.rb +17 -0
  10. data/lib/rosette/core/commands/git/commit_command.rb +65 -0
  11. data/lib/rosette/core/commands/git/diff_base_command.rb +301 -0
  12. data/lib/rosette/core/commands/git/diff_command.rb +188 -0
  13. data/lib/rosette/core/commands/git/diff_entry.rb +44 -0
  14. data/lib/rosette/core/commands/git/fetch_command.rb +27 -0
  15. data/lib/rosette/core/commands/git/repo_snapshot_command.rb +40 -0
  16. data/lib/rosette/core/commands/git/show_command.rb +70 -0
  17. data/lib/rosette/core/commands/git/snapshot_command.rb +50 -0
  18. data/lib/rosette/core/commands/git/status_command.rb +128 -0
  19. data/lib/rosette/core/commands/git/with_non_merge_ref.rb +48 -0
  20. data/lib/rosette/core/commands/git/with_ref.rb +92 -0
  21. data/lib/rosette/core/commands/git/with_refs.rb +92 -0
  22. data/lib/rosette/core/commands/git/with_repo_name.rb +50 -0
  23. data/lib/rosette/core/commands/git/with_snapshots.rb +45 -0
  24. data/lib/rosette/core/commands/queuing/enqueue_commit_command.rb +37 -0
  25. data/lib/rosette/core/commands/queuing/requeue_commit_command.rb +46 -0
  26. data/lib/rosette/core/commands/translations/export_command.rb +257 -0
  27. data/lib/rosette/core/commands/translations/translation_lookup_command.rb +66 -0
  28. data/lib/rosette/core/commands/translations/with_locale.rb +47 -0
  29. data/lib/rosette/core/configurator.rb +160 -0
  30. data/lib/rosette/core/error_reporters/buffered_error_reporter.rb +96 -0
  31. data/lib/rosette/core/error_reporters/error_reporter.rb +31 -0
  32. data/lib/rosette/core/error_reporters/nil_error_reporter.rb +25 -0
  33. data/lib/rosette/core/error_reporters/printing_error_reporter.rb +58 -0
  34. data/lib/rosette/core/error_reporters/raising_error_reporter.rb +27 -0
  35. data/lib/rosette/core/errors.rb +93 -0
  36. data/lib/rosette/core/extractor/commit_log.rb +33 -0
  37. data/lib/rosette/core/extractor/commit_log_status.rb +57 -0
  38. data/lib/rosette/core/extractor/commit_processor.rb +109 -0
  39. data/lib/rosette/core/extractor/extractor.rb +72 -0
  40. data/lib/rosette/core/extractor/extractor_config.rb +74 -0
  41. data/lib/rosette/core/extractor/locale.rb +118 -0
  42. data/lib/rosette/core/extractor/phrase.rb +76 -0
  43. data/lib/rosette/core/extractor/phrase/phrase_index_policy.rb +108 -0
  44. data/lib/rosette/core/extractor/phrase/phrase_to_hash.rb +33 -0
  45. data/lib/rosette/core/extractor/repo_config.rb +339 -0
  46. data/lib/rosette/core/extractor/serializer_config.rb +55 -0
  47. data/lib/rosette/core/extractor/static_extractor.rb +44 -0
  48. data/lib/rosette/core/extractor/translation.rb +44 -0
  49. data/lib/rosette/core/extractor/translation/translation_to_hash.rb +28 -0
  50. data/lib/rosette/core/git/diff_finder.rb +131 -0
  51. data/lib/rosette/core/git/ref.rb +116 -0
  52. data/lib/rosette/core/git/repo.rb +378 -0
  53. data/lib/rosette/core/path_matcher_factory.rb +330 -0
  54. data/lib/rosette/core/resolvers/extractor_id.rb +37 -0
  55. data/lib/rosette/core/resolvers/integration_id.rb +37 -0
  56. data/lib/rosette/core/resolvers/preprocessor_id.rb +38 -0
  57. data/lib/rosette/core/resolvers/resolver.rb +115 -0
  58. data/lib/rosette/core/resolvers/serializer_id.rb +37 -0
  59. data/lib/rosette/core/snapshots/cached_head_snapshot_factory.rb +51 -0
  60. data/lib/rosette/core/snapshots/cached_snapshot_factory.rb +67 -0
  61. data/lib/rosette/core/snapshots/head_snapshot_factory.rb +58 -0
  62. data/lib/rosette/core/snapshots/repo_config_path_filter.rb +83 -0
  63. data/lib/rosette/core/snapshots/snapshot_factory.rb +184 -0
  64. data/lib/rosette/core/string_utils.rb +23 -0
  65. data/lib/rosette/core/translation_status.rb +81 -0
  66. data/lib/rosette/core/validators.rb +18 -0
  67. data/lib/rosette/core/validators/commit_validator.rb +62 -0
  68. data/lib/rosette/core/validators/commits_validator.rb +32 -0
  69. data/lib/rosette/core/validators/encoding_validator.rb +32 -0
  70. data/lib/rosette/core/validators/locale_validator.rb +37 -0
  71. data/lib/rosette/core/validators/repo_validator.rb +33 -0
  72. data/lib/rosette/core/validators/serializer_validator.rb +37 -0
  73. data/lib/rosette/core/validators/validator.rb +31 -0
  74. data/lib/rosette/core/version.rb +8 -0
  75. data/lib/rosette/data_stores.rb +11 -0
  76. data/lib/rosette/data_stores/errors.rb +26 -0
  77. data/lib/rosette/data_stores/phrase_status.rb +59 -0
  78. data/lib/rosette/integrations.rb +12 -0
  79. data/lib/rosette/integrations/errors.rb +15 -0
  80. data/lib/rosette/integrations/integratable.rb +58 -0
  81. data/lib/rosette/integrations/integration.rb +23 -0
  82. data/lib/rosette/preprocessors.rb +11 -0
  83. data/lib/rosette/preprocessors/errors.rb +14 -0
  84. data/lib/rosette/preprocessors/preprocessor.rb +48 -0
  85. data/lib/rosette/queuing.rb +14 -0
  86. data/lib/rosette/queuing/commits.rb +19 -0
  87. data/lib/rosette/queuing/commits/commit_conductor.rb +90 -0
  88. data/lib/rosette/queuing/commits/commit_job.rb +93 -0
  89. data/lib/rosette/queuing/commits/commits_queue_configurator.rb +60 -0
  90. data/lib/rosette/queuing/commits/extract_stage.rb +46 -0
  91. data/lib/rosette/queuing/commits/fetch_stage.rb +51 -0
  92. data/lib/rosette/queuing/commits/finalize_stage.rb +76 -0
  93. data/lib/rosette/queuing/commits/phrase_storage_granularity.rb +20 -0
  94. data/lib/rosette/queuing/commits/push_stage.rb +91 -0
  95. data/lib/rosette/queuing/commits/stage.rb +96 -0
  96. data/lib/rosette/queuing/job.rb +74 -0
  97. data/lib/rosette/queuing/queue.rb +28 -0
  98. data/lib/rosette/queuing/queue_configurator.rb +76 -0
  99. data/lib/rosette/queuing/worker.rb +30 -0
  100. data/lib/rosette/serializers.rb +10 -0
  101. data/lib/rosette/serializers/serializer.rb +98 -0
  102. data/lib/rosette/tms.rb +9 -0
  103. data/lib/rosette/tms/repository.rb +95 -0
  104. data/rosette-core.gemspec +24 -0
  105. data/spec/core/branch_utils_spec.rb +110 -0
  106. data/spec/core/commands/git/commit_command_spec.rb +60 -0
  107. data/spec/core/commands/git/diff_command_spec.rb +263 -0
  108. data/spec/core/commands/git/fetch_command_spec.rb +61 -0
  109. data/spec/core/commands/git/repo_snapshot_command_spec.rb +72 -0
  110. data/spec/core/commands/git/show_command_spec.rb +128 -0
  111. data/spec/core/commands/git/snapshot_command_spec.rb +86 -0
  112. data/spec/core/commands/git/status_command_spec.rb +154 -0
  113. data/spec/core/commands/queuing/enqueue_commit_command_spec.rb +34 -0
  114. data/spec/core/commands/queuing/requeue_commit_command_spec.rb +46 -0
  115. data/spec/core/commands/translations/export_command_spec.rb +113 -0
  116. data/spec/core/commands/translations/translation_lookup_command_spec.rb +58 -0
  117. data/spec/core/configurator_spec.rb +47 -0
  118. data/spec/core/error_reporters/buffered_error_reporter_spec.rb +61 -0
  119. data/spec/core/error_reporters/nil_error_reporter_spec.rb +16 -0
  120. data/spec/core/error_reporters/printing_error_reporter_spec.rb +60 -0
  121. data/spec/core/extractor/commit_log_status_spec.rb +216 -0
  122. data/spec/core/extractor/commit_processor_spec.rb +68 -0
  123. data/spec/core/extractor/extractor_config_spec.rb +47 -0
  124. data/spec/core/extractor/extractor_spec.rb +26 -0
  125. data/spec/core/extractor/locale_spec.rb +92 -0
  126. data/spec/core/extractor/phrase/phrase_index_policy_spec.rb +116 -0
  127. data/spec/core/extractor/phrase/phrase_to_hash_spec.rb +18 -0
  128. data/spec/core/extractor/repo_config_spec.rb +147 -0
  129. data/spec/core/extractor/translation/translation_to_hash_spec.rb +25 -0
  130. data/spec/core/git/diff_finder_spec.rb +74 -0
  131. data/spec/core/git/ref_spec.rb +118 -0
  132. data/spec/core/git/repo_spec.rb +216 -0
  133. data/spec/core/path_matcher_factory_spec.rb +139 -0
  134. data/spec/core/resolvers/extractor_id_spec.rb +47 -0
  135. data/spec/core/resolvers/integration_id_spec.rb +47 -0
  136. data/spec/core/resolvers/preprocessor_id_spec.rb +47 -0
  137. data/spec/core/resolvers/serializer_id_spec.rb +47 -0
  138. data/spec/core/snapshots/snapshot_factory_spec.rb +145 -0
  139. data/spec/core/string_utils_spec.rb +19 -0
  140. data/spec/core/translation_status_spec.rb +91 -0
  141. data/spec/core/validators/commit_validator_spec.rb +40 -0
  142. data/spec/core/validators/encoding_validator_spec.rb +30 -0
  143. data/spec/core/validators/locale_validator_spec.rb +31 -0
  144. data/spec/core/validators/repo_validator_spec.rb +30 -0
  145. data/spec/core/validators/serializer_validator_spec.rb +31 -0
  146. data/spec/integrations/integratable_spec.rb +58 -0
  147. data/spec/queuing/commits/commit_conductor_spec.rb +71 -0
  148. data/spec/queuing/commits/commit_job_spec.rb +87 -0
  149. data/spec/queuing/commits/extract_stage_spec.rb +68 -0
  150. data/spec/queuing/commits/fetch_stage_spec.rb +101 -0
  151. data/spec/queuing/commits/finalize_stage_spec.rb +88 -0
  152. data/spec/queuing/commits/push_stage_spec.rb +145 -0
  153. data/spec/queuing/commits/stage_spec.rb +80 -0
  154. data/spec/queuing/job_spec.rb +33 -0
  155. data/spec/queuing/queue_configurator_spec.rb +44 -0
  156. data/spec/spec_helper.rb +90 -0
  157. data/spec/test_helpers/fake_commit_stage.rb +17 -0
  158. metadata +257 -0
@@ -0,0 +1,68 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ include Rosette::Core
6
+
7
+ describe CommitProcessor do
8
+ let(:repo_name) { 'single_commit' }
9
+ let(:fixture) { load_repo_fixture(repo_name) }
10
+ let(:error_reporter) { BufferedErrorReporter.new }
11
+
12
+ let(:processor) do
13
+ CommitProcessor.new(fixture.config, error_reporter)
14
+ end
15
+
16
+ describe '#process_each_phrase' do
17
+ it 'extracts each phrase in the commit and returns an enum' do
18
+ fixture.each_commit do |fixture_commit|
19
+ processor.process_each_phrase(repo_name, fixture_commit.sha).tap do |phrase_enum|
20
+ expect(phrase_enum).to be_a(Enumerator)
21
+
22
+ phrase_enum.to_a.tap do |phrases|
23
+ expect(phrases.size).to eq(8)
24
+ phrases.each { |phrase| fixture_commit.remove(phrase) }
25
+ end
26
+ end
27
+
28
+ expect(fixture_commit).to_not have_more_phrases
29
+ expect(error_reporter.errors).to be_empty
30
+ end
31
+ end
32
+
33
+ it 'reports syntax errors if they occur' do
34
+ allow_any_instance_of(Rosette::Extractors::Test::TestExtractor).to(
35
+ receive(:each_function_call)
36
+ .with(anything)
37
+ .and_raise(
38
+ Rosette::Core::SyntaxError.new(
39
+ 'nope', StandardError.new('error'), :txt
40
+ )
41
+ )
42
+ )
43
+
44
+ fixture.each_commit do |fixture_commit|
45
+ processor.process_each_phrase(repo_name, fixture_commit.sha).to_a
46
+
47
+ error_reporter.errors.tap do |errors|
48
+ expect(errors.size).to eq(3)
49
+
50
+ errors.each do |error|
51
+ expect(error[:error].original_exception).to be_a(StandardError)
52
+ expect(error[:error].message).to eq(
53
+ "nope (txt): error (txt) in #{error[:error].file} at #{fixture_commit.sha}"
54
+ )
55
+ expect(error[:error].language).to eq(:txt)
56
+ expect(error[:error].commit_id).to eq(fixture_commit.sha)
57
+ end
58
+
59
+ expect(errors.map { |e| e[:error].file }.sort).to eq([
60
+ 'first_file.txt',
61
+ 'folder/second_file.txt',
62
+ 'folder/with_metakeys.txt'
63
+ ].sort)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,47 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ include Rosette::Core
6
+
7
+ describe ExtractorConfig do
8
+ let(:extractor_class) { Rosette::Extractors::Test::TestExtractor }
9
+ let(:extractor_id) { 'test/test' }
10
+
11
+ it 'instantiates the extractor given' do
12
+ ExtractorConfig.new(extractor_id, extractor_class).tap do |config|
13
+ expect(config.extractor).to be_instance_of(extractor_class)
14
+ expect(config.extractor_id).to eq(extractor_id)
15
+ end
16
+ end
17
+
18
+ it 'sets a default encoding' do
19
+ ExtractorConfig.new(extractor_id, extractor_class).tap do |config|
20
+ expect(config.encoding).to eq(Rosette::Core::DEFAULT_ENCODING)
21
+ end
22
+ end
23
+
24
+ describe '#set_encoding' do
25
+ let(:config) { ExtractorConfig.new(extractor_id, extractor_class) }
26
+
27
+ it 'sets the encoding on the instance' do
28
+ config.set_encoding(Encoding::UTF_16BE).tap do |config_with_encoding|
29
+ expect(config_with_encoding).to be(config)
30
+ expect(config_with_encoding.encoding).to eq(Encoding::UTF_16BE)
31
+ end
32
+ end
33
+ end
34
+
35
+ describe '#matches?' do
36
+ let(:config) { ExtractorConfig.new(extractor_id, extractor_class) }
37
+
38
+ it 'delegates #matches? to root' do
39
+ config.set_conditions do |cond|
40
+ cond.match_regex(/values-(ja|de)/)
41
+ end
42
+
43
+ expect(config.matches?('MyProject/stuff/values-ja')).to be_truthy
44
+ expect(config.matches?('MyProject/stuff/values-pt')).to be_falsey
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ include Rosette::Core
6
+
7
+ describe Extractor do
8
+ let(:extractor) do
9
+ Rosette::Extractors::Test::TestExtractor.new
10
+ end
11
+
12
+ describe '#extract_each_from' do
13
+ it 'extracts each line and line number from the text file and yields the results' do
14
+ extractor.extract_each_from("foo\nbar").tap do |extract_enum|
15
+ expect(extract_enum).to be_a(Enumerator)
16
+ extract_enum.to_a.tap do |phrases|
17
+ expect(phrases.size).to eq(2)
18
+ expect(phrases.all? { |phrase| phrase.first.is_a?(Phrase) }).to be(true)
19
+ expect(phrases.all? { |phrase| phrase.last.is_a?(Fixnum) }).to be(true) # line numbers
20
+ expect(phrases.first.first.key).to eq('foo')
21
+ expect(phrases.last.first.key).to eq('bar')
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,92 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ include Rosette::Core
6
+
7
+ describe Locale do
8
+ let(:locale) { Locale }
9
+
10
+ describe 'self.parse' do
11
+ it 'returns a locale object' do
12
+ expect(locale.parse('es_MX')).to be_a(Locale)
13
+ end
14
+
15
+ it "raises an error if the locale format isn't recognized" do
16
+ expect(lambda { locale.parse('es_MX', :foo) }).to(
17
+ raise_error(ArgumentError)
18
+ )
19
+ end
20
+ end
21
+ end
22
+
23
+ describe Bcp47Locale do
24
+ let(:locale) { Bcp47Locale }
25
+
26
+ describe 'self.parse' do
27
+ it 'returns a locale object with the correct language and territory' do
28
+ locale.parse('es_MX').tap do |locale|
29
+ expect(locale).to be_a(Bcp47Locale)
30
+ expect(locale.language).to eq('es')
31
+ expect(locale.territory).to eq('MX')
32
+ end
33
+ end
34
+
35
+ it 'returns a locale object with a blank territory when not specified' do
36
+ locale.parse('es').tap do |locale|
37
+ expect(locale).to be_a(Bcp47Locale)
38
+ expect(locale.language).to eq('es')
39
+ expect(locale.territory).to be_nil
40
+ end
41
+ end
42
+
43
+ it 'raises an error if the locale is invalid' do
44
+ expect(lambda { locale.parse('es_MXFGOA') }).to(
45
+ raise_error(InvalidLocaleError)
46
+ )
47
+ end
48
+ end
49
+
50
+ describe 'self.valid?' do
51
+ it 'ensures locale contains a 2 to 4 char language code' do
52
+ expect(locale.valid?('es')).to be_truthy
53
+ expect(locale.valid?('foobar')).to be_falsy
54
+ end
55
+
56
+ it 'validates the optional 2 to 5 character territory code' do
57
+ expect(locale.valid?('es_MX')).to be_truthy
58
+ expect(locale.valid?('es_MXFGOA')).to be_falsy
59
+ end
60
+
61
+ it 'allows both dashes and underscores to be used' do
62
+ expect(locale.valid?('es_MX')).to be_truthy
63
+ expect(locale.valid?('es-MX')).to be_truthy
64
+ end
65
+ end
66
+
67
+ describe '#code' do
68
+ it 'includes the language and territory' do
69
+ loc = locale.new('es', 'MX')
70
+ expect(loc.code).to eq('es-MX')
71
+ end
72
+
73
+ it "doesn't include the territory if nil" do
74
+ loc = locale.new('es')
75
+ expect(loc.code).to eq('es')
76
+ end
77
+ end
78
+
79
+ describe '#eql?' do
80
+ it 'equates two locales with the same language and territory' do
81
+ expect(locale.new('es', 'MX')).to eq(locale.new('es', 'mx'))
82
+ end
83
+
84
+ it 'does not equate two locales with different territories' do
85
+ expect(locale.new('es', 'MX')).to_not eq(locale.new('es', 'PE'))
86
+ end
87
+
88
+ it 'does not equate two locales with different languages' do
89
+ expect(locale.new('fr', 'CA')).to_not eq(locale.new('en', 'CA'))
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,116 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ include Rosette::Core
6
+
7
+ describe PhraseIndexPolicy do
8
+ class PhraseIndexPolicyTester
9
+ include PhraseIndexPolicy
10
+
11
+ attr_reader :key, :meta_key
12
+
13
+ def initialize
14
+ @key, @meta_key = nil, nil
15
+ end
16
+
17
+ def set_key(key)
18
+ @key = key
19
+ end
20
+
21
+ def set_meta_key(meta_key)
22
+ @meta_key = meta_key
23
+ end
24
+ end
25
+
26
+ let(:policy) { PhraseIndexPolicyTester }
27
+ let(:policy_instance) { policy.new }
28
+
29
+ describe '#index_key and #index_value' do
30
+ it 'returns :meta_key if the key is nil' do
31
+ policy_instance.set_meta_key('meta key')
32
+ expect(policy_instance.index_key).to eq(:meta_key)
33
+ expect(policy_instance.index_value).to eq('meta key')
34
+ end
35
+
36
+ it 'returns :key even if the key is emtpy (and the meta key is nil)' do
37
+ policy_instance.set_key('')
38
+ expect(policy_instance.index_key).to eq(:key)
39
+ expect(policy_instance.index_value).to eq('')
40
+ end
41
+
42
+ it 'returns :key if the meta key is nil' do
43
+ policy_instance.set_key('key')
44
+ expect(policy_instance.index_key).to eq(:key)
45
+ expect(policy_instance.index_value).to eq('key')
46
+ end
47
+
48
+ it 'returns :key if the meta key is empty' do
49
+ policy_instance.set_meta_key('')
50
+ expect(policy_instance.index_key).to eq(:key)
51
+ expect(policy_instance.index_value).to eq('')
52
+ end
53
+
54
+ it 'returns :meta_key if both key and meta key are not nil (or empty)' do
55
+ policy_instance.set_key('key')
56
+ policy_instance.set_meta_key('meta key')
57
+ expect(policy_instance.index_key).to eq(:meta_key)
58
+ expect(policy_instance.index_value).to eq('meta key')
59
+ end
60
+
61
+ it 'returns :key if both key and meta key are empty' do
62
+ policy_instance.set_key('')
63
+ policy_instance.set_meta_key('')
64
+ expect(policy_instance.index_key).to eq(:key)
65
+ expect(policy_instance.index_value).to eq('')
66
+ end
67
+
68
+ it 'returns :key if both key and meta key are nil' do
69
+ expect(policy_instance.index_key).to eq(:key)
70
+ expect(policy_instance.index_value).to eq('')
71
+ end
72
+
73
+ it 'converts nils to empty strings' do
74
+ expect(policy_instance.key).to be_nil
75
+ expect(policy_instance.index_key).to eq(:key)
76
+ expect(policy_instance.index_value).to eq('')
77
+ end
78
+ end
79
+
80
+ describe 'self.index_key and self.index_value' do
81
+ it 'returns :meta_key if the key is nil' do
82
+ expect(policy.index_key(nil, 'meta key')).to eq(:meta_key)
83
+ expect(policy.index_value(nil, 'meta key')).to eq('meta key')
84
+ end
85
+
86
+ it 'returns :key even if the key is emtpy (and the meta key is nil)' do
87
+ expect(policy.index_key('', nil)).to eq(:key)
88
+ expect(policy.index_value('', nil)).to eq('')
89
+ end
90
+
91
+ it 'returns :key if the meta key is nil' do
92
+ expect(policy.index_key('key', nil)).to eq(:key)
93
+ expect(policy.index_value('key', nil)).to eq('key')
94
+ end
95
+
96
+ it 'returns :key if the meta key is empty' do
97
+ expect(policy.index_key(nil, '')).to eq(:key)
98
+ expect(policy.index_value(nil, '')).to eq('')
99
+ end
100
+
101
+ it 'returns :meta_key if both key and meta key are not nil (or empty)' do
102
+ expect(policy.index_key('key', 'meta key')).to eq(:meta_key)
103
+ expect(policy.index_value('key', 'meta key')).to eq('meta key')
104
+ end
105
+
106
+ it 'returns :key if both key and meta key are empty' do
107
+ expect(policy.index_key('', '')).to eq(:key)
108
+ expect(policy.index_value('', '')).to eq('')
109
+ end
110
+
111
+ it 'returns :key if both key and meta key are nil (and converts nils to strings)' do
112
+ expect(policy.index_key(nil, nil)).to eq(:key)
113
+ expect(policy.index_value(nil, nil)).to eq('')
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ include Rosette::Core
6
+
7
+ describe PhraseToHash do
8
+ describe '#to_h' do
9
+ it 'returns a hash of the appropriate attributes' do
10
+ TestPhrase.new('key', 'meta key', 'file', 'commit id') do |t|
11
+ expect(t.to_h).to eq({
12
+ key: 'key', meta_key: 'meta key',
13
+ file: 'file', commit_id: 'commit id'
14
+ })
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,147 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ include Rosette::Core
6
+
7
+ describe RepoConfig do
8
+ let(:rosette_config) { nil }
9
+ let(:config) { RepoConfig.new('repo-name', rosette_config) }
10
+
11
+ describe '#set_path' do
12
+ it 'sets the repo path and instantiates a repo object inside the config' do
13
+ repo = TmpRepo.new
14
+ config.set_path(repo.working_dir.join('.git').to_s)
15
+ expect(config.repo).to be_a(Repo)
16
+ expect(config.repo.path).to eq(repo.working_dir.to_s)
17
+ expect(config.path).to eq(repo.working_dir.to_s)
18
+ repo.unlink
19
+ end
20
+ end
21
+
22
+ describe '#add_extractor' do
23
+ it 'creates an extractor config, yields it, and adds it to the list of extractor configs' do
24
+ expect(config.extractor_configs.size).to eq(0)
25
+
26
+ config.add_extractor('test/test') do |extractor_config|
27
+ expect(extractor_config).to be_a(ExtractorConfig)
28
+ end
29
+
30
+ expect(config.extractor_configs.size).to eq(1)
31
+
32
+ config.extractor_configs.first.tap do |config|
33
+ expect(config.extractor).to be_a(Rosette::Extractors::Test::TestExtractor)
34
+ end
35
+ end
36
+ end
37
+
38
+ describe '#add_serializer' do
39
+ it 'creates a serializer config and adds it to the list of serializer configs' do
40
+ expect(config.serializer_configs.size).to eq(0)
41
+ config.add_serializer('my_serializer', format: 'test/test')
42
+ expect(config.serializer_configs.size).to eq(1)
43
+
44
+ config.serializer_configs.first.tap do |serializer_config|
45
+ expect(serializer_config.klass).to eq(Rosette::Serializers::Test::TestSerializer)
46
+ expect(serializer_config.serializer_id).to eq('test/test')
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#add_locale' do
52
+ it 'parses the locale and adds it to the list of locales' do
53
+ expect(config.locales.size).to eq(0)
54
+ config.add_locale('es-MX')
55
+ expect(config.locales.size).to eq(1)
56
+
57
+ config.locales.first.tap do |locale|
58
+ expect(locale.language).to eq('es')
59
+ expect(locale.territory).to eq('MX')
60
+ end
61
+ end
62
+ end
63
+
64
+ describe '#add_locales' do
65
+ it 'parses all the locales and adds them to the list of locales' do
66
+ expect(config.locales.size).to eq(0)
67
+ config.add_locales(['es-MX', 'fr-CA'])
68
+ expect(config.locales.size).to eq(2)
69
+
70
+ config.locales.first.tap do |locale|
71
+ expect(locale.language).to eq('es')
72
+ expect(locale.territory).to eq('MX')
73
+ end
74
+
75
+ config.locales.last.tap do |locale|
76
+ expect(locale.language).to eq('fr')
77
+ expect(locale.territory).to eq('CA')
78
+ end
79
+ end
80
+ end
81
+
82
+ describe '#get_extractor_configs' do
83
+ before(:each) do
84
+ config.add_extractor('test/test') do |extractor_config|
85
+ extractor_config.set_conditions do |conditions|
86
+ conditions.match_file_extension('.js')
87
+ end
88
+ end
89
+ end
90
+
91
+ it 'returns all the extractor configs that match the given file extension' do
92
+ matching_configs = config.get_extractor_configs('foo/bar/baz.js')
93
+ expect(matching_configs.size).to eq(1)
94
+
95
+ matching_configs.first.tap do |extractor_config|
96
+ expect(extractor_config.extractor).to(
97
+ be_a(Rosette::Extractors::Test::TestExtractor)
98
+ )
99
+ end
100
+ end
101
+
102
+ it 'returns nil if no extractor can be found' do
103
+ expect(config.get_extractor_configs('foo/bar/baz.rb')).to be_empty
104
+ end
105
+ end
106
+
107
+ describe '#get_serializer_config' do
108
+ it 'returns the serializer config that matches the given id' do
109
+ config.add_serializer('my_serializer', format: 'test/test')
110
+ expect(config.get_serializer_config('test/test')).to(
111
+ be(config.serializer_configs.first)
112
+ )
113
+ end
114
+ end
115
+
116
+ describe '#get_locale' do
117
+ it 'returns the locale object for the given code' do
118
+ config.add_locales(['es-MX', 'fr-CA', 'zh-CN'])
119
+ config.get_locale('fr-CA').tap do |locale|
120
+ expect(locale).to be_a(Locale)
121
+ expect(locale.language).to eq('fr')
122
+ expect(locale.territory).to eq('CA')
123
+ end
124
+ end
125
+ end
126
+
127
+ describe '#use_tms' do
128
+ it 'looks the tms constant up by string' do
129
+ config.use_tms('test')
130
+ expect(config.tms).to be_a(Rosette::Tms::TestTms::Repository)
131
+ end
132
+
133
+ it 'accepts a constant instead of a string' do
134
+ config.use_tms(Rosette::Tms::TestTms)
135
+ expect(config.tms).to be_a(Rosette::Tms::TestTms::Repository)
136
+ end
137
+
138
+ it 'yields a configuration object' do
139
+ config.use_tms('test') do |configurator|
140
+ expect(configurator).to be_a(Rosette::Tms::TestTms::Configurator)
141
+ configurator.set_test_value('foobar')
142
+ end
143
+
144
+ expect(config.tms.configurator.test_value).to eq('foobar')
145
+ end
146
+ end
147
+ end