locca 0.9.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0de31b1cfbf5dc6be572c084cef8289b33c3749f
4
- data.tar.gz: a6bfe34dc35e921aa820b89307ef65b9aba2d4a1
3
+ metadata.gz: 602f845e29ca86257e780db088e19b58bb9915f3
4
+ data.tar.gz: 2f883c90409ea10ddc4223d8aae2aad0c7ea9a57
5
5
  SHA512:
6
- metadata.gz: 72ac44b04a266a3be55956243e18f8657761cda099415ca84da8057bdd3eab185920aa0bb72481e4ee4664f32262a6a37cb62f996d9648d3f05a6f5583ab3136
7
- data.tar.gz: bda3270eb43c1848535d70c575f61dd175f784e24f1186d7bc9f3b439634c9893b7787233a5df989e6febee989b09a2d9a6ef642d3a2df62ffe2f0efcd9f9a4c
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
- $locca.build(project_in_dir(work_dir))
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
- $locca.sync(project_in_dir(work_dir), options[:prune])
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
- $locca.fetch(project_in_dir(work_dir))
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
- $locca.translate(project_in_dir(work_dir), args[0])
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 project_in_dir(dir)
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
- project = project_factory.new_project(dir)
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(project, genstrings, collection_builder)
28
- @project = project
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(@project.code_dir) do |filepath|
35
+ @genstrings.generate(@source_files) do |filepath|
36
36
  collection = @collection_builder.collection_at_path(filepath)
37
37
  result.push(collection)
38
38
  end
@@ -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 'yaml'
24
+ require 'json'
25
25
 
26
26
  module Locca
27
27
  class ConfigReader
28
28
  def read(path)
29
- return YAML.load_file(path)
29
+ return JSON.parse(IO.read(path))
30
30
  end
31
31
  end
32
32
  end
@@ -27,9 +27,10 @@ require 'tmpdir'
27
27
 
28
28
  module Locca
29
29
  class Genstrings
30
- def generate(code_dir)
30
+ def generate(source_files)
31
31
  Dir.mktmpdir do |tmp_dir|
32
- command = "find #{code_dir} -iname \"*.m\" -or -iname \"*.mm\" -or -iname \"*.c\" -or -iname \"*.swift\" | xargs genstrings -o '#{tmp_dir}'"
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 new_project(project_dir)
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
- if Dir.glob("#{project_dir}/**/AndroidManifest.xml").length > 0
55
- return AndroidProject.new(project_dir, config)
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
- return XcodeProject.new(project_dir, config)
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 :code_dir
30
+ attr_reader :langs
30
31
 
31
- def initialize(dir, config)
32
+ def initialize(dir, xcode_target, config)
32
33
  super(dir, config)
33
- @code_dir = File.join(dir, config['code_dir'])
34
- end
34
+ @xcode_target = xcode_target
35
35
 
36
- def langs
37
- result = Set.new()
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
- return result
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
- Dir.glob(File.join(@lang_dir, "#{@base_lang}.lproj", '*.strings')) do |filepath|
48
- result.add(File.basename(filepath, '.strings'))
49
- end
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
- return File.join(@lang_dir, "#{lang}.lproj", "#{collection_name}.strings")
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
- return CollectionsGenerator.new(self, Genstrings.new(), collection_builder())
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
@@ -22,5 +22,5 @@
22
22
  # SOFTWARE.
23
23
  #
24
24
  module Locca
25
- VERSION = '0.9.7'
25
+ VERSION = '2.0.0'
26
26
  end
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.9.7
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-07-11 00:00:00.000000000 Z
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: