polint 0.2.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d183c6f2819c7036fef793ace5644f76349b3f24
4
- data.tar.gz: e8a9bcda101105ce78e492790021fae4643cc015
3
+ metadata.gz: 230c13623db8e5c272c96404b565e76d1149e11b
4
+ data.tar.gz: 8d70271797b9a0342001833308874f11e8b24ed7
5
5
  SHA512:
6
- metadata.gz: 0dbb533fad098c6a220f317b8e88c910e2c80fa8fee04902b934c0f067b66d1f278b77c99319d1f3566d35329362ec5e30d22d14fada4e16b93706eb5b002ce4
7
- data.tar.gz: 14b55b4f3a1d6078fe003ff097d6a574c7a77a483b2bcc7d513d8654b565258c375715531c82ccc420753d3bb4e30cde10788986e2a57811bd259948d5c72772
6
+ metadata.gz: d7d72c3db3edbcc9d4bf52a18bcb316206361f0e28f0e8fcdd80e0f5d2e24ff5c59a48bb0e50546dc56218715d7c2c76a09cb6f5bf182c83ea1995fd78ff9f4f
7
+ data.tar.gz: 279c37ba16b2dfb3ba1eea26645c9a44a05002c10ba2f1ae9e628351c617e19413a04065f14302f026e21eac43fca42e0e26841c81c17fd5b9d468b510274a7c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- polint (0.1.0)
4
+ polint (0.2.1)
5
5
  parslet (~> 1.7, >= 1.7.1)
6
6
  term-ansicolor
7
7
 
data/lib/polint/parser.rb CHANGED
@@ -33,7 +33,8 @@ module Polint
33
33
  rule(:flag) { str(',') >> lwsp >> match(/[a-z\-]/).repeat(1).as(:flag) >> lwsp }
34
34
  rule(:flag_comment) { start_comment >> flag.repeat(1).as(:flags) >> endl }
35
35
  rule(:reference_comment) { start_comment >> str(':') >> lwsp >> match(/[^\n]/).repeat.as(:reference) >> endl }
36
- rule(:comment) { flag_comment | reference_comment }
36
+ rule(:unparsed_comment) { start_comment >> (match(/[^~]/) >> lwsp >> match(/[^\n]/).repeat).as(:comment) >> endl }
37
+ rule(:comment) { flag_comment | reference_comment | unparsed_comment }
37
38
  rule(:comments) { comment.repeat }
38
39
 
39
40
  rule(:msgid) { str('msgid') >> lwsp >> quoted_strings.as(:msgid) }
@@ -45,7 +46,11 @@ module Polint
45
46
  rule(:translation) { (comments >> msgid >> msgid_plural.maybe >> msgstr.repeat(1)).as(:translation) >> blank_line }
46
47
  rule(:translations) { translation.repeat }
47
48
 
48
- rule(:file) { (headers >> translations).as(:file) }
49
+ rule(:obsolete_line) { start_comment >> str('~') >> lwsp >> match(/[^\n]/).repeat >> endl }
50
+ rule(:obsolete_translation) { obsolete_line.repeat(1).as(:obsolete_translation) >> blank_line }
51
+ rule(:obsolete_translations) { obsolete_translation.repeat }
52
+
53
+ rule(:file) { (headers >> translations >> obsolete_translations).as(:file) }
49
54
  root(:file)
50
55
 
51
56
  end
@@ -16,12 +16,12 @@ module Polint
16
16
  { headers: items.to_h }
17
17
  end
18
18
 
19
- rule(msgid: sequence(:items)) { { msgid: { text: items.join("\n") } } }
20
- rule(msgid_plural: sequence(:items)) { { msgid_plural: { text: items.join("\n") } } }
19
+ rule(msgid: sequence(:items)) { { msgid: { text: items.join } } }
20
+ rule(msgid_plural: sequence(:items)) { { msgid_plural: { text: items.join } } }
21
21
  rule(msgstr: subtree(:items)) do
22
22
  msgstr = {}
23
23
  msgstr[:index] = items.shift[:index].to_i if items.first.is_a?(Hash)
24
- msgstr[:text] = items.join("\n")
24
+ msgstr[:text] = items.join
25
25
  { msgstr: msgstr }
26
26
  end
27
27
 
@@ -29,6 +29,7 @@ module Polint
29
29
  translation = {
30
30
  flags: [],
31
31
  references: [],
32
+ comments: [],
32
33
  msgid: {},
33
34
  msgid_plural: {},
34
35
  msgstrs: []
@@ -38,6 +39,7 @@ module Polint
38
39
  case k
39
40
  when :flags then translation[:flags] |= v
40
41
  when :reference then translation[:references] << v
42
+ when :comment then translation[:comments] << v
41
43
  when :msgid, :msgid_plural then translation[k] = v
42
44
  when :msgstr then translation[:msgstrs] << v
43
45
  end
@@ -1,3 +1,3 @@
1
1
  module Polint
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/polint.rb CHANGED
@@ -120,7 +120,7 @@ module Polint
120
120
  tree = Polint::Parser.new.parse(data)
121
121
  tree = Polint::Transform.new.apply(tree)
122
122
 
123
- die 'No Plural-Forms header found' unless tree[:headers].key?('Plural-Forms')
123
+ die "The PO file '#{@pofile}' has no Plural-Forms header, aborting." unless tree[:headers].key?('Plural-Forms')
124
124
  nplurals = tree[:headers]['Plural-Forms'][:nplurals]
125
125
 
126
126
  tree[:translations].each do |translation|
@@ -150,7 +150,7 @@ module Polint
150
150
  end
151
151
  end
152
152
  rescue Parslet::ParseFailed => e
153
- die e.cause.ascii_tree
153
+ die "The PO file '#{@pofile}' cannot be parsed, aborting.\n\n#{e.cause.ascii_tree}"
154
154
  end
155
155
 
156
156
  # Check for errors in a key/translation pair.
@@ -16,3 +16,9 @@ msgid "Hello World Plural"
16
16
  msgid_plural "Hello %{n} Worlds Plural"
17
17
  msgstr[0] "Hello World Plural"
18
18
  msgstr[1] "Hello %{n} Worlds Plural"
19
+
20
+ #~ msgid "Obsolete Translation"
21
+ #~ msgstr "Obsolete Translation"
22
+
23
+ #~ msgid "Another Obsolete Translation"
24
+ #~ msgstr "Another Obsolete Translation"
@@ -89,6 +89,30 @@ RSpec.describe Polint::Parser do
89
89
  end
90
90
  end
91
91
 
92
+ describe 'rule(:unparsed_comment)' do
93
+ let(:rule) { :unparsed_comment }
94
+
95
+ context 'when matching a translator comment' do
96
+ let(:line) { '# no semantics here' }
97
+ it { expect(tree).to eq comment: ' no semantics here' }
98
+ end
99
+
100
+ context 'when matching an extracted comment' do
101
+ let(:line) { '#. no semantics here' }
102
+ it { expect(tree).to eq comment: '. no semantics here' }
103
+ end
104
+
105
+ context 'when matching a previous translation comment' do
106
+ let(:line) { '#| no semantics here' }
107
+ it { expect(tree).to eq comment: '| no semantics here' }
108
+ end
109
+
110
+ context 'when matching an obsolete translation' do
111
+ let(:line) { '#~ obsolete things go here' }
112
+ it { expect{ tree }.to raise_error Parslet::ParseFailed }
113
+ end
114
+ end
115
+
92
116
  describe 'rule(:msgid)' do
93
117
  let(:rule) { :msgid }
94
118
 
@@ -255,4 +279,21 @@ RSpec.describe Polint::Parser do
255
279
  end
256
280
  end
257
281
 
282
+ describe 'rule(:obsolete_translation)' do
283
+ let(:rule) { :obsolete_translation }
284
+ let(:line) { lines.join("\n") }
285
+
286
+ context 'when matching a singular single-line msgstr with comments' do
287
+ let(:lines) {
288
+ [
289
+ '#~ msgid "Hello World"',
290
+ '#~ msgstr "Hello World"'
291
+ ]
292
+ }
293
+ it {
294
+ expect(tree).to eq obsolete_translation: line
295
+ }
296
+ end
297
+ end
298
+
258
299
  end
@@ -37,10 +37,11 @@ RSpec.describe Polint::Transform do
37
37
  { flags: [{ flag: 'fuzzy' }] },
38
38
  { reference: '../../some_file.rb:34' },
39
39
  { reference: '../../some_other_file.rb:283' },
40
- { msgid: [{ quoted_string: [] }, { quoted_string: 'Hello World' }, { quoted_string: 'Hello Again'}] },
41
- { msgid_plural: [{ quoted_string: [] }, { quoted_string: 'Hello %{n} Worlds' }, { quoted_string: 'Hello Again'}] },
42
- { msgstr: [{ index: '0' }, { quoted_string: [] }, { quoted_string: 'Hello World' }, { quoted_string: 'Hello Again'}] },
43
- { msgstr: [{ index: '1' }, { quoted_string: [] }, { quoted_string: 'Hello %{n} Worlds' }, { quoted_string: 'Hello Again'}] }
40
+ { comment: 'arbitrary text' },
41
+ { msgid: [{ quoted_string: [] }, { quoted_string: 'Hello World\\n' }, { quoted_string: 'Hello Again'}] },
42
+ { msgid_plural: [{ quoted_string: [] }, { quoted_string: 'Hello %{n} Worlds\\n' }, { quoted_string: 'Hello Again'}] },
43
+ { msgstr: [{ index: '0' }, { quoted_string: [] }, { quoted_string: 'Hello World\\n' }, { quoted_string: 'Hello Again'}] },
44
+ { msgstr: [{ index: '1' }, { quoted_string: [] }, { quoted_string: 'Hello %{n} Worlds\\n' }, { quoted_string: 'Hello Again'}] }
44
45
  ]
45
46
  }
46
47
  }
@@ -48,11 +49,12 @@ RSpec.describe Polint::Transform do
48
49
  expect(output).to eq translation: {
49
50
  flags: [:fuzzy],
50
51
  references: ['../../some_file.rb:34', '../../some_other_file.rb:283'],
51
- msgid: { text: "\nHello World\nHello Again" },
52
- msgid_plural: { text: "\nHello %{n} Worlds\nHello Again" },
52
+ comments: ['arbitrary text'],
53
+ msgid: { text: 'Hello World\\nHello Again' },
54
+ msgid_plural: { text: 'Hello %{n} Worlds\\nHello Again' },
53
55
  msgstrs: [
54
- { index: 0, text: "\nHello World\nHello Again" },
55
- { index: 1, text: "\nHello %{n} Worlds\nHello Again" }
56
+ { index: 0, text: 'Hello World\\nHello Again' },
57
+ { index: 1, text: 'Hello %{n} Worlds\\nHello Again' }
56
58
  ]
57
59
  }
58
60
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julien Letessier
@@ -152,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
152
152
  version: '0'
153
153
  requirements: []
154
154
  rubyforge_project:
155
- rubygems_version: 2.5.1
155
+ rubygems_version: 2.4.8
156
156
  signing_key:
157
157
  specification_version: 4
158
158
  summary: A linter for Uniforum PO files.