locca 0.9.7 → 2.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/bin/locca +16 -6
- data/lib/locca/actions/build_action.rb +0 -1
- data/lib/locca/actions/onesky_sync_action.rb +5 -5
- data/lib/locca/collections_generator.rb +3 -3
- data/lib/locca/config_reader.rb +2 -2
- data/lib/locca/genstrings.rb +3 -2
- data/lib/locca/projects/android_project.rb +7 -0
- data/lib/locca/projects/project.rb +5 -5
- data/lib/locca/projects/project_factory.rb +17 -5
- data/lib/locca/projects/xcode_project.rb +40 -15
- data/lib/locca/version.rb +1 -1
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 602f845e29ca86257e780db088e19b58bb9915f3
|
4
|
+
data.tar.gz: 2f883c90409ea10ddc4223d8aae2aad0c7ea9a57
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2080c2b434355c8f9a6e06bb4b04affa80c32f46e6c72a862e9aca1153803fda5b4e2ea5b5a9c2e1bbe6441e949bc531eae6c1cd37752e45986579012ffbdcc
|
7
|
+
data.tar.gz: d8c18e5980afb6e573bbb9c366e1879628c6185b015076f1eba4523c9813060ab94eb3c2c926be9a34f5ae468eadcc4f4b37251e87587927932065321d10f756
|
data/bin/locca
CHANGED
@@ -46,7 +46,10 @@ command :build do |c|
|
|
46
46
|
work_dir = Dir.getwd
|
47
47
|
end
|
48
48
|
|
49
|
-
|
49
|
+
projects_in_dir(work_dir).each { |project|
|
50
|
+
$locca.build(project)
|
51
|
+
}
|
52
|
+
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
@@ -71,7 +74,10 @@ command :sync do |c|
|
|
71
74
|
work_dir = Dir.getwd
|
72
75
|
end
|
73
76
|
|
74
|
-
|
77
|
+
projects_in_dir(work_dir).each { |project|
|
78
|
+
$locca.sync(project, options[:prune])
|
79
|
+
}
|
80
|
+
|
75
81
|
end
|
76
82
|
end
|
77
83
|
|
@@ -83,7 +89,9 @@ command :fetch do |c|
|
|
83
89
|
work_dir = Dir.getwd
|
84
90
|
end
|
85
91
|
|
86
|
-
|
92
|
+
projects_in_dir(work_dir).each { |project|
|
93
|
+
$locca.fetch(project)
|
94
|
+
}
|
87
95
|
end
|
88
96
|
end
|
89
97
|
|
@@ -95,7 +103,9 @@ command :translate do |c|
|
|
95
103
|
work_dir = Dir.getwd
|
96
104
|
end
|
97
105
|
|
98
|
-
|
106
|
+
projects_in_dir(work_dir).each { |project|
|
107
|
+
$locca.translate(project, args[0])
|
108
|
+
}
|
99
109
|
end
|
100
110
|
end
|
101
111
|
|
@@ -119,12 +129,12 @@ on_error do |exception|
|
|
119
129
|
true
|
120
130
|
end
|
121
131
|
|
122
|
-
def
|
132
|
+
def projects_in_dir(dir)
|
123
133
|
project_dir_locator = Locca::ProjectDirLocator.new()
|
124
134
|
config_reader = Locca::ConfigReader.new()
|
125
135
|
project_factory = Locca::ProjectFactory.new(project_dir_locator, config_reader)
|
126
136
|
|
127
|
-
|
137
|
+
return project_factory.all_projects(dir)
|
128
138
|
end
|
129
139
|
|
130
140
|
exit run(ARGV)
|
@@ -37,7 +37,6 @@ module Locca
|
|
37
37
|
def execute()
|
38
38
|
generated_collections = @collections_generator.generate()
|
39
39
|
langs = @project.langs()
|
40
|
-
|
41
40
|
generated_collections.each do |generated_collection|
|
42
41
|
langs.each do |lang|
|
43
42
|
collection_path = @project.path_for_collection(generated_collection.name, lang)
|
@@ -47,7 +47,7 @@ module Locca
|
|
47
47
|
# 1
|
48
48
|
@generated_collections.each do |generated_collection|
|
49
49
|
@langs.each do |lang|
|
50
|
-
print "[*] fetch: #{lang}/#{generated_collection.name}\n"
|
50
|
+
print "[*] #{@project.name}: fetch: #{lang}/#{generated_collection.name}\n"
|
51
51
|
data = @onesky.fetch_translations(lang, @project.full_collection_name(generated_collection.name))
|
52
52
|
fetched_collection = @collection_builder.collection_from_datastring(data)
|
53
53
|
|
@@ -55,7 +55,7 @@ module Locca
|
|
55
55
|
local_collection = @collection_builder.collection_at_path(local_collection_path)
|
56
56
|
|
57
57
|
# 2
|
58
|
-
print "[*] merge: onesky -> #{lang}/#{generated_collection.name}\n"
|
58
|
+
print "[*] #{@project.name}: merge: onesky -> #{lang}/#{generated_collection.name}\n"
|
59
59
|
@collection_merger.merge(fetched_collection, local_collection, CollectionMerger::ACTION_ADD | CollectionMerger::ACTION_UPDATE)
|
60
60
|
@collection_writer.write_to_path(local_collection, local_collection_path)
|
61
61
|
end
|
@@ -68,7 +68,7 @@ module Locca
|
|
68
68
|
# 3
|
69
69
|
@generated_collections.each do |generated_collection|
|
70
70
|
@langs.each do |lang|
|
71
|
-
print "[*] merge: code -> #{lang}/#{generated_collection.name}\n"
|
71
|
+
print "[*] #{@project.name}: merge: code -> #{lang}/#{generated_collection.name}\n"
|
72
72
|
|
73
73
|
local_collection_path = @project.path_for_collection(generated_collection.name, lang)
|
74
74
|
local_collection = @collection_builder.collection_at_path(local_collection_path)
|
@@ -81,7 +81,7 @@ module Locca
|
|
81
81
|
if @project.prevent_sync_without_comments?
|
82
82
|
lang = @project.base_lang
|
83
83
|
@generated_collections.each do |generated_collection|
|
84
|
-
print "[*] check: #{lang}/#{generated_collection.name}\n"
|
84
|
+
print "[*] #{@project.name}: check: #{lang}/#{generated_collection.name}\n"
|
85
85
|
|
86
86
|
local_collection_path = @project.path_for_collection(generated_collection.name, lang)
|
87
87
|
local_collection = @collection_builder.collection_at_path(local_collection_path)
|
@@ -95,7 +95,7 @@ module Locca
|
|
95
95
|
|
96
96
|
# 4
|
97
97
|
@generated_collections.each do |generated_collection|
|
98
|
-
print "[*] upload: #{@project.base_lang}/#{generated_collection.name}\n"
|
98
|
+
print "[*] #{@project.name}: upload: #{@project.base_lang}/#{generated_collection.name}\n"
|
99
99
|
collection_path = @project.path_for_collection(generated_collection.name, @project.base_lang())
|
100
100
|
@onesky.upload_file(collection_path, @project.one_sky_file_format, prune_missing_strings)
|
101
101
|
end
|
@@ -24,15 +24,15 @@
|
|
24
24
|
|
25
25
|
module Locca
|
26
26
|
class CollectionsGenerator
|
27
|
-
def initialize(
|
28
|
-
@
|
27
|
+
def initialize(source_files, genstrings, collection_builder)
|
28
|
+
@source_files = source_files
|
29
29
|
@genstrings = genstrings
|
30
30
|
@collection_builder = collection_builder
|
31
31
|
end
|
32
32
|
|
33
33
|
def generate()
|
34
34
|
result = Array.new()
|
35
|
-
@genstrings.generate(@
|
35
|
+
@genstrings.generate(@source_files) do |filepath|
|
36
36
|
collection = @collection_builder.collection_at_path(filepath)
|
37
37
|
result.push(collection)
|
38
38
|
end
|
data/lib/locca/config_reader.rb
CHANGED
@@ -21,12 +21,12 @@
|
|
21
21
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
22
22
|
# SOFTWARE.
|
23
23
|
#
|
24
|
-
require '
|
24
|
+
require 'json'
|
25
25
|
|
26
26
|
module Locca
|
27
27
|
class ConfigReader
|
28
28
|
def read(path)
|
29
|
-
return
|
29
|
+
return JSON.parse(IO.read(path))
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
data/lib/locca/genstrings.rb
CHANGED
@@ -27,9 +27,10 @@ require 'tmpdir'
|
|
27
27
|
|
28
28
|
module Locca
|
29
29
|
class Genstrings
|
30
|
-
def generate(
|
30
|
+
def generate(source_files)
|
31
31
|
Dir.mktmpdir do |tmp_dir|
|
32
|
-
|
32
|
+
file_list = "'" + source_files.join("' '") + "'"
|
33
|
+
command = "genstrings -o '#{tmp_dir}' #{file_list}"
|
33
34
|
stdout, stderr, status = Open3.capture3(command)
|
34
35
|
|
35
36
|
stderr = stderr.strip
|
@@ -28,8 +28,15 @@ module Locca
|
|
28
28
|
class AndroidProject < Project
|
29
29
|
MAIN_COLLECTION_NAME = 'strings'
|
30
30
|
|
31
|
+
attr_reader :lang_dir
|
32
|
+
|
31
33
|
def initialize(dir, config)
|
32
34
|
super(dir, config)
|
35
|
+
@lang_dir = File.join(dir, config['lang_dir'])
|
36
|
+
end
|
37
|
+
|
38
|
+
def name
|
39
|
+
return "Android"
|
33
40
|
end
|
34
41
|
|
35
42
|
def langs
|
@@ -25,16 +25,12 @@
|
|
25
25
|
module Locca
|
26
26
|
class Project
|
27
27
|
attr_reader :dir
|
28
|
-
attr_reader :lang_dir
|
29
|
-
|
30
28
|
attr_reader :base_lang
|
31
29
|
|
32
30
|
def initialize(dir, config)
|
33
31
|
@dir = dir
|
34
32
|
@config = config
|
35
|
-
|
36
|
-
@lang_dir = File.join(dir, config['lang_dir'])
|
37
|
-
|
33
|
+
|
38
34
|
@base_lang = config['base_lang']
|
39
35
|
end
|
40
36
|
|
@@ -84,5 +80,9 @@ module Locca
|
|
84
80
|
# implement in subclass
|
85
81
|
end
|
86
82
|
|
83
|
+
def name
|
84
|
+
return ""
|
85
|
+
end
|
86
|
+
|
87
87
|
end
|
88
88
|
end
|
@@ -21,6 +21,7 @@
|
|
21
21
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
22
22
|
# SOFTWARE.
|
23
23
|
#
|
24
|
+
require 'xcodeproj'
|
24
25
|
require_relative 'xcode_project'
|
25
26
|
|
26
27
|
module Locca
|
@@ -40,7 +41,7 @@ module Locca
|
|
40
41
|
@config_reader = config_reader
|
41
42
|
end
|
42
43
|
|
43
|
-
def
|
44
|
+
def all_projects(project_dir)
|
44
45
|
project_dir = @project_dir_locator.locate(project_dir)
|
45
46
|
if not project_dir
|
46
47
|
raise ProjectNotFoundError, 'Can\'t find .locca dir (also checked parent dirs)'
|
@@ -51,12 +52,23 @@ module Locca
|
|
51
52
|
raise ConfigNotFoundError, 'Can\'t find .locca/config'
|
52
53
|
end
|
53
54
|
|
54
|
-
|
55
|
-
|
55
|
+
results = Array.new()
|
56
|
+
|
57
|
+
if config["project_file"]
|
58
|
+
project = Xcodeproj::Project.open(File.join(project_dir, config["project_file"]))
|
59
|
+
config["targets"].each { |target_name, target_config|
|
60
|
+
project.native_targets().each { |target|
|
61
|
+
if target.name == target_name
|
62
|
+
merged_config = config.merge(target_config)
|
63
|
+
results.push(XcodeProject.new(project_dir, target, merged_config))
|
64
|
+
end
|
65
|
+
}
|
66
|
+
}
|
56
67
|
else
|
57
|
-
|
68
|
+
results.push(AndroidProject.new(project_dir, config))
|
58
69
|
end
|
59
|
-
|
70
|
+
|
71
|
+
return results
|
60
72
|
end
|
61
73
|
|
62
74
|
end
|
@@ -22,31 +22,41 @@
|
|
22
22
|
# SOFTWARE.
|
23
23
|
#
|
24
24
|
|
25
|
+
require 'xcodeproj'
|
25
26
|
require_relative 'project'
|
26
27
|
|
27
28
|
module Locca
|
28
29
|
class XcodeProject < Project
|
29
|
-
attr_reader :
|
30
|
+
attr_reader :langs
|
30
31
|
|
31
|
-
def initialize(dir, config)
|
32
|
+
def initialize(dir, xcode_target, config)
|
32
33
|
super(dir, config)
|
33
|
-
@
|
34
|
-
end
|
34
|
+
@xcode_target = xcode_target
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
Dir.glob(File.join(@lang_dir, '*.lproj')) do |filepath|
|
39
|
-
result.add(File.basename(filepath, '.lproj'))
|
40
|
-
end
|
36
|
+
@files = Array.new()
|
37
|
+
@langs = Set.new()
|
41
38
|
|
42
|
-
|
39
|
+
@xcode_target.resources_build_phase.files_references.each { |file|
|
40
|
+
if file.display_name.end_with?(".strings") && file.is_a?(Xcodeproj::Project::Object::PBXVariantGroup)
|
41
|
+
@files.push(file)
|
42
|
+
if file.display_name == "Localizable.strings"
|
43
|
+
file.files.each { |variant_file|
|
44
|
+
@langs.add(variant_file.name)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def name
|
52
|
+
return @xcode_target.name
|
43
53
|
end
|
44
54
|
|
45
55
|
def collection_names
|
46
56
|
result = Set.new()
|
47
|
-
|
48
|
-
result.add(File.basename(
|
49
|
-
|
57
|
+
@files.each { |file|
|
58
|
+
result.add(File.basename(file.display_name, '.strings'))
|
59
|
+
}
|
50
60
|
|
51
61
|
return result
|
52
62
|
end
|
@@ -56,7 +66,18 @@ module Locca
|
|
56
66
|
end
|
57
67
|
|
58
68
|
def path_for_collection(collection_name, lang)
|
59
|
-
|
69
|
+
collection_name = "#{collection_name}.strings"
|
70
|
+
@files.each { |file|
|
71
|
+
if file.display_name == collection_name
|
72
|
+
file.files.each { |variant_file|
|
73
|
+
if variant_file.name == lang
|
74
|
+
return variant_file.real_path
|
75
|
+
end
|
76
|
+
}
|
77
|
+
end
|
78
|
+
}
|
79
|
+
|
80
|
+
return nil
|
60
81
|
end
|
61
82
|
|
62
83
|
def collection_builder()
|
@@ -69,7 +90,11 @@ module Locca
|
|
69
90
|
end
|
70
91
|
|
71
92
|
def collections_generator()
|
72
|
-
|
93
|
+
source_files = Array.new()
|
94
|
+
@xcode_target.source_build_phase.files_references.each { |file|
|
95
|
+
source_files.push(file.real_path.to_s)
|
96
|
+
}
|
97
|
+
return CollectionsGenerator.new(source_files, Genstrings.new(), collection_builder())
|
73
98
|
end
|
74
99
|
|
75
100
|
def one_sky_file_format
|
data/lib/locca/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: locca
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shurakov Evgeny
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -108,6 +108,34 @@ dependencies:
|
|
108
108
|
- - '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: xcodeproj
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: json
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
111
139
|
description:
|
112
140
|
email: inbox@shurakov.name
|
113
141
|
executables:
|