locca 0.9.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c932554b9be74b84f6218393fa08c900a66d26b2
4
+ data.tar.gz: c16b9a45ccc2f36c1be19692de62ced14d0ffd0a
5
+ SHA512:
6
+ metadata.gz: ac6fa5e4c42f18b568827720619d52c53b41500aa404d29f7ba37c3eb7d736095542f69f34cba8ab210946977eb541cb455ac78e412a1b1d357d07ed68d4adcb
7
+ data.tar.gz: fbb62afd2df2aa68e452ab7a4aefbdc5ad1a39b6686cff31859fcec222b4441213f8a78a1db253398c2409bf7985f0ac631ae1dfe00fb54393337267ce51c969
@@ -0,0 +1 @@
1
+ = locca
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # The MIT License (MIT)
4
+ #
5
+ # Copyright (c) 2014 Evgeny Shurakov
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"), to deal
9
+ # in the Software without restriction, including without limitation the rights
10
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ # copies of the Software, and to permit persons to whom the Software is
12
+ # furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included in all
15
+ # copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ # SOFTWARE.
24
+ #
25
+
26
+ require 'gli'
27
+ require 'locca'
28
+ require 'set'
29
+
30
+ include GLI::App
31
+
32
+ program_desc 'Application localization kit'
33
+
34
+ version Locca::VERSION
35
+
36
+ desc 'Work dir'
37
+ arg_name '<path>'
38
+ flag ['work-dir'.to_sym]
39
+
40
+ desc 'Create and update language files from source code'
41
+ command :build do |c|
42
+ c.action do |global_options, options, args|
43
+
44
+ work_dir = global_options['work-dir'.to_sym]
45
+ if not work_dir
46
+ work_dir = Dir.getwd
47
+ end
48
+ project_dir_locator = Locca::ProjectDirLocator.new()
49
+ config_reader = Locca::ConfigReader.new()
50
+ config_validator = Locca::ConfigValidator.new(['code_dir', 'lang_dir'])
51
+ project_factory = Locca::ProjectFactory.new(project_dir_locator, config_reader, config_validator)
52
+
53
+ project = project_factory.new_project(work_dir)
54
+
55
+ $locca.build(project)
56
+ end
57
+ end
58
+
59
+ desc 'Merge translations from source file to destination file (add missing, update existing)'
60
+ command :merge do |c|
61
+ c.action do |global_options, options, args|
62
+ if args.count != 2
63
+ raise 'You should pass source file path and destination file path'
64
+ end
65
+ $locca.merge(args[0], args[1])
66
+ end
67
+ end
68
+
69
+ pre do |global, command, options, args|
70
+ $locca = Locca::Locca.new()
71
+ true
72
+ end
73
+
74
+ post do |global, command, options, args|
75
+ # Post logic here
76
+ # Use skips_post before a command to skip this
77
+ # block on that command only
78
+ end
79
+
80
+ on_error do |exception|
81
+ # Error logic here
82
+ # return false to skip default error handling
83
+ puts exception.backtrace
84
+ true
85
+ end
86
+
87
+ exit run(ARGV)
@@ -0,0 +1,17 @@
1
+ module Babelyoda
2
+ class StringsLexer
3
+ TOKENS = [ :multiline_comment, :singleline_comment, :string, :equal_sign, :semicolon, :space ].freeze
4
+ REGEXP = Regexp.new("/\\*\\s*(.*?)\\s*\\*/|\\s*(//.*?\n)|\"((?:\\\\?+.)*?)\"|(\\s*=\\s*)|(\\s*;\\s*)|(\\s*)", Regexp::MULTILINE)
5
+
6
+ def lex(str)
7
+ str.scan(REGEXP).each do |m|
8
+ idx = m.index { |x| x }
9
+ if TOKENS[idx] == :space
10
+ next
11
+ end
12
+
13
+ yield TOKENS[idx], m[idx]
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,72 @@
1
+
2
+ module Babelyoda
3
+ class StringsParser
4
+ Bit = Struct.new(:token, :value)
5
+
6
+ def initialize(lexer)
7
+ @lexer = lexer
8
+ end
9
+
10
+ def parse(str, &block)
11
+ @block = block
12
+ bitstream = []
13
+ @lexer.lex(str) do | token, value |
14
+ bitstream << Bit.new(token, value)
15
+ end
16
+ while bitstream.size > 0
17
+ record = produce(bitstream)
18
+ @block.call(record[:string_for_key], record[:value], record[:comment]) if record
19
+ end
20
+ end
21
+
22
+ def produce(bs)
23
+ match_bs(bs, :multiline_comment, :string, :equal_sign, :string, :semicolon) do |bits|
24
+ result = {}
25
+ result[:string_for_key] = bits[1]
26
+ result[:comment] = bits[0]
27
+ result[:value] = bits[3]
28
+ return result
29
+ end
30
+ match_bs(bs, :singleline_comment, :string, :equal_sign, :string, :semicolon) do |bits|
31
+ result = {}
32
+ result[:string_for_key] = bits[1]
33
+ result[:comment] = bits[0]
34
+ result[:value] = bits[3]
35
+ return result
36
+ end
37
+ match_bs(bs, :string, :equal_sign, :string, :semicolon) do |bits|
38
+ result = {}
39
+ result[:string_for_key] = bits[0]
40
+ result[:value] = bits[2]
41
+ return result
42
+ end
43
+ match_bs(bs, :singleline_comment) do |bits|
44
+ return nil
45
+ end
46
+ match_bs(bs, :multiline_comment) do |bits|
47
+ return nil
48
+ end
49
+ raise "Syntax error: #{bs.shift(5).inspect}"
50
+ end
51
+
52
+ def match_bs(bs, *tokens)
53
+ return unless bs.size >= tokens.size
54
+ tokens.each_with_index do |token, idx|
55
+ return unless bs[idx][:token] == token
56
+ end
57
+ yield bs.shift(tokens.size).map { |bit| bit[:value] }
58
+ end
59
+
60
+ def cleanup_comment(str)
61
+ if str.match(/^\/\/\s*/)
62
+ str.sub(/^\/\/\s*/, '')
63
+ else
64
+ str.sub(/^\/\*\s*/, '').sub(/\s*\*\/$/, '')
65
+ end
66
+ end
67
+
68
+ def cleanup_string(str)
69
+ str.sub(/^\"/, '').sub(/\"$/, '')
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,82 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ require 'locca/version'
26
+
27
+ require 'locca/project'
28
+ require 'locca/project_dir_locator'
29
+ require 'locca/project_factory'
30
+
31
+ require 'locca/config_reader'
32
+ require 'locca/config_validator'
33
+
34
+ require 'locca/actions/build_action'
35
+ require 'locca/actions/merge_action'
36
+
37
+ require 'locca/collections_generator'
38
+ require 'locca/collection_merger'
39
+ require 'locca/collection_builder'
40
+ require 'locca/collection_writer'
41
+ require 'locca/collection_item_condensed_formatter'
42
+ require 'locca/collection_item_default_formatter'
43
+
44
+ require 'locca/genstrings'
45
+
46
+ require 'babelyoda/strings_lexer'
47
+ require 'babelyoda/strings_parser'
48
+
49
+ module Locca
50
+ class Locca
51
+ def build(project)
52
+ if not project
53
+ raise 'Can\'t initialize Locca with nil project'
54
+ end
55
+
56
+ genstrings = Genstrings.new()
57
+ collection_builder = collection_builder()
58
+ collections_generator = CollectionsGenerator.new(genstrings, collection_builder)
59
+
60
+ action = BuildAction.new(project, collection_builder, collection_writer(), collections_generator, collection_merger())
61
+ action.execute()
62
+ end
63
+
64
+ def merge(src_file, dst_file)
65
+ action = MergeAction.new(src_file, dst_file, collection_builder(), collection_writer(), collection_merger())
66
+ action.execute()
67
+ end
68
+
69
+ def collection_builder()
70
+ parser = Babelyoda::StringsParser.new(Babelyoda::StringsLexer.new())
71
+ return CollectionBuilder.new(File, parser)
72
+ end
73
+
74
+ def collection_writer()
75
+ return CollectionWriter.new(File, CollectionItemDefaultFormatter.new())
76
+ end
77
+
78
+ def collection_merger()
79
+ return CollectionMerger.new()
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,51 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ require 'locca/collection_merger'
26
+
27
+ module Locca
28
+ class BuildAction
29
+ def initialize(project, collection_builder, collection_writer, collections_generator, collection_merger)
30
+ @project = project
31
+ @collections_generator = collections_generator
32
+ @collection_merger = collection_merger
33
+ @collection_builder = collection_builder
34
+ @collection_writer = collection_writer
35
+ end
36
+
37
+ def execute()
38
+ generated_collections = @collections_generator.generate(@project.code_dir())
39
+ langs = @project.langs()
40
+
41
+ generated_collections.each do |generated_collection|
42
+ langs.each do |lang|
43
+ collection_path = @project.path_for_collection(generated_collection.name, lang)
44
+ collection = @collection_builder.collection_at_path(collection_path)
45
+ @collection_merger.merge(generated_collection, collection, (CollectionMerger::ACTION_ADD | CollectionMerger::ACTION_DELETE))
46
+ @collection_writer.write_to_path(collection, collection_path)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,44 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ require 'locca/collection_merger'
26
+
27
+ module Locca
28
+ class MergeAction
29
+ def initialize(src_file, dst_file, collection_builder, collection_writer, collection_merger)
30
+ @src_file = src_file
31
+ @dst_file = dst_file
32
+ @collection_merger = collection_merger
33
+ @collection_builder = collection_builder
34
+ @collection_writer = collection_writer
35
+ end
36
+
37
+ def execute()
38
+ src_collection = @collection_builder.collection_at_path(@src_file)
39
+ dst_collection = @collection_builder.collection_at_path(@dst_file)
40
+ @collection_merger.merge(src_collection, dst_collection, (CollectionMerger::ACTION_ADD | CollectionMerger::ACTION_UPDATE))
41
+ @collection_writer.write_to_path(dst_collection, @dst_file)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,88 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ module Locca
26
+ class Collection
27
+ attr_accessor :name
28
+ attr_accessor :lang
29
+
30
+ def initialize(name = nil, lang = nil)
31
+ @name = name
32
+ @lang = lang
33
+ @items = {}
34
+ end
35
+
36
+ def add_item(item)
37
+ if !item || !item.key
38
+ raise ArgumentError, 'item or item.key is nil'
39
+ end
40
+ @items[item.key] = item
41
+ end
42
+
43
+ def remove_item_for_key(key)
44
+ return @items.delete(key)
45
+ end
46
+
47
+ def item_for_key(key)
48
+ return @items[key]
49
+ end
50
+
51
+ def has_key?(key)
52
+ return @items.has_key?(key)
53
+ end
54
+
55
+ def all_keys
56
+ return @items.keys
57
+ end
58
+
59
+ def translated?
60
+ @items.each do |key, item|
61
+ if !item.translated?
62
+ return false
63
+ end
64
+ end
65
+
66
+ return true
67
+ end
68
+
69
+ def count
70
+ return @items.count
71
+ end
72
+
73
+ def each
74
+ @items.each do |key, item|
75
+ yield(item)
76
+ end
77
+ end
78
+
79
+ def sorted_each
80
+ sorted_keys = all_keys.sort(&:casecmp)
81
+ sorted_keys.each do |key|
82
+ yield(@items[key])
83
+ end
84
+ end
85
+
86
+ def to_s ; "<#{self.class}: lang = #{lang}, name = #{name}>" ; end
87
+ end
88
+ end
@@ -0,0 +1,47 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+ require_relative 'collection'
25
+ require_relative 'collection_item'
26
+
27
+ module Locca
28
+ class CollectionBuilder
29
+ def initialize(file_manager, parser)
30
+ @file_manager = file_manager
31
+ @parser = parser
32
+ end
33
+
34
+ def collection_at_path(path)
35
+ name = File.basename(path, '.strings')
36
+ collection = Collection.new(name)
37
+
38
+ @file_manager.open(path, 'rb:BOM|UTF-8:UTF-8') do |file|
39
+ @parser.parse(file.read()) do |key, value, comment|
40
+ collection.add_item(CollectionItem.new(key, value, comment))
41
+ end
42
+ end
43
+
44
+ return collection
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,62 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ module Locca
26
+ class CollectionItem
27
+ attr_reader :key
28
+ attr_reader :value
29
+ attr_reader :comment
30
+
31
+ def initialize(key, value = nil, comment = nil)
32
+ @key = key
33
+ @value = value
34
+ @comment = comment
35
+ end
36
+
37
+ def initialize_copy(source)
38
+ super
39
+ end
40
+
41
+ def ==(item)
42
+ if item
43
+ return @key == item.key && @value == item.value && @comment == item.comment
44
+ else
45
+ return false
46
+ end
47
+ end
48
+
49
+ def translated?
50
+ value = nil
51
+ if @value
52
+ value = @value.gsub(/%\d+\$/, "%")
53
+ end
54
+
55
+ if @key == value
56
+ return false
57
+ end
58
+
59
+ return true
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,35 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ module Locca
26
+ class CollectionItemCondensedFormatter
27
+ def format_item(item)
28
+ key = item.key.gsub(/([^\\])"/, "\\1\\\"")
29
+ value = item.value.gsub(/([^\\])"/, "\\1\\\"")
30
+
31
+ return "\"#{key}\" = \"#{value}\";"
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,39 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ module Locca
26
+ class CollectionItemDefaultFormatter
27
+ def format_item(item)
28
+ key = item.key.gsub(/([^\\])"/, "\\1\\\"")
29
+ value = item.value.gsub(/([^\\])"/, "\\1\\\"")
30
+
31
+ result = ""
32
+ result << "/* #{item.comment} */\n" if item.comment
33
+ result << "\"#{key}\" = \"#{value}\";\n"
34
+
35
+ return result
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,63 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ module Locca
26
+ class CollectionMerger
27
+ ACTION_ADD = (1 << 0)
28
+ ACTION_DELETE = (1 << 1)
29
+ ACTION_UPDATE = (1 << 2)
30
+
31
+ def merge(src_collection, dst_collection, actions = (ACTION_ADD | ACTION_DELETE))
32
+ if not src_collection or not dst_collection
33
+ raise ArgumentError, 'Source and Destination Collections should be set'
34
+ end
35
+
36
+ dst_keys = nil
37
+ if (actions & ACTION_DELETE) != 0
38
+ dst_keys = dst_collection.all_keys
39
+ end
40
+
41
+ src_collection.each do |src_item|
42
+ dst_item = dst_collection.item_for_key(src_item.key)
43
+
44
+ if (actions & ACTION_ADD) != 0 && !dst_item
45
+ dst_collection.add_item(src_item.dup)
46
+ elsif (actions & ACTION_UPDATE) != 0 && dst_item
47
+ dst_collection.add_item(src_item.dup)
48
+ end
49
+
50
+ if dst_keys
51
+ dst_keys.delete(src_item.key)
52
+ end
53
+ end
54
+
55
+ if dst_keys
56
+ dst_keys.each do |key|
57
+ dst_collection.remove_item_for_key(key)
58
+ end
59
+ end
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,47 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ module Locca
26
+ class CollectionWriter
27
+ def initialize(file_manager, formatter)
28
+ @file_manager = file_manager
29
+ @formatter = formatter
30
+ end
31
+
32
+ def write_to_path(collection, filepath)
33
+ if not filepath
34
+ raise ArgumentException, 'filepath can\'t be nil'
35
+ end
36
+
37
+ FileUtils.mkdir_p(@file_manager.dirname(filepath))
38
+
39
+ @file_manager.open(filepath, "w") do |io|
40
+ collection.sorted_each do |item|
41
+ io << @formatter.format_item(item)
42
+ io << "\n"
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,41 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ module Locca
26
+ class CollectionsGenerator
27
+ def initialize(genstrings, collection_builder)
28
+ @genstrings = genstrings
29
+ @collection_builder = collection_builder
30
+ end
31
+
32
+ def generate(code_dir)
33
+ result = Array.new()
34
+ @genstrings.generate(code_dir) do |filepath|
35
+ collection = @collection_builder.collection_at_path(filepath)
36
+ result.push(collection)
37
+ end
38
+ return result
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,32 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+ require 'yaml'
25
+
26
+ module Locca
27
+ class ConfigReader
28
+ def read(path)
29
+ return YAML.load_file(path)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,47 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ module Locca
26
+ class ConfigValidator
27
+ attr_accessor :fields
28
+
29
+ def initialize(fields = nil)
30
+ @fields = fields
31
+ end
32
+
33
+ def validate(hash)
34
+ if not @fields
35
+ return true
36
+ end
37
+
38
+ @fields.each do |field|
39
+ if not hash.has_key?(field)
40
+ return false
41
+ end
42
+ end
43
+
44
+ return true
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,47 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+ require 'open3'
25
+ require 'fileutils'
26
+ require 'tmpdir'
27
+
28
+ module Locca
29
+ class Genstrings
30
+ def generate(code_dir)
31
+ Dir.mktmpdir do |tmp_dir|
32
+ command = "find #{code_dir} -iname \"*.m\" -or -iname \"*.mm\" -or -iname \"*.c\" | xargs genstrings -o '#{tmp_dir}'"
33
+ stdout, stderr, status = Open3.capture3(command)
34
+
35
+ STDERR.puts(stderr)
36
+
37
+ if status.success?
38
+ Dir.glob(File.join(tmp_dir, '*.strings')) do |filename|
39
+ yield(filename)
40
+ end
41
+ else
42
+ raise "genstrings failed"
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,54 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ module Locca
26
+ class Project
27
+ attr_reader :dir
28
+ attr_reader :code_dir
29
+ attr_reader :lang_dir
30
+
31
+ attr_reader :base_lang
32
+
33
+ def initialize(dir, config)
34
+ @dir = dir
35
+
36
+ @code_dir = File.join(dir, config['code_dir'])
37
+ @lang_dir = File.join(dir, config['lang_dir'])
38
+
39
+ @base_lang = config['base_lang']
40
+ end
41
+
42
+ def langs
43
+ result = Set.new()
44
+ Dir.glob(File.join(@lang_dir, '*.lproj')) do |filepath|
45
+ result.add(File.basename(filepath, '.lproj'))
46
+ end
47
+ return result
48
+ end
49
+
50
+ def path_for_collection(collection_name, lang)
51
+ return File.join(@lang_dir, "#{lang}.lproj", "#{collection_name}.strings")
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,53 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ module Locca
26
+ class ProjectDirLocator
27
+
28
+ def locate(dir)
29
+ if not File.directory?(dir)
30
+ return nil
31
+ end
32
+
33
+ while dir
34
+ if File.directory?(File.join(dir, ".locca"))
35
+ return dir
36
+ end
37
+
38
+ new_dir = File.expand_path('..', dir)
39
+ if new_dir == dir
40
+ break
41
+ end
42
+ dir = new_dir
43
+ end
44
+
45
+ return nil
46
+ end
47
+
48
+ def config_path(project_dir)
49
+ return File.join(project_dir, '.locca/config')
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,63 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+ require_relative 'project'
25
+
26
+ module Locca
27
+ class ProjectNotFoundError < RuntimeError
28
+ end
29
+
30
+ class ConfigNotFoundError < RuntimeError
31
+ end
32
+
33
+ class ConfigNotValidError < RuntimeError
34
+ end
35
+
36
+ class ProjectFactory
37
+
38
+ def initialize(project_dir_locator, config_reader, config_validator)
39
+ @project_dir_locator = project_dir_locator
40
+ @config_reader = config_reader
41
+ @config_validator = config_validator
42
+ end
43
+
44
+ def new_project(project_dir)
45
+ project_dir = @project_dir_locator.locate(project_dir)
46
+ if not project_dir
47
+ raise ProjectNotFoundError, 'Can\'t find .locca dir (also checked parent dirs)'
48
+ end
49
+
50
+ config = @config_reader.read(@project_dir_locator.config_path(project_dir))
51
+ if not config
52
+ raise ConfigNotFoundError, 'Can\'t find .locca/config'
53
+ end
54
+
55
+ if not @config_validator.validate(config)
56
+ raise ConfigNotValidError, 'Config .locca/config is not valid'
57
+ end
58
+
59
+ return Project.new(project_dir, config)
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,26 @@
1
+ #
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2014 Evgeny Shurakov
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in all
14
+ # copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+ module Locca
25
+ VERSION = '0.9.1'
26
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: locca
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.1
5
+ platform: ruby
6
+ authors:
7
+ - Shurakov Evgeny
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mocha
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rdoc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: gli
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email: inbox@shurakov.name
85
+ executables:
86
+ - locca
87
+ extensions: []
88
+ extra_rdoc_files:
89
+ - README.rdoc
90
+ files:
91
+ - bin/locca
92
+ - lib/babelyoda/strings_lexer.rb
93
+ - lib/babelyoda/strings_parser.rb
94
+ - lib/locca/actions/build_action.rb
95
+ - lib/locca/actions/merge_action.rb
96
+ - lib/locca/collection.rb
97
+ - lib/locca/collection_builder.rb
98
+ - lib/locca/collection_item.rb
99
+ - lib/locca/collection_item_condensed_formatter.rb
100
+ - lib/locca/collection_item_default_formatter.rb
101
+ - lib/locca/collection_merger.rb
102
+ - lib/locca/collection_writer.rb
103
+ - lib/locca/collections_generator.rb
104
+ - lib/locca/config_reader.rb
105
+ - lib/locca/config_validator.rb
106
+ - lib/locca/genstrings.rb
107
+ - lib/locca/project.rb
108
+ - lib/locca/project_dir_locator.rb
109
+ - lib/locca/project_factory.rb
110
+ - lib/locca/version.rb
111
+ - lib/locca.rb
112
+ - README.rdoc
113
+ homepage: https://github.com/eshurakov/locca
114
+ licenses:
115
+ - MIT
116
+ metadata: {}
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 2.0.3
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: Application localization kit
138
+ test_files: []