PoParser 0.2.2 → 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.
- 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
|