dotstrings 0.3.0 → 0.4.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/CHANGELOG.md +7 -0
- data/lib/dotstrings/file.rb +45 -0
- data/lib/dotstrings/item.rb +11 -0
- data/lib/dotstrings/version.rb +1 -1
- metadata +5 -54
- data/.editorconfig +0 -13
- data/.github/workflows/ci.yml +0 -33
- data/.gitignore +0 -5
- data/.rubocop.yml +0 -41
- data/Gemfile +0 -5
- data/Gemfile.lock +0 -57
- data/Rakefile +0 -10
- data/dotstrings.gemspec +0 -29
- data/test/fixtures/escaped_backslashes.strings +0 -2
- data/test/fixtures/escaped_carriage_returns.strings +0 -2
- data/test/fixtures/escaped_new_lines.strings +0 -2
- data/test/fixtures/escaped_nil.strings +0 -2
- data/test/fixtures/escaped_quotes.strings +0 -2
- data/test/fixtures/escaped_single_quotes.strings +0 -2
- data/test/fixtures/escaped_tabs.strings +0 -2
- data/test/fixtures/escaped_unicode.strings +0 -2
- data/test/fixtures/escaped_unicode~bad_surrogate_order.strings +0 -1
- data/test/fixtures/escaped_unicode~duplicated_high_surrogate.strings +0 -1
- data/test/fixtures/escaped_unicode~incomplete_surrogate_pair.strings +0 -1
- data/test/fixtures/escaped_unicode~non_surrogate_after_high_surrogate.strings +0 -1
- data/test/fixtures/utf16be_bom.strings +0 -0
- data/test/fixtures/utf16le_bom.strings +0 -0
- data/test/fixtures/utf8_bom.strings +0 -2
- data/test/fixtures/valid.strings +0 -8
- data/test/test_dotstrings.rb +0 -126
- data/test/test_file.rb +0 -116
- data/test/test_helper.rb +0 -10
- data/test/test_item.rb +0 -15
- data/test/test_parser.rb +0 -50
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9c320ba9bef4d63af10c9c9fd3d91ad41da99b3663538f0b89ebdc6fc780d31
|
4
|
+
data.tar.gz: 24e762927cd739f3475a8a550a751f808dd81d73292e47f7449c657edeaa88db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f24ad0efde29b52a33f28cd0e434970bde12556d9236c632495eebdfd089ed550e54a41f67fb844c70677c53bbdaccdbb93f593cafd535062532f062297ab7b4
|
7
|
+
data.tar.gz: d61a17f762188162a431c6289b96e23d4374ca2a29a82e84b58e92bf097d79746a352418859e12c2d1dcf13c8844a53a9975360be6c0a98f65d046c16aba45cc
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v0.4.0] - 2022-09-18
|
4
|
+
### Added
|
5
|
+
* Added `DotStrings::File#each`, `DotStrings::File#length`, `DotStrings::File#count`, and `DotStrings::File#empty?` methods.
|
6
|
+
* Allow comparing `DotStrings::File` objects.
|
7
|
+
|
3
8
|
## [v0.3.0] - 2022-08-07
|
4
9
|
### Changed
|
5
10
|
* Improved unicode code point parsing and validation.
|
@@ -19,6 +24,8 @@
|
|
19
24
|
### Added
|
20
25
|
* Initial release.
|
21
26
|
|
27
|
+
[v0.4.0]: https://github.com/raymondjavaxx/dotstrings/releases/tag/v0.4.0
|
28
|
+
[v0.3.0]: https://github.com/raymondjavaxx/dotstrings/releases/tag/v0.3.0
|
22
29
|
[v0.2.0]: https://github.com/raymondjavaxx/dotstrings/releases/tag/v0.2.0
|
23
30
|
[v0.1.1]: https://github.com/raymondjavaxx/dotstrings/releases/tag/v0.1.1
|
24
31
|
[v0.1.0]: https://github.com/raymondjavaxx/dotstrings/releases/tag/v0.1.0
|
data/lib/dotstrings/file.rb
CHANGED
@@ -131,6 +131,51 @@ module DotStrings
|
|
131
131
|
self
|
132
132
|
end
|
133
133
|
|
134
|
+
##
|
135
|
+
# Calls the given block once for each item in the file.
|
136
|
+
#
|
137
|
+
# @param block [Proc] The block to call.
|
138
|
+
# @example
|
139
|
+
# file.each do |item|
|
140
|
+
# puts "#{item.key} > #{item.value}"
|
141
|
+
# end
|
142
|
+
def each(&block)
|
143
|
+
@items.each(&block)
|
144
|
+
self
|
145
|
+
end
|
146
|
+
|
147
|
+
##
|
148
|
+
# Returns the number of items in the file.
|
149
|
+
def length
|
150
|
+
@items.length
|
151
|
+
end
|
152
|
+
|
153
|
+
##
|
154
|
+
# Returns the number of items in the file.
|
155
|
+
#
|
156
|
+
# If a block is given, it will count the number of items for which the block returns true.
|
157
|
+
#
|
158
|
+
# @example
|
159
|
+
# file.count # => 10
|
160
|
+
# file.count { |item| item.key.start_with?('button.') } # => 3
|
161
|
+
def count(&block)
|
162
|
+
@items.count(&block)
|
163
|
+
end
|
164
|
+
|
165
|
+
##
|
166
|
+
# Returns `true` if the file doen't contain any items.
|
167
|
+
def empty?
|
168
|
+
@items.empty?
|
169
|
+
end
|
170
|
+
|
171
|
+
def ==(other)
|
172
|
+
eql?(other)
|
173
|
+
end
|
174
|
+
|
175
|
+
def eql?(other)
|
176
|
+
other.is_a?(self.class) && @items.eql?(other.items)
|
177
|
+
end
|
178
|
+
|
134
179
|
##
|
135
180
|
# Serializes the file to a string.
|
136
181
|
#
|
data/lib/dotstrings/item.rb
CHANGED
@@ -12,6 +12,17 @@ module DotStrings
|
|
12
12
|
@value = value
|
13
13
|
end
|
14
14
|
|
15
|
+
def ==(other)
|
16
|
+
eql?(other)
|
17
|
+
end
|
18
|
+
|
19
|
+
def eql?(other)
|
20
|
+
other.is_a?(Item) &&
|
21
|
+
comment == other.comment &&
|
22
|
+
key == other.key &&
|
23
|
+
value == other.value
|
24
|
+
end
|
25
|
+
|
15
26
|
##
|
16
27
|
# Serializes the item to string.
|
17
28
|
#
|
data/lib/dotstrings/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dotstrings
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ramon Torres
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -116,44 +116,15 @@ executables: []
|
|
116
116
|
extensions: []
|
117
117
|
extra_rdoc_files: []
|
118
118
|
files:
|
119
|
-
- ".editorconfig"
|
120
|
-
- ".github/workflows/ci.yml"
|
121
|
-
- ".gitignore"
|
122
|
-
- ".rubocop.yml"
|
123
119
|
- CHANGELOG.md
|
124
|
-
- Gemfile
|
125
|
-
- Gemfile.lock
|
126
120
|
- LICENSE
|
127
121
|
- README.md
|
128
|
-
- Rakefile
|
129
|
-
- dotstrings.gemspec
|
130
122
|
- lib/dotstrings.rb
|
131
123
|
- lib/dotstrings/errors.rb
|
132
124
|
- lib/dotstrings/file.rb
|
133
125
|
- lib/dotstrings/item.rb
|
134
126
|
- lib/dotstrings/parser.rb
|
135
127
|
- lib/dotstrings/version.rb
|
136
|
-
- test/fixtures/escaped_backslashes.strings
|
137
|
-
- test/fixtures/escaped_carriage_returns.strings
|
138
|
-
- test/fixtures/escaped_new_lines.strings
|
139
|
-
- test/fixtures/escaped_nil.strings
|
140
|
-
- test/fixtures/escaped_quotes.strings
|
141
|
-
- test/fixtures/escaped_single_quotes.strings
|
142
|
-
- test/fixtures/escaped_tabs.strings
|
143
|
-
- test/fixtures/escaped_unicode.strings
|
144
|
-
- test/fixtures/escaped_unicode~bad_surrogate_order.strings
|
145
|
-
- test/fixtures/escaped_unicode~duplicated_high_surrogate.strings
|
146
|
-
- test/fixtures/escaped_unicode~incomplete_surrogate_pair.strings
|
147
|
-
- test/fixtures/escaped_unicode~non_surrogate_after_high_surrogate.strings
|
148
|
-
- test/fixtures/utf16be_bom.strings
|
149
|
-
- test/fixtures/utf16le_bom.strings
|
150
|
-
- test/fixtures/utf8_bom.strings
|
151
|
-
- test/fixtures/valid.strings
|
152
|
-
- test/test_dotstrings.rb
|
153
|
-
- test/test_file.rb
|
154
|
-
- test/test_helper.rb
|
155
|
-
- test/test_item.rb
|
156
|
-
- test/test_parser.rb
|
157
128
|
homepage: https://github.com/raymondjavaxx/dotstrings
|
158
129
|
licenses:
|
159
130
|
- MIT
|
@@ -174,29 +145,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
174
145
|
- !ruby/object:Gem::Version
|
175
146
|
version: '0'
|
176
147
|
requirements: []
|
177
|
-
|
148
|
+
rubyforge_project:
|
149
|
+
rubygems_version: 2.7.6
|
178
150
|
signing_key:
|
179
151
|
specification_version: 4
|
180
152
|
summary: Parse and create .strings files used in localization of iOS and macOS apps.
|
181
|
-
test_files:
|
182
|
-
- test/fixtures/escaped_backslashes.strings
|
183
|
-
- test/fixtures/escaped_carriage_returns.strings
|
184
|
-
- test/fixtures/escaped_new_lines.strings
|
185
|
-
- test/fixtures/escaped_nil.strings
|
186
|
-
- test/fixtures/escaped_quotes.strings
|
187
|
-
- test/fixtures/escaped_single_quotes.strings
|
188
|
-
- test/fixtures/escaped_tabs.strings
|
189
|
-
- test/fixtures/escaped_unicode.strings
|
190
|
-
- test/fixtures/escaped_unicode~bad_surrogate_order.strings
|
191
|
-
- test/fixtures/escaped_unicode~duplicated_high_surrogate.strings
|
192
|
-
- test/fixtures/escaped_unicode~incomplete_surrogate_pair.strings
|
193
|
-
- test/fixtures/escaped_unicode~non_surrogate_after_high_surrogate.strings
|
194
|
-
- test/fixtures/utf16be_bom.strings
|
195
|
-
- test/fixtures/utf16le_bom.strings
|
196
|
-
- test/fixtures/utf8_bom.strings
|
197
|
-
- test/fixtures/valid.strings
|
198
|
-
- test/test_dotstrings.rb
|
199
|
-
- test/test_file.rb
|
200
|
-
- test/test_helper.rb
|
201
|
-
- test/test_item.rb
|
202
|
-
- test/test_parser.rb
|
153
|
+
test_files: []
|
data/.editorconfig
DELETED
data/.github/workflows/ci.yml
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
name: CI
|
2
|
-
|
3
|
-
on:
|
4
|
-
push:
|
5
|
-
branches: "*"
|
6
|
-
pull_request:
|
7
|
-
branches: "*"
|
8
|
-
|
9
|
-
jobs:
|
10
|
-
test:
|
11
|
-
runs-on: ubuntu-latest
|
12
|
-
strategy:
|
13
|
-
matrix:
|
14
|
-
ruby-version:
|
15
|
-
- "2.5"
|
16
|
-
- "2.6"
|
17
|
-
- "2.7"
|
18
|
-
- "3.0"
|
19
|
-
- "3.1"
|
20
|
-
|
21
|
-
steps:
|
22
|
-
- uses: actions/checkout@v2
|
23
|
-
- name: Set up Ruby
|
24
|
-
uses: ruby/setup-ruby@v1
|
25
|
-
with:
|
26
|
-
ruby-version: ${{ matrix.ruby-version }}
|
27
|
-
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
28
|
-
- name: Lint
|
29
|
-
run: bundle exec rake rubocop
|
30
|
-
- name: Run tests
|
31
|
-
run: bundle exec rake
|
32
|
-
- name: Install
|
33
|
-
run: bundle exec rake install
|
data/.rubocop.yml
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require:
|
2
|
-
- rubocop-rake
|
3
|
-
- rubocop-minitest
|
4
|
-
|
5
|
-
AllCops:
|
6
|
-
TargetRubyVersion: 2.5
|
7
|
-
NewCops: enable
|
8
|
-
|
9
|
-
Style/StringLiterals:
|
10
|
-
Enabled: true
|
11
|
-
EnforcedStyle: single_quotes
|
12
|
-
|
13
|
-
Layout/FirstHashElementIndentation:
|
14
|
-
Enabled: true
|
15
|
-
EnforcedStyle: consistent
|
16
|
-
|
17
|
-
Layout/FirstArrayElementIndentation:
|
18
|
-
Enabled: true
|
19
|
-
EnforcedStyle: consistent
|
20
|
-
|
21
|
-
Metrics/ClassLength:
|
22
|
-
Enabled: true
|
23
|
-
Max: 150
|
24
|
-
|
25
|
-
Naming/MethodParameterName:
|
26
|
-
Enabled: false
|
27
|
-
|
28
|
-
Metrics/MethodLength:
|
29
|
-
Enabled: false
|
30
|
-
|
31
|
-
Metrics/AbcSize:
|
32
|
-
Enabled: false
|
33
|
-
|
34
|
-
Style/Documentation:
|
35
|
-
Enabled: false
|
36
|
-
|
37
|
-
Style/ParallelAssignment:
|
38
|
-
Enabled: false
|
39
|
-
|
40
|
-
Minitest/AssertInDelta:
|
41
|
-
Enabled: false
|
data/Gemfile
DELETED
data/Gemfile.lock
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
dotstrings (0.3.0)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: https://rubygems.org/
|
8
|
-
specs:
|
9
|
-
ast (2.4.2)
|
10
|
-
docile (1.4.0)
|
11
|
-
minitest (5.15.0)
|
12
|
-
parallel (1.22.1)
|
13
|
-
parser (3.1.2.0)
|
14
|
-
ast (~> 2.4.1)
|
15
|
-
rainbow (3.1.1)
|
16
|
-
rake (13.0.6)
|
17
|
-
regexp_parser (2.5.0)
|
18
|
-
rexml (3.2.5)
|
19
|
-
rubocop (1.28.2)
|
20
|
-
parallel (~> 1.10)
|
21
|
-
parser (>= 3.1.0.0)
|
22
|
-
rainbow (>= 2.2.2, < 4.0)
|
23
|
-
regexp_parser (>= 1.8, < 3.0)
|
24
|
-
rexml
|
25
|
-
rubocop-ast (>= 1.17.0, < 2.0)
|
26
|
-
ruby-progressbar (~> 1.7)
|
27
|
-
unicode-display_width (>= 1.4.0, < 3.0)
|
28
|
-
rubocop-ast (1.17.0)
|
29
|
-
parser (>= 3.1.1.0)
|
30
|
-
rubocop-minitest (0.19.1)
|
31
|
-
rubocop (>= 0.90, < 2.0)
|
32
|
-
rubocop-rake (0.6.0)
|
33
|
-
rubocop (~> 1.0)
|
34
|
-
ruby-progressbar (1.11.0)
|
35
|
-
simplecov (0.21.2)
|
36
|
-
docile (~> 1.1)
|
37
|
-
simplecov-html (~> 0.11)
|
38
|
-
simplecov_json_formatter (~> 0.1)
|
39
|
-
simplecov-html (0.12.3)
|
40
|
-
simplecov_json_formatter (0.1.4)
|
41
|
-
unicode-display_width (2.2.0)
|
42
|
-
|
43
|
-
PLATFORMS
|
44
|
-
ruby
|
45
|
-
|
46
|
-
DEPENDENCIES
|
47
|
-
bundler
|
48
|
-
dotstrings!
|
49
|
-
minitest (~> 5.14)
|
50
|
-
rake
|
51
|
-
rubocop
|
52
|
-
rubocop-minitest
|
53
|
-
rubocop-rake
|
54
|
-
simplecov
|
55
|
-
|
56
|
-
BUNDLED WITH
|
57
|
-
2.2.18
|
data/Rakefile
DELETED
data/dotstrings.gemspec
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require './lib/dotstrings/version'
|
4
|
-
|
5
|
-
Gem::Specification.new do |s|
|
6
|
-
s.name = 'dotstrings'
|
7
|
-
s.version = DotStrings::VERSION
|
8
|
-
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ['Ramon Torres']
|
10
|
-
s.email = ['raymondjavaxx@gmail.com']
|
11
|
-
s.homepage = 'https://github.com/raymondjavaxx/dotstrings'
|
12
|
-
s.description = s.summary = 'Parse and create .strings files used in localization of iOS and macOS apps.'
|
13
|
-
s.files = `git ls-files`.split("\n")
|
14
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
16
|
-
s.require_paths = ['lib']
|
17
|
-
s.license = 'MIT'
|
18
|
-
|
19
|
-
s.add_development_dependency 'bundler'
|
20
|
-
s.add_development_dependency 'minitest', '~> 5.14'
|
21
|
-
s.add_development_dependency 'rake'
|
22
|
-
s.add_development_dependency 'rubocop'
|
23
|
-
s.add_development_dependency 'rubocop-minitest'
|
24
|
-
s.add_development_dependency 'rubocop-rake'
|
25
|
-
s.add_development_dependency 'simplecov'
|
26
|
-
|
27
|
-
s.required_ruby_version = '>= 2.5.0'
|
28
|
-
s.metadata['rubygems_mfa_required'] = 'true'
|
29
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
"key" = "\UDC7B\UD83D";
|
@@ -1 +0,0 @@
|
|
1
|
-
"key" = "\UD83D\UD83D";
|
@@ -1 +0,0 @@
|
|
1
|
-
"key" = "\UD83D";
|
@@ -1 +0,0 @@
|
|
1
|
-
"key" = "\UD83D\U26A1";
|
Binary file
|
Binary file
|
data/test/fixtures/valid.strings
DELETED
data/test/test_dotstrings.rb
DELETED
@@ -1,126 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'test_helper'
|
4
|
-
|
5
|
-
class TestDotStrings < MiniTest::Test
|
6
|
-
def test_parse_can_parse_valid_files
|
7
|
-
file = DotStrings.parse_file('test/fixtures/valid.strings')
|
8
|
-
|
9
|
-
assert_equal 3, file.items.size
|
10
|
-
|
11
|
-
assert_equal 'Single line comment', file.items[0].comment
|
12
|
-
assert_equal 'key 1', file.items[0].key
|
13
|
-
assert_equal 'value 1', file.items[0].value
|
14
|
-
|
15
|
-
assert_equal "Multi line\ncomment", file.items[1].comment
|
16
|
-
assert_equal 'key 2', file.items[1].key
|
17
|
-
assert_equal 'value 2', file.items[1].value
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_can_parse_file_with_escaped_quotes
|
21
|
-
file = DotStrings.parse_file('test/fixtures/escaped_quotes.strings')
|
22
|
-
|
23
|
-
assert_equal 1, file.items.size
|
24
|
-
assert_equal 'some "key"', file.items[0].key
|
25
|
-
assert_equal 'some "value"', file.items[0].value
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_can_parse_file_with_escaped_single_quotes
|
29
|
-
file = DotStrings.parse_file('test/fixtures/escaped_single_quotes.strings')
|
30
|
-
|
31
|
-
assert_equal 1, file.items.size
|
32
|
-
assert_equal 'some \'key\'', file.items[0].key
|
33
|
-
assert_equal 'some \'value\'', file.items[0].value
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_can_parse_file_with_escaped_tabs
|
37
|
-
file = DotStrings.parse_file('test/fixtures/escaped_tabs.strings')
|
38
|
-
|
39
|
-
assert_equal 1, file.items.size
|
40
|
-
assert_equal "some\tkey", file.items[0].key
|
41
|
-
assert_equal "some\tvalue", file.items[0].value
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_can_parse_files_with_escaped_carriage_returns
|
45
|
-
file = DotStrings.parse_file('test/fixtures/escaped_carriage_returns.strings')
|
46
|
-
|
47
|
-
assert_equal 1, file.items.size
|
48
|
-
assert_equal "some\rkey", file.items[0].key
|
49
|
-
assert_equal "some\rvalue", file.items[0].value
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_can_parse_files_with_escaped_nil
|
53
|
-
file = DotStrings.parse_file('test/fixtures/escaped_nil.strings')
|
54
|
-
|
55
|
-
assert_equal 1, file.items.size
|
56
|
-
assert_equal "key\0", file.items[0].key
|
57
|
-
assert_equal "value\0", file.items[0].value
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_can_parse_files_with_escaped_new_lines
|
61
|
-
file = DotStrings.parse_file('test/fixtures/escaped_new_lines.strings')
|
62
|
-
|
63
|
-
assert_equal 1, file.items.size
|
64
|
-
assert_equal "some\nkey", file.items[0].key
|
65
|
-
assert_equal "some\nvalue", file.items[0].value
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_can_parse_files_with_escaped_backslashes
|
69
|
-
file = DotStrings.parse_file('test/fixtures/escaped_backslashes.strings')
|
70
|
-
|
71
|
-
assert_equal 1, file.items.size
|
72
|
-
assert_equal 'some\\key', file.items[0].key
|
73
|
-
assert_equal 'some\\value', file.items[0].value
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_can_parse_files_with_escaped_unicode
|
77
|
-
file = DotStrings.parse_file('test/fixtures/escaped_unicode.strings')
|
78
|
-
|
79
|
-
assert_equal 1, file.items.size
|
80
|
-
assert_equal '$', file.items[0].key
|
81
|
-
assert_equal '⚡👻', file.items[0].value
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_raises_error_when_bad_surrogate_pair_is_found
|
85
|
-
# rubocop:disable Layout/LineLength
|
86
|
-
test_cases = {
|
87
|
-
'escaped_unicode~bad_surrogate_order.strings' => 'Found a low surrogate code point before a high surrogate at line 1, column 15 (offset: 14)',
|
88
|
-
'escaped_unicode~duplicated_high_surrogate.strings' => 'Found a high surrogate code point after another high surrogate at line 1, column 21 (offset: 20)',
|
89
|
-
'escaped_unicode~incomplete_surrogate_pair.strings' => 'Unexpected character \'"\', expecting another unicode codepoint at line 1, column 16 (offset: 15)',
|
90
|
-
'escaped_unicode~non_surrogate_after_high_surrogate.strings' => 'Invalid unicode codepoint \'\U26A1\' after a high surrogate code point at line 1, column 21 (offset: 20)'
|
91
|
-
}
|
92
|
-
# rubocop:enable Layout/LineLength
|
93
|
-
|
94
|
-
test_cases.each do |filename, error_message|
|
95
|
-
error = assert_raises DotStrings::ParsingError do
|
96
|
-
DotStrings.parse_file("test/fixtures/#{filename}")
|
97
|
-
end
|
98
|
-
|
99
|
-
assert_equal error_message, error.message
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def test_can_parse_utf16le_files_with_bom
|
104
|
-
file = DotStrings.parse_file('test/fixtures/utf16le_bom.strings')
|
105
|
-
|
106
|
-
assert_equal 1, file.items.size
|
107
|
-
assert_equal 'key', file.items[0].key
|
108
|
-
assert_equal 'value', file.items[0].value
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_can_parse_utf16be_files_with_bom
|
112
|
-
file = DotStrings.parse_file('test/fixtures/utf16be_bom.strings')
|
113
|
-
|
114
|
-
assert_equal 1, file.items.size
|
115
|
-
assert_equal 'key', file.items[0].key
|
116
|
-
assert_equal 'value', file.items[0].value
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_can_parse_utf8_files_with_bom
|
120
|
-
file = DotStrings.parse_file('test/fixtures/utf8_bom.strings')
|
121
|
-
|
122
|
-
assert_equal 1, file.items.size
|
123
|
-
assert_equal 'key', file.items[0].key
|
124
|
-
assert_equal 'value', file.items[0].value
|
125
|
-
end
|
126
|
-
end
|
data/test/test_file.rb
DELETED
@@ -1,116 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'test_helper'
|
4
|
-
|
5
|
-
class TestFile < MiniTest::Test
|
6
|
-
def test_sort
|
7
|
-
file = DotStrings::File.new([
|
8
|
-
DotStrings::Item.new(key: 'key 3', value: 'value 3'),
|
9
|
-
DotStrings::Item.new(key: 'key 2', value: 'value 2'),
|
10
|
-
DotStrings::Item.new(key: 'key 1', value: 'value 1')
|
11
|
-
])
|
12
|
-
|
13
|
-
sorted = file.sort
|
14
|
-
assert_equal ['key 1', 'key 2', 'key 3'], sorted.keys
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_delete
|
18
|
-
items = [
|
19
|
-
DotStrings::Item.new(key: 'key 1', value: 'value 1'),
|
20
|
-
DotStrings::Item.new(key: 'key 2', value: 'value 2'),
|
21
|
-
DotStrings::Item.new(key: 'key 3', value: 'value 3')
|
22
|
-
]
|
23
|
-
|
24
|
-
file = DotStrings::File.new(items)
|
25
|
-
|
26
|
-
file.delete('key 2')
|
27
|
-
assert_equal 2, file.items.size
|
28
|
-
assert_equal ['key 1', 'key 3'], file.keys
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_delete_if
|
32
|
-
file = DotStrings::File.new([
|
33
|
-
DotStrings::Item.new(key: 'key 1', value: 'value 1'),
|
34
|
-
DotStrings::Item.new(key: 'key 2', value: 'value 2'),
|
35
|
-
DotStrings::Item.new(key: 'key 3', value: 'value 3')
|
36
|
-
])
|
37
|
-
|
38
|
-
file.delete_if { |item| item.key == 'key 2' }
|
39
|
-
assert_equal ['key 1', 'key 3'], file.keys
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_access_by_key
|
43
|
-
items = [
|
44
|
-
DotStrings::Item.new(key: 'key 1', value: 'value 1'),
|
45
|
-
DotStrings::Item.new(key: 'key 2', value: 'value 2'),
|
46
|
-
DotStrings::Item.new(key: 'key 3', value: 'value 3')
|
47
|
-
]
|
48
|
-
|
49
|
-
file = DotStrings::File.new(items)
|
50
|
-
|
51
|
-
assert_equal 'value 1', file['key 1'].value
|
52
|
-
assert_equal 'value 2', file['key 2'].value
|
53
|
-
assert_equal 'value 3', file['key 3'].value
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_append
|
57
|
-
file = DotStrings::File.new
|
58
|
-
file.append(DotStrings::Item.new(key: 'key 1', value: 'value 1'))
|
59
|
-
assert_equal 1, file.items.size
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_to_string
|
63
|
-
file = DotStrings::File.new([
|
64
|
-
DotStrings::Item.new(comment: 'Comment 1', key: 'key 1', value: 'value 1'),
|
65
|
-
DotStrings::Item.new(comment: 'Comment 2', key: 'key 2', value: 'value 2'),
|
66
|
-
DotStrings::Item.new(comment: 'Comment 3', key: 'key 3', value: '👻'),
|
67
|
-
DotStrings::Item.new(comment: 'Comment 4', key: "\"'\t\n\r\0", value: "\"'\t\n\r\0")
|
68
|
-
])
|
69
|
-
|
70
|
-
expected = <<~'END_OF_DOCUMENT'
|
71
|
-
/* Comment 1 */
|
72
|
-
"key 1" = "value 1";
|
73
|
-
|
74
|
-
/* Comment 2 */
|
75
|
-
"key 2" = "value 2";
|
76
|
-
|
77
|
-
/* Comment 3 */
|
78
|
-
"key 3" = "👻";
|
79
|
-
|
80
|
-
/* Comment 4 */
|
81
|
-
"\"'\t\n\r\0" = "\"'\t\n\r\0";
|
82
|
-
END_OF_DOCUMENT
|
83
|
-
|
84
|
-
assert_equal expected, file.to_s
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_to_string_no_comments
|
88
|
-
file = DotStrings::File.new([
|
89
|
-
DotStrings::Item.new(comment: 'Comment 1', key: 'key 1', value: 'value 1'),
|
90
|
-
DotStrings::Item.new(comment: 'Comment 2', key: 'key 2', value: 'value 2')
|
91
|
-
])
|
92
|
-
|
93
|
-
expected = <<~'END_OF_DOCUMENT'
|
94
|
-
"key 1" = "value 1";
|
95
|
-
|
96
|
-
"key 2" = "value 2";
|
97
|
-
END_OF_DOCUMENT
|
98
|
-
|
99
|
-
assert_equal expected, file.to_s(comments: false)
|
100
|
-
end
|
101
|
-
|
102
|
-
def test_to_string_can_escape_single_quotes
|
103
|
-
items = [
|
104
|
-
DotStrings::Item.new(comment: 'Comment', key: "key'", value: "value'")
|
105
|
-
]
|
106
|
-
|
107
|
-
file = DotStrings::File.new(items)
|
108
|
-
|
109
|
-
expected = <<~'END_OF_DOCUMENT'
|
110
|
-
/* Comment */
|
111
|
-
"key\'" = "value\'";
|
112
|
-
END_OF_DOCUMENT
|
113
|
-
|
114
|
-
assert_equal expected, file.to_s(escape_single_quotes: true)
|
115
|
-
end
|
116
|
-
end
|
data/test/test_helper.rb
DELETED
data/test/test_item.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'test_helper'
|
4
|
-
|
5
|
-
class TestFile < MiniTest::Test
|
6
|
-
def test_to_s
|
7
|
-
item = DotStrings::Item.new(comment: 'Comment', key: 'key 1', value: 'value 1')
|
8
|
-
assert_equal "/* Comment */\n\"key 1\" = \"value 1\";", item.to_s
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_to_s_with_nil_comment
|
12
|
-
item = DotStrings::Item.new(comment: nil, key: 'key 1', value: 'value 1')
|
13
|
-
assert_equal '"key 1" = "value 1";', item.to_s
|
14
|
-
end
|
15
|
-
end
|
data/test/test_parser.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'test_helper'
|
4
|
-
|
5
|
-
class TestParser < MiniTest::Test
|
6
|
-
def test_handles_extraneous_characters_at_start_of_file
|
7
|
-
error = assert_raises DotStrings::ParsingError do
|
8
|
-
parser = DotStrings::Parser.new
|
9
|
-
parser << '$'
|
10
|
-
end
|
11
|
-
|
12
|
-
assert_equal "Unexpected character '$' at line 1, column 1 (offset: 0)", error.message
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_handles_malformed_comments
|
16
|
-
error = assert_raises DotStrings::ParsingError do
|
17
|
-
parser = DotStrings::Parser.new
|
18
|
-
parser << '/@ test'
|
19
|
-
end
|
20
|
-
|
21
|
-
assert_equal "Unexpected character '@' at line 1, column 2 (offset: 1)", error.message
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_raises_error_when_escaping_invalid_character
|
25
|
-
error = assert_raises DotStrings::ParsingError do
|
26
|
-
parser = DotStrings::Parser.new
|
27
|
-
parser << '"\\z" = "value";'
|
28
|
-
end
|
29
|
-
|
30
|
-
assert_equal "Unexpected character 'z' at line 1, column 3 (offset: 2)", error.message
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_raises_error_when_items_are_not_separated_by_semicolon
|
34
|
-
error = assert_raises DotStrings::ParsingError do
|
35
|
-
parser = DotStrings::Parser.new
|
36
|
-
parser << '"key_1" = "value_1" "key_2" = "value_2"'
|
37
|
-
end
|
38
|
-
|
39
|
-
assert_equal "Unexpected character '\"', expecting ';' at line 1, column 21 (offset: 20)", error.message
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_raises_error_if_low_surrogate_is_not_formatted_correctly
|
43
|
-
error = assert_raises DotStrings::ParsingError do
|
44
|
-
parser = DotStrings::Parser.new
|
45
|
-
parser << '"key" = "\UD83D\$DC7B";'
|
46
|
-
end
|
47
|
-
|
48
|
-
assert_equal "Unexpected character '$', expecting 'U' at line 1, column 17 (offset: 16)", error.message
|
49
|
-
end
|
50
|
-
end
|