xcres 0.4.3 → 0.4.4
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/Gemfile.lock +1 -1
- data/lib/xcres/analyzer/strings_analyzer.rb +9 -16
- data/lib/xcres/logger.rb +31 -10
- data/lib/xcres/version.rb +1 -1
- data/spec/integration/version/after/execution_output.txt +1 -1
- data/spec/unit/analyzer/strings_analyzer_spec.rb +139 -7
- data/spec/unit/logger_spec.rb +5 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66662fa71e28ebba0f9e8709d34eaa747884acd5
|
4
|
+
data.tar.gz: 848102aa3b625215e7523bfec8e216e6c9d2b80f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22ab34d31c641dfae88fe78ef6e5c19e9a60e6b1244f269f511343b7a6f72461640c7cf8d6b845b414dba357a27a981c85de16a42879dfa69bcd7804fc790467
|
7
|
+
data.tar.gz: 477d6500c3aa810f1d97f04203e00965cbe0ab11b2c9f2977a5ccaecc090d9c2250a721da0e009298bf32fb3a3bc5adce0ea82eefde001abfd5f2df8cbe5c475
|
data/Gemfile.lock
CHANGED
@@ -153,8 +153,12 @@ module XCRes
|
|
153
153
|
#
|
154
154
|
def native_dev_languages
|
155
155
|
@native_dev_languages ||= absolute_info_plist_paths.map do |path|
|
156
|
-
|
157
|
-
|
156
|
+
begin
|
157
|
+
read_plist_key(path, :CFBundleDevelopmentRegion)
|
158
|
+
rescue ArgumentError => e
|
159
|
+
warn e
|
160
|
+
end
|
161
|
+
end.compact.to_set
|
158
162
|
end
|
159
163
|
|
160
164
|
# Extracts a given key from a plist file given as a path
|
@@ -168,10 +172,11 @@ module XCRes
|
|
168
172
|
# @return [String]
|
169
173
|
#
|
170
174
|
def read_plist_key(path, key)
|
175
|
+
raise ArgumentError, "File '#{path}' doesn't exist" unless path.exist?
|
171
176
|
raise ArgumentError, 'Path is required, but nil' if path.nil?
|
172
177
|
raise ArgumentError, 'Key is required, but nil' if key.nil?
|
173
|
-
out = `/usr/libexec/PlistBuddy -c "Print :#{key}" "#{path}"`.chomp
|
174
|
-
raise ArgumentError, out unless $?.success?
|
178
|
+
out = `/usr/libexec/PlistBuddy -c "Print :#{key}" "#{path}" 2>&1`.chomp
|
179
|
+
raise ArgumentError, "Error reading plist: #{out}" unless $?.success?
|
175
180
|
out
|
176
181
|
end
|
177
182
|
|
@@ -215,18 +220,6 @@ module XCRes
|
|
215
220
|
end
|
216
221
|
end
|
217
222
|
|
218
|
-
# Get relative file paths
|
219
|
-
#
|
220
|
-
# @return [Array<Pathname>]
|
221
|
-
#
|
222
|
-
def strings_file_paths
|
223
|
-
project_dir = project.path + '..'
|
224
|
-
project_dir_realpath = project_dir.realpath
|
225
|
-
strings_file_refs.map(&:real_path).map do |path|
|
226
|
-
project_dir + path.relative_path_from(project_dir_realpath) rescue path
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
223
|
# Read a file and collect all its keys
|
231
224
|
#
|
232
225
|
# @param [Pathname] path
|
data/lib/xcres/logger.rb
CHANGED
@@ -108,20 +108,21 @@ class XCRes::Logger
|
|
108
108
|
|
109
109
|
# Print a warning log message in yellow color
|
110
110
|
#
|
111
|
-
# @param [String]
|
111
|
+
# @param [String|Exception] message_or_exception
|
112
112
|
# the message, which can have format placeholders
|
113
113
|
#
|
114
114
|
# @param [#to_s...] format_args
|
115
115
|
# will be passed as right hand side to the percent operator,
|
116
116
|
# which will fill the format placeholders used in the message
|
117
117
|
#
|
118
|
-
def warn
|
118
|
+
def warn message_or_exception, *format_args
|
119
|
+
message, _ = coerce_to_message(message_or_exception)
|
119
120
|
inform_colored '⚠' + ' ' + message, :yellow, *format_args
|
120
121
|
end
|
121
122
|
|
122
123
|
# Print a log message to indicate failure of an operation in red color
|
123
124
|
#
|
124
|
-
# @param [String|Exception]
|
125
|
+
# @param [String|Exception] message_or_exception
|
125
126
|
# The message, which can have format placeholders,
|
126
127
|
# can also be a kind of Exception, then its message would been
|
127
128
|
# used instead. The backtrace will be only printed, if the verbose
|
@@ -131,13 +132,8 @@ class XCRes::Logger
|
|
131
132
|
# will be passed as right hand side to the percent operator,
|
132
133
|
# which will fill the format placeholders used in the message
|
133
134
|
#
|
134
|
-
def fail
|
135
|
-
exception =
|
136
|
-
if message.kind_of? Exception
|
137
|
-
exception = message
|
138
|
-
message = exception.message
|
139
|
-
end
|
140
|
-
|
135
|
+
def fail message_or_exception, *format_args
|
136
|
+
message, exception = coerce_to_message(message_or_exception)
|
141
137
|
inform_colored '✗' + ' ' + message, :red, *format_args
|
142
138
|
|
143
139
|
if verbose? && exception != nil
|
@@ -145,4 +141,29 @@ class XCRes::Logger
|
|
145
141
|
end
|
146
142
|
end
|
147
143
|
|
144
|
+
private
|
145
|
+
|
146
|
+
# Coerces the given message or an exception to a string, and yields them as
|
147
|
+
# separated parameters to a block, which allows further handling.
|
148
|
+
#
|
149
|
+
# @param [#to_s] message_or_exception
|
150
|
+
# Can be a String message or an exception
|
151
|
+
#
|
152
|
+
# @return [String,Exception?] message,exception
|
153
|
+
# An array on first place is either the first argument or the
|
154
|
+
# exception's message. If the given argument +message_or_exception+
|
155
|
+
# is an exception, then it is the second element in the result.
|
156
|
+
#
|
157
|
+
def coerce_to_message(message_or_exception)
|
158
|
+
exception = nil
|
159
|
+
if message_or_exception.kind_of? Exception
|
160
|
+
exception = message_or_exception
|
161
|
+
message = exception.message
|
162
|
+
else
|
163
|
+
message = message_or_exception.to_s
|
164
|
+
end
|
165
|
+
|
166
|
+
return message, exception
|
167
|
+
end
|
168
|
+
|
148
169
|
end
|
data/lib/xcres/version.rb
CHANGED
@@ -83,18 +83,150 @@ describe 'XCRes::StringsAnalyzer' do
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
describe "
|
86
|
+
describe "with fixture project" do
|
87
87
|
before do
|
88
88
|
@target = app_target
|
89
89
|
@analyzer = subject.new(@target)
|
90
|
+
@analyzer.logger = stub('Logger', :log)
|
91
|
+
@analyzer.expects(:warn).never
|
92
|
+
@analyzer.expects(:error).never
|
90
93
|
end
|
91
94
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
95
|
+
describe "#strings_file_refs" do
|
96
|
+
it 'should return the strings files of the fixture project' do
|
97
|
+
strings_files = @analyzer.strings_file_refs
|
98
|
+
strings_files.count.should.be.eql?(3)
|
99
|
+
strings_files[0].path.should.be.eql?('en.lproj/InfoPlist.strings')
|
100
|
+
strings_files[1].path.should.be.eql?('en.lproj/Localizable.strings')
|
101
|
+
strings_files[2].path.should.be.eql?('de.lproj/Localizable.strings')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '#derive_used_languages' do
|
106
|
+
it 'should find used languages' do
|
107
|
+
languages = @analyzer.derive_used_languages(@analyzer.strings_file_refs)
|
108
|
+
languages.should == ['en', 'de'].to_set
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe '#used_languages' do
|
113
|
+
it 'should return english and german as used languages' do
|
114
|
+
@analyzer.used_languages.should == ['en', 'de'].to_set
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe '#info_plist_paths' do
|
119
|
+
it 'should return a set with the configured paths of the project' do
|
120
|
+
@analyzer.info_plist_paths.should == [Pathname('Example/Example-Info.plist')].to_set
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe '#absolute_info_plist_paths' do
|
125
|
+
it 'should resolve the path if it is relative' do
|
126
|
+
@analyzer.absolute_project_file_path('Info.plist')
|
127
|
+
.relative_path_from(fixture_path)
|
128
|
+
.should == Pathname('Example/Info.plist')
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should resolve the path if $SRCROOT is used' do
|
132
|
+
@analyzer.absolute_project_file_path('$SRCROOT/Info.plist')
|
133
|
+
.relative_path_from(fixture_path)
|
134
|
+
.should == Pathname('Example/Info.plist')
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe '#native_dev_languages' do
|
139
|
+
it 'should return english' do
|
140
|
+
@analyzer.native_dev_languages.should == ['en'].to_set
|
141
|
+
end
|
142
|
+
|
143
|
+
describe 'with non-configured Info.plist' do
|
144
|
+
it 'should warn on missing plists' do
|
145
|
+
@target.build_configurations[0].build_settings['INFOPLIST_FILE'] = 'NonExisting.plist'
|
146
|
+
@analyzer.expects(:warn).once
|
147
|
+
@analyzer.native_dev_languages.should == ['en'].to_set
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe '#read_plist_key' do
|
153
|
+
before do
|
154
|
+
@plist_path = fixture_path + 'Example/Example/Example-Info.plist'
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'should read and return existing keys' do
|
158
|
+
@analyzer.read_plist_key(@plist_path, :CFBundleDevelopmentRegion)
|
159
|
+
.should == 'en'
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'should raise an ArgumentError on non-existing files' do
|
163
|
+
plist_path = Pathname('NonExisting.plist')
|
164
|
+
proc do
|
165
|
+
@analyzer.read_plist_key(plist_path, :XCResNonExistingKey)
|
166
|
+
end.should.raise(ArgumentError).message
|
167
|
+
.should == "File 'NonExisting.plist' doesn't exist"
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'should raise an ArgumentError on non-existing keys' do
|
171
|
+
proc do
|
172
|
+
@analyzer.read_plist_key(@plist_path, :XCResNonExistingKey)
|
173
|
+
end.should.raise(ArgumentError).message
|
174
|
+
.should == 'Error reading plist: Print: Entry, ":XCResNonExistingKey", Does Not Exist'
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe '#absolute_project_file_path' do
|
179
|
+
it 'should treat relative paths correctly' do
|
180
|
+
@analyzer.absolute_project_file_path('Info.plist')
|
181
|
+
.relative_path_from(fixture_path)
|
182
|
+
.should == Pathname('Example/Info.plist')
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'should replace $SRCROOT with project path' do
|
186
|
+
@analyzer.absolute_project_file_path('$SRCROOT/Info.plist')
|
187
|
+
.relative_path_from(fixture_path)
|
188
|
+
.should == Pathname('Example/Info.plist')
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'should replace ${SRCROOT} with project path' do
|
192
|
+
@analyzer.absolute_project_file_path('${SRCROOT}/Info.plist')
|
193
|
+
.relative_path_from(fixture_path)
|
194
|
+
.should == Pathname('Example/Info.plist')
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'should replace $(SRCROOT) with project path' do
|
198
|
+
@analyzer.absolute_project_file_path('$(SRCROOT)/Info.plist')
|
199
|
+
.relative_path_from(fixture_path)
|
200
|
+
.should == Pathname('Example/Info.plist')
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe '#selected_strings_file_refs' do
|
205
|
+
describe 'for english development language' do
|
206
|
+
before do
|
207
|
+
@analyzer.stubs(:languages).returns ['en']
|
208
|
+
end
|
209
|
+
|
210
|
+
it 'should return the selected strings file refs' do
|
211
|
+
strings_files = @analyzer.selected_strings_file_refs
|
212
|
+
strings_files.count.should.be.eql?(2)
|
213
|
+
strings_files[0].path.should.be.eql?('en.lproj/InfoPlist.strings')
|
214
|
+
strings_files[1].path.should.be.eql?('en.lproj/Localizable.strings')
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
describe 'for german development language' do
|
219
|
+
before do
|
220
|
+
@analyzer.stubs(:languages).returns ['de']
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'should return the selected strings file refs' do
|
224
|
+
@analyzer.stubs(:languages).returns ['de']
|
225
|
+
strings_files = @analyzer.selected_strings_file_refs
|
226
|
+
strings_files.count.should.be.eql?(1)
|
227
|
+
strings_files[0].path.should.be.eql?('de.lproj/Localizable.strings')
|
228
|
+
end
|
229
|
+
end
|
98
230
|
end
|
99
231
|
end
|
100
232
|
|
data/spec/unit/logger_spec.rb
CHANGED
@@ -122,6 +122,11 @@ describe 'XCRes::LoggerSpec' do
|
|
122
122
|
@logger.warn 'test'
|
123
123
|
out.should.be.eql? "\e[33m⚠ test\e[0m"
|
124
124
|
end
|
125
|
+
|
126
|
+
it 'accepts an Exception as message' do
|
127
|
+
@logger.warn StandardError.new('test')
|
128
|
+
out.should.be.eql? "\e[33m⚠ test\e[0m"
|
129
|
+
end
|
125
130
|
end
|
126
131
|
|
127
132
|
describe '#fail' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcres
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marius Rackwitz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|