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 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: