PoParser 0.2.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +1 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile +11 -1
- data/README.md +49 -6
- data/lib/poparser/comment.rb +4 -0
- data/lib/poparser/constants.rb +13 -0
- data/lib/poparser/entry.rb +13 -5
- data/lib/poparser/header.rb +68 -0
- data/lib/poparser/message.rb +4 -0
- data/lib/poparser/po.rb +47 -25
- data/lib/poparser/tokenizer.rb +0 -2
- data/lib/poparser/version.rb +1 -1
- data/lib/poparser.rb +1 -0
- data/poparser.gemspec +1 -5
- data/spec/poparser/entry_spec.rb +6 -0
- data/spec/poparser/fixtures/header.po +6 -0
- data/spec/poparser/fixtures/header_error.po +13 -0
- data/spec/poparser/header_spec.rb +44 -0
- data/spec/poparser/po_spec.rb +32 -6
- data/spec/spec_helper.rb +3 -0
- metadata +12 -67
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 353e0d8587bb30e2c03053471cb8e81de7939893
|
4
|
+
data.tar.gz: db6dcd36fe50ad4d74ddd9c4de53a539e81fa73d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4364ee022ee6f07667c1171446e803ac79873bee046cdb0647b053e8905f00fa4e8e7f19cd9e1bf58a3356581aa6605aa00b9da096a19bef574fb15ff8d7dbf
|
7
|
+
data.tar.gz: c254de7917c3d1270486248e59411c942c46a5e178a4d0d338fbe6c126db06ad3bdd3efb1a36fac014466189191a063f12b64e9a9057434b17c56dab28fbf751
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## Version 1.0.0
|
2
|
+
|
3
|
+
* add support for header entry
|
4
|
+
* `add_entry` renamed to `add` and returns `self`
|
5
|
+
* besides percentages, inspect of `po` now returns each entry count too
|
6
|
+
* `po.add` now raises error if you try to add an unknown label
|
7
|
+
|
1
8
|
## Version 0.2.1
|
2
9
|
|
3
10
|
* Add search_in method.
|
data/Gemfile
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
|
3
|
+
group :test do
|
4
|
+
gem 'coveralls', :require => false
|
5
|
+
gem 'pry-byebug', :platforms => :ruby_20
|
6
|
+
gem 'rspec', [">= 2.14", "< 2.99"]
|
7
|
+
gem 'awesome_print'
|
8
|
+
end
|
9
|
+
|
10
|
+
group :development do
|
11
|
+
gem 'pry'
|
12
|
+
gem 'guard-rspec'
|
13
|
+
end
|
4
14
|
|
5
15
|
# Specify your gem's dependencies in poparser.gemspec
|
6
16
|
gemspec
|
data/README.md
CHANGED
@@ -37,8 +37,8 @@ The `parse` method returns a `PO` object which contains all `Entries`:
|
|
37
37
|
# get all entries
|
38
38
|
po.entries # or .all alias
|
39
39
|
|
40
|
-
#
|
41
|
-
# entries are just kept by program for later use and are
|
40
|
+
# including cached entries (started with "#~", these
|
41
|
+
# entries are just kept by program for later use and are
|
42
42
|
# not counted as active entries)
|
43
43
|
po.entries(true)
|
44
44
|
|
@@ -68,14 +68,29 @@ new_entry = {
|
|
68
68
|
msgstr: 'translated string'
|
69
69
|
}
|
70
70
|
|
71
|
-
po.
|
71
|
+
po.add(new_entry)
|
72
72
|
|
73
|
-
# There's also an alias for
|
73
|
+
# There's also an alias for add `<<`
|
74
74
|
po << new_entry
|
75
75
|
```
|
76
76
|
|
77
77
|
You can pass an array of hashes to `new_entry` and it will be added to `PO` file.
|
78
78
|
|
79
|
+
Adding plural string is the same:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
new_entry = {
|
83
|
+
translator_comment: 'comment',
|
84
|
+
refrence: 'refrence comment',
|
85
|
+
msgid_plural: 'untranslated',
|
86
|
+
'msgstr[0]': 'translated string',
|
87
|
+
'msgstr[1]': 'translated string'
|
88
|
+
}
|
89
|
+
|
90
|
+
```
|
91
|
+
|
92
|
+
Note: currently `PoParser` won't warn you if you add a `msgstr[0]` without `msgid_plural`, any `msgid` at all or even if index numbers in `msgstr[0]` are not in any logical order.
|
93
|
+
|
79
94
|
### Entry
|
80
95
|
|
81
96
|
Each entry can have following properties (for more information see [GNU PO file specification](https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html)):
|
@@ -98,6 +113,8 @@ msgctxt
|
|
98
113
|
The `PO` object contains many `Entry` objects. Number of methods are available to check state of the `Entry`:
|
99
114
|
|
100
115
|
```ruby
|
116
|
+
entry = po.entries[1]
|
117
|
+
|
101
118
|
entry.untranslated? # or .incomplete? alias
|
102
119
|
#=> false
|
103
120
|
entry.translated? # or .complete? alias
|
@@ -113,7 +130,7 @@ You can get or edit each of property of the `Entry`:
|
|
113
130
|
```ruby
|
114
131
|
entry.msgid.to_s
|
115
132
|
#=> "This is an msgid that needs to get translated"
|
116
|
-
entry.translate = "This entry is translated" # or msgstr
|
133
|
+
entry.translate = "This entry is translated" # or `msgstr=` alias
|
117
134
|
entry.msgstr.to_s
|
118
135
|
#=> "This entry is translated"
|
119
136
|
```
|
@@ -167,10 +184,36 @@ po.path = 'example2.po'
|
|
167
184
|
po.save_file
|
168
185
|
```
|
169
186
|
|
187
|
+
## Header
|
188
|
+
|
189
|
+
The first entry of every PO file is reserved for header which represent license and general information about translators and the po file itself. For more information visit the [GNU website](https://www.gnu.org/software/gettext/manual/html_node/Header-Entry.html#Header-Entry).
|
190
|
+
|
191
|
+
Get header with `header`!:
|
192
|
+
|
193
|
+
```ruby
|
194
|
+
po.header
|
195
|
+
```
|
196
|
+
|
197
|
+
You can get and set following variables from `header`:
|
198
|
+
|
199
|
+
```
|
200
|
+
pot_creation_date
|
201
|
+
po_revision_date
|
202
|
+
project_id
|
203
|
+
report_to
|
204
|
+
last_translator
|
205
|
+
team
|
206
|
+
language
|
207
|
+
charset
|
208
|
+
encoding
|
209
|
+
plural_forms
|
210
|
+
```
|
211
|
+
|
170
212
|
##To-Do
|
171
213
|
|
172
214
|
* Streaming support
|
173
|
-
*
|
215
|
+
* Update header after changing/saving po
|
216
|
+
* add `before_save` and `after_save` callbacks
|
174
217
|
|
175
218
|
## Contributing
|
176
219
|
|
data/lib/poparser/comment.rb
CHANGED
data/lib/poparser/constants.rb
CHANGED
@@ -16,4 +16,17 @@ module PoParser
|
|
16
16
|
}
|
17
17
|
|
18
18
|
LABELS = COMMENTS_LABELS.merge(ENTRIES_LABELS).keys
|
19
|
+
|
20
|
+
HEADER_LABELS = {
|
21
|
+
:pot_creation_date => "POT-Creation-Date",
|
22
|
+
:po_revision_date => "PO-Revision-Date",
|
23
|
+
:project_id => "Project-Id-Version",
|
24
|
+
:report_to => "Project-Id-Version",
|
25
|
+
:last_translator => "Last-Translator",
|
26
|
+
:team => "Language-Team",
|
27
|
+
:language => "Language",
|
28
|
+
:charset => "Content-Type",
|
29
|
+
:encoding => "Content-Transfer-Encoding",
|
30
|
+
:plural_forms => "Plural-Forms"
|
31
|
+
}
|
19
32
|
end
|
data/lib/poparser/entry.rb
CHANGED
@@ -9,6 +9,7 @@ module PoParser
|
|
9
9
|
|
10
10
|
# Set passed arguments
|
11
11
|
args.each do |name, value|
|
12
|
+
raise(ArgumentError, "Unknown label #{name}") if !valid_label? name
|
12
13
|
set_instance_variable(name, value)
|
13
14
|
end
|
14
15
|
|
@@ -21,14 +22,14 @@ module PoParser
|
|
21
22
|
|
22
23
|
# If entry doesn't have any msgid, it's probably a cached entry that is
|
23
24
|
# kept by the program for later use. These entries will usually start with: #~
|
24
|
-
#
|
25
|
+
#
|
25
26
|
# @return [Boolean]
|
26
27
|
def cached?
|
27
28
|
!@cached.nil?
|
28
29
|
end
|
29
30
|
|
30
31
|
# Checks if the entry is untraslated
|
31
|
-
#
|
32
|
+
#
|
32
33
|
# @return [Boolean]
|
33
34
|
def untranslated?
|
34
35
|
return false if cached? || fuzzy?
|
@@ -40,7 +41,7 @@ module PoParser
|
|
40
41
|
alias_method :incomplete? , :untranslated?
|
41
42
|
|
42
43
|
# Checks if the entry is translated
|
43
|
-
#
|
44
|
+
#
|
44
45
|
# @return [Boolean]
|
45
46
|
def translated?
|
46
47
|
return false if cached? || fuzzy?
|
@@ -49,14 +50,14 @@ module PoParser
|
|
49
50
|
alias_method :complete? , :translated?
|
50
51
|
|
51
52
|
# Checks if the entry is plural
|
52
|
-
#
|
53
|
+
#
|
53
54
|
# @return [Boolean]
|
54
55
|
def plural?
|
55
56
|
@msgid_plural != nil
|
56
57
|
end
|
57
58
|
|
58
59
|
# Checks if the entry is fuzzy
|
59
|
-
#
|
60
|
+
#
|
60
61
|
# @return [Boolean]
|
61
62
|
def fuzzy?
|
62
63
|
return false if cached?
|
@@ -113,6 +114,10 @@ module PoParser
|
|
113
114
|
lines.join
|
114
115
|
end
|
115
116
|
|
117
|
+
def inspect
|
118
|
+
to_s
|
119
|
+
end
|
120
|
+
|
116
121
|
private
|
117
122
|
|
118
123
|
def set_instance_variable(name, value)
|
@@ -156,5 +161,8 @@ module PoParser
|
|
156
161
|
end
|
157
162
|
end
|
158
163
|
|
164
|
+
def valid_label?(label)
|
165
|
+
!(label =~ /^msgstr\[[0-9]\]/).nil? || LABELS.include?(label)
|
166
|
+
end
|
159
167
|
end
|
160
168
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module PoParser
|
2
|
+
class Header
|
3
|
+
attr_reader :entry, :original_configs
|
4
|
+
attr_accessor :comments, :pot_creation_date, :po_revision_date, :project_id,
|
5
|
+
:report_to, :last_translator, :team, :language, :charset,
|
6
|
+
:encoding, :plural_forms
|
7
|
+
|
8
|
+
def initialize(entry)
|
9
|
+
@entry = entry
|
10
|
+
@comments = entry.translator_comment.to_s
|
11
|
+
@original_configs = convert_msgstr_to_hash(entry.msgstr)
|
12
|
+
|
13
|
+
HEADER_LABELS.each do |k, v|
|
14
|
+
instance_variable_set "@#{k.to_s}".to_sym, @original_configs[v]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def configs
|
19
|
+
hash = {}
|
20
|
+
HEADER_LABELS.each do |k, v|
|
21
|
+
hash[v] = instance_variable_get "@#{k}".to_sym
|
22
|
+
end
|
23
|
+
@original_configs.merge(hash)
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_h
|
27
|
+
@entry.to_h
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
string = []
|
32
|
+
@comments.each do |comment|
|
33
|
+
string << "# #{comment}".strip
|
34
|
+
end
|
35
|
+
string << "msgid \"\"\nmsgstr \"\""
|
36
|
+
configs.each do |k, v|
|
37
|
+
string << "#{k}: #{v}\n".dump
|
38
|
+
end
|
39
|
+
string.join("\n")
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def convert_msgstr_to_hash(msgstr)
|
44
|
+
options_array = msgstr.to_s.map do |options|
|
45
|
+
options.split(':', 2).each do |k|
|
46
|
+
k.strip!
|
47
|
+
k.chomp!
|
48
|
+
k.gsub!(/\\+n$/, '')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
Hash[merge_to_previous_string(options_array)]
|
52
|
+
end
|
53
|
+
|
54
|
+
# Sometimes long lines are wrapped into new lines, this function
|
55
|
+
# join them back
|
56
|
+
#
|
57
|
+
# [['a', 'b'], ['c']] #=> [['a', 'bc']]
|
58
|
+
def merge_to_previous_string(array)
|
59
|
+
array.each_with_index do |key, index|
|
60
|
+
if key.length == 1
|
61
|
+
array[index -1][1] += key[0]
|
62
|
+
array.delete_at(index)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
data/lib/poparser/message.rb
CHANGED
data/lib/poparser/po.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module PoParser
|
2
2
|
# Po class keeps all entries of a Po file
|
3
|
-
#
|
4
3
|
class Po
|
5
4
|
include Enumerable
|
5
|
+
attr_reader :header
|
6
6
|
attr_accessor :path
|
7
7
|
|
8
8
|
def initialize(args = {})
|
@@ -11,35 +11,34 @@ module PoParser
|
|
11
11
|
end
|
12
12
|
|
13
13
|
# add new entries to po file
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# @example
|
16
|
-
# entry = {
|
16
|
+
# entry = {
|
17
17
|
# translator_comment: 'comment',
|
18
18
|
# refrence: 'refrense comment',
|
19
19
|
# flag: 'fuzzy',
|
20
|
-
#
|
20
|
+
# msgid: 'translatable string',
|
21
21
|
# msgstr: 'translation'
|
22
22
|
# }
|
23
|
-
#
|
24
|
-
#
|
23
|
+
# add(entry)
|
24
|
+
#
|
25
25
|
# @param entry [Hash, Array] a hash of entry contents or an array of hashes
|
26
|
-
|
26
|
+
# @return [Po]
|
27
|
+
def add(entry)
|
27
28
|
if entry.kind_of? Hash
|
28
|
-
|
29
|
-
@entries.last
|
29
|
+
import_hash(entry)
|
30
30
|
elsif entry.kind_of? Array
|
31
|
-
entry
|
32
|
-
@entries << Entry.new(en)
|
33
|
-
end
|
31
|
+
import_array(entry)
|
34
32
|
else
|
35
33
|
raise ArgumentError, 'Must be a hash or an array of hashes'
|
36
34
|
end
|
35
|
+
self
|
37
36
|
end
|
38
|
-
alias_method :<<, :
|
37
|
+
alias_method :<<, :add
|
39
38
|
|
40
39
|
# Returns an array of all entries in po file
|
41
|
-
#
|
42
|
-
# @param include_cached [Boolean] Whether include cached entries or not
|
40
|
+
#
|
41
|
+
# @param include_cached [Boolean] Whether include cached entries or not
|
43
42
|
# @return [Array]
|
44
43
|
def entries(include_cached=false)
|
45
44
|
if include_cached
|
@@ -53,7 +52,7 @@ module PoParser
|
|
53
52
|
alias_method :all, :entries
|
54
53
|
|
55
54
|
# Finds all entries that are flaged as fuzzy
|
56
|
-
#
|
55
|
+
#
|
57
56
|
# @return [Array] an array of fuzzy entries
|
58
57
|
def fuzzy
|
59
58
|
find_all do |entry|
|
@@ -62,7 +61,7 @@ module PoParser
|
|
62
61
|
end
|
63
62
|
|
64
63
|
# Finds all entries that are untranslated
|
65
|
-
#
|
64
|
+
#
|
66
65
|
# @return [Array] an array of untranslated entries
|
67
66
|
def untranslated
|
68
67
|
find_all do |entry|
|
@@ -71,7 +70,7 @@ module PoParser
|
|
71
70
|
end
|
72
71
|
|
73
72
|
# Finds all entries that are translated
|
74
|
-
#
|
73
|
+
#
|
75
74
|
# @return [Array] an array of translated entries
|
76
75
|
def translated
|
77
76
|
find_all do |entry|
|
@@ -80,7 +79,7 @@ module PoParser
|
|
80
79
|
end
|
81
80
|
|
82
81
|
# Count of all entries without counting cached entries
|
83
|
-
#
|
82
|
+
#
|
84
83
|
# @return [String]
|
85
84
|
def size
|
86
85
|
entries.length
|
@@ -88,7 +87,7 @@ module PoParser
|
|
88
87
|
alias_method :length, :size
|
89
88
|
|
90
89
|
# Search for entries with provided string
|
91
|
-
#
|
90
|
+
#
|
92
91
|
# @param label [Symbol] One of the known LABELS
|
93
92
|
# @param string [String] String to search for
|
94
93
|
# @return [Array] Array of matched entries
|
@@ -104,7 +103,7 @@ module PoParser
|
|
104
103
|
end
|
105
104
|
|
106
105
|
# Shows statistics and status of the provided file in percentage.
|
107
|
-
#
|
106
|
+
#
|
108
107
|
# @return [Hash] a hash of translated, untranslated and fuzzy percentages
|
109
108
|
def stats
|
110
109
|
untranslated_size = untranslated.size
|
@@ -119,10 +118,11 @@ module PoParser
|
|
119
118
|
end
|
120
119
|
|
121
120
|
# Converts Po file to an hashes of entries
|
122
|
-
#
|
121
|
+
#
|
123
122
|
# @return [Array] array of hashes of entries
|
124
123
|
def to_h
|
125
124
|
array = []
|
125
|
+
array << @header.to_h if @header
|
126
126
|
@entries.each do |entry|
|
127
127
|
array << entry.to_h
|
128
128
|
end
|
@@ -130,10 +130,13 @@ module PoParser
|
|
130
130
|
end
|
131
131
|
|
132
132
|
# Shows a String representation of the Po file
|
133
|
-
#
|
133
|
+
#
|
134
134
|
# @return [String]
|
135
135
|
def to_s
|
136
136
|
array = []
|
137
|
+
array << @header.to_s if @header
|
138
|
+
# add a blank line after header
|
139
|
+
array << ""
|
137
140
|
@entries.each do |entry|
|
138
141
|
array << entry.to_s
|
139
142
|
end
|
@@ -155,16 +158,35 @@ module PoParser
|
|
155
158
|
end
|
156
159
|
|
157
160
|
def inspect
|
158
|
-
"<#{self.class.name}, Translated: #{stats[:translated]}% Untranslated: #{stats[:untranslated]}% Fuzzy: #{stats[:fuzzy]}
|
161
|
+
"<#{self.class.name}, Translated: #{translated.length}(#{stats[:translated]}%) Untranslated: #{untranslated.length}(#{stats[:untranslated]}%) Fuzzy: #{fuzzy.length}(#{stats[:fuzzy]}%)>"
|
159
162
|
end
|
160
163
|
|
161
164
|
private
|
162
165
|
# calculates percentages based on total number of entries
|
163
|
-
#
|
166
|
+
#
|
164
167
|
# @param [Integer] number of entries
|
165
168
|
# @return [Float] percentage of the provided entries
|
166
169
|
def percentage(count)
|
167
170
|
((count.to_f / self.size) * 100).round(1)
|
168
171
|
end
|
172
|
+
|
173
|
+
def import_hash(entry)
|
174
|
+
add_entry(entry)
|
175
|
+
end
|
176
|
+
|
177
|
+
def import_array(entry)
|
178
|
+
entry.each do |en|
|
179
|
+
add_entry(en)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def add_entry(entry)
|
184
|
+
if entry[:msgid] && entry[:msgid].length == 0
|
185
|
+
raise(RuntimeError, "Duplicate entry, header was already instantiated") if @header != nil
|
186
|
+
@header = Header.new(Entry.new(entry))
|
187
|
+
else
|
188
|
+
@entries << Entry.new(entry)
|
189
|
+
end
|
190
|
+
end
|
169
191
|
end
|
170
192
|
end
|
data/lib/poparser/tokenizer.rb
CHANGED
data/lib/poparser/version.rb
CHANGED
data/lib/poparser.rb
CHANGED
data/poparser.gemspec
CHANGED
@@ -22,10 +22,6 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_runtime_dependency "parslet", "~> 1.6"
|
23
23
|
|
24
24
|
# Development deps
|
25
|
-
spec.add_development_dependency "bundler", "~> 1.
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
26
26
|
spec.add_development_dependency "rake"
|
27
|
-
spec.add_development_dependency "rspec", [">= 2.14", "< 2.99"]
|
28
|
-
spec.add_development_dependency "guard-rspec"
|
29
|
-
spec.add_development_dependency "pry-debugger"
|
30
|
-
spec.add_development_dependency "awesome_print"
|
31
27
|
end
|
data/spec/poparser/entry_spec.rb
CHANGED
@@ -18,6 +18,12 @@ describe PoParser::Entry do
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
it 'should raise error if lable is unknown' do
|
22
|
+
expect {
|
23
|
+
PoParser::Entry.new({:msgstr => 'test', :blah_blah => 'error'})
|
24
|
+
}.to raise_error(ArgumentError, "Unknown label blah_blah")
|
25
|
+
end
|
26
|
+
|
21
27
|
it 'should show a hash presentation of a entry' do
|
22
28
|
@entry.msgid = 'string'
|
23
29
|
@entry.msgstr = 'reshte'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Arash Mousavi <mousavi.arash@gmail.com>, 2014.
|
2
|
+
#
|
3
|
+
msgid ""
|
4
|
+
msgstr ""
|
5
|
+
"Project-Id-Version: damned-lies master\n"
|
6
|
+
"Report-Msgid-Bugs-To: \n"
|
7
|
+
|
8
|
+
# Arash Mousavi <mousavi.arash@gmail.com>, 2014.
|
9
|
+
#
|
10
|
+
msgid ""
|
11
|
+
msgstr ""
|
12
|
+
"Project-Id-Version: damned-lies master\n"
|
13
|
+
"Report-Msgid-Bugs-To: \n"
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe PoParser::Header do
|
5
|
+
let(:entry) do
|
6
|
+
{translator_comment: ["Persian translation for gnome-shell-extensions.", "Copyright (C) 2011 Iranian Free Software Users Group (IFSUG.org) translation team.", "This file is distributed under the same license as the gnome-shell-extensions package.", "Arash Mousavi <mousavi.arash@gmail.com>, 2011, 2013, 2014.", ""],
|
7
|
+
msgstr: ["Project-Id-Version: gnome-shell-extensions gnome-3-0\\n", "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-", "shell&keywords=I18N+L10N&component=extensions\\n", "POT-Creation-Date: 2014-08-28 07:40+0000\\n", "PO-Revision-Date: 2014-08-28 19:59+0430\\n", "Last-Translator: Arash Mousavi <mousavi.arash@gmail.com>\\n", "Language-Team: Persian <>\\n", "Language: fa_IR\\n", "MIME-Version: 1.0\\n", "Content-Type: text/plain; charset=UTF-8\\n", "Content-Transfer-Encoding: 8bit\\n", "X-Poedit-SourceCharset: utf-8\\n", "X-Generator: Gtranslator 2.91.6\\n", "Plural-Forms: nplurals=1; plural=0;\\n"]}
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:comment) do
|
11
|
+
"Persian translation for gnome-shell-extensions.\nCopyright (C) 2011 Iranian Free Software Users Group (IFSUG.org) translation team.\nThis file is distributed under the same license as the gnome-shell-extensions package.\nArash Mousavi <mousavi.arash@gmail.com>, 2011, 2013, 2014.\n"
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:labels) {
|
15
|
+
[
|
16
|
+
:pot_creation_date, :po_revision_date, :project_id,
|
17
|
+
:report_to, :last_translator, :team, :language, :charset,
|
18
|
+
:encoding, :plural_forms
|
19
|
+
]
|
20
|
+
}
|
21
|
+
|
22
|
+
before {
|
23
|
+
@entry = PoParser::Entry.new(entry)
|
24
|
+
@header = PoParser::Header.new(@entry)
|
25
|
+
}
|
26
|
+
|
27
|
+
it 'should respond to labels' do
|
28
|
+
labels.each do |label|
|
29
|
+
@header.should respond_to label
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should convert configs to hash' do
|
34
|
+
expect(@header.original_configs).to eq(
|
35
|
+
{"Project-Id-Version"=>"gnome-shell-extensions gnome-3-0", "Report-Msgid-Bugs-To"=>"http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=extensions", "POT-Creation-Date"=>"2014-08-28 07:40+0000", "PO-Revision-Date"=>"2014-08-28 19:59+0430", "Last-Translator"=>"Arash Mousavi <mousavi.arash@gmail.com>", "Language-Team"=>"Persian <>", "Language"=>"fa_IR", "MIME-Version"=>"1.0", "Content-Type"=>"text/plain; charset=UTF-8", "Content-Transfer-Encoding"=>"8bit", "X-Poedit-SourceCharset"=>"utf-8", "X-Generator"=>"Gtranslator 2.91.6", "Plural-Forms"=>"nplurals=1; plural=0;"}
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'always should show the updated hash of configs' do
|
40
|
+
@header.language = 'en_US'
|
41
|
+
expect(@header.configs['Language']).to eq('en_US')
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
data/spec/poparser/po_spec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe PoParser::Po do
|
5
|
-
let (:entry) do
|
5
|
+
let (:entry) do
|
6
6
|
{
|
7
7
|
translator_comment: 'comment',
|
8
8
|
refrence: 'refrence comment',
|
@@ -10,19 +10,19 @@ describe PoParser::Po do
|
|
10
10
|
msgstr: 'translated string'
|
11
11
|
}
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
before(:each) do
|
15
15
|
@po = PoParser::Po.new
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'should be able to add an entry to Po' do
|
19
|
-
# << is an alias for Po#
|
20
|
-
expect(@po << entry).to be_a_kind_of PoParser::
|
19
|
+
# << is an alias for Po#add
|
20
|
+
expect(@po << entry).to be_a_kind_of PoParser::Po
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'should be able to add multiple entries' do
|
24
24
|
entries = [entry, entry.dup]
|
25
|
-
expect(@po << entries).to be_a_kind_of
|
25
|
+
expect(@po << entries).to be_a_kind_of PoParser::Po
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'returns all fuzzy entries' do
|
@@ -61,7 +61,7 @@ describe PoParser::Po do
|
|
61
61
|
|
62
62
|
it 'raises error if label is not valid' do
|
63
63
|
expect{
|
64
|
-
@po.search_in(:wrong, 'sth')
|
64
|
+
@po.search_in(:wrong, 'sth')
|
65
65
|
}.to raise_error(ArgumentError, 'Unknown key: wrong')
|
66
66
|
end
|
67
67
|
|
@@ -71,4 +71,30 @@ describe PoParser::Po do
|
|
71
71
|
expect(result[0].msgid.str).to eq('Invalid action. Someone probably posted another action just before you.')
|
72
72
|
end
|
73
73
|
end
|
74
|
+
|
75
|
+
context 'Header' do
|
76
|
+
before do
|
77
|
+
path = Pathname.new('spec/poparser/fixtures/header.po').realpath
|
78
|
+
@po = PoParser::Tokenizer.new.extract_entries(path)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should respond to header' do
|
82
|
+
expect(@po).to respond_to :header
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should recognize header' do
|
86
|
+
expect(@po.header).to be_a_kind_of PoParser::Header
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should have right content for header' do
|
90
|
+
expect(@po.header.comments).to eq(["Arash Mousavi <mousavi.arash@gmail.com>, 2014.", ""])
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'throws error if there\'re two header string' do
|
94
|
+
path = Pathname.new('spec/poparser/fixtures/header_error.po').realpath
|
95
|
+
expect{
|
96
|
+
@po = PoParser::Tokenizer.new.extract_entries(path)
|
97
|
+
}.to raise_error(RuntimeError, "Duplicate entry, header was already instantiated")
|
98
|
+
end
|
99
|
+
end
|
74
100
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: PoParser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arash Mousavi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parslet
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.6'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.6'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,68 +52,6 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rspec
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '2.14'
|
62
|
-
- - "<"
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: '2.99'
|
65
|
-
type: :development
|
66
|
-
prerelease: false
|
67
|
-
version_requirements: !ruby/object:Gem::Requirement
|
68
|
-
requirements:
|
69
|
-
- - ">="
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
version: '2.14'
|
72
|
-
- - "<"
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '2.99'
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
|
-
name: guard-rspec
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- - ">="
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version: '0'
|
82
|
-
type: :development
|
83
|
-
prerelease: false
|
84
|
-
version_requirements: !ruby/object:Gem::Requirement
|
85
|
-
requirements:
|
86
|
-
- - ">="
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '0'
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: pry-debugger
|
91
|
-
requirement: !ruby/object:Gem::Requirement
|
92
|
-
requirements:
|
93
|
-
- - ">="
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: '0'
|
96
|
-
type: :development
|
97
|
-
prerelease: false
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - ">="
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0'
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: awesome_print
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - ">="
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0'
|
110
|
-
type: :development
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - ">="
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: '0'
|
117
55
|
description: A PO file parser, editor and generator. PO files are translation files
|
118
56
|
generated by GNU/Gettext tool.
|
119
57
|
email:
|
@@ -135,6 +73,7 @@ files:
|
|
135
73
|
- lib/poparser/comment.rb
|
136
74
|
- lib/poparser/constants.rb
|
137
75
|
- lib/poparser/entry.rb
|
76
|
+
- lib/poparser/header.rb
|
138
77
|
- lib/poparser/message.rb
|
139
78
|
- lib/poparser/parser.rb
|
140
79
|
- lib/poparser/po.rb
|
@@ -144,10 +83,13 @@ files:
|
|
144
83
|
- poparser.gemspec
|
145
84
|
- spec/poparser/comment_spec.rb
|
146
85
|
- spec/poparser/entry_spec.rb
|
86
|
+
- spec/poparser/fixtures/header.po
|
87
|
+
- spec/poparser/fixtures/header_error.po
|
147
88
|
- spec/poparser/fixtures/multiline.po
|
148
89
|
- spec/poparser/fixtures/plural.po
|
149
90
|
- spec/poparser/fixtures/test.po
|
150
91
|
- spec/poparser/fixtures/tokenizer.po
|
92
|
+
- spec/poparser/header_spec.rb
|
151
93
|
- spec/poparser/message_spec.rb
|
152
94
|
- spec/poparser/parser_spec.rb
|
153
95
|
- spec/poparser/po_spec.rb
|
@@ -175,17 +117,20 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
117
|
version: '0'
|
176
118
|
requirements: []
|
177
119
|
rubyforge_project:
|
178
|
-
rubygems_version: 2.
|
120
|
+
rubygems_version: 2.4.1
|
179
121
|
signing_key:
|
180
122
|
specification_version: 4
|
181
123
|
summary: A PO file parser, editor and generator.
|
182
124
|
test_files:
|
183
125
|
- spec/poparser/comment_spec.rb
|
184
126
|
- spec/poparser/entry_spec.rb
|
127
|
+
- spec/poparser/fixtures/header.po
|
128
|
+
- spec/poparser/fixtures/header_error.po
|
185
129
|
- spec/poparser/fixtures/multiline.po
|
186
130
|
- spec/poparser/fixtures/plural.po
|
187
131
|
- spec/poparser/fixtures/test.po
|
188
132
|
- spec/poparser/fixtures/tokenizer.po
|
133
|
+
- spec/poparser/header_spec.rb
|
189
134
|
- spec/poparser/message_spec.rb
|
190
135
|
- spec/poparser/parser_spec.rb
|
191
136
|
- spec/poparser/po_spec.rb
|