xliffer 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ea276a483651e8f0e534280a3fef9329a52c4321
4
+ data.tar.gz: 141a20279f0de253021ecc64d8d7427b40ab4aec
5
+ SHA512:
6
+ metadata.gz: ce7148866423e954f0febc89505518ad0110a8bc075fea789f25174f0b2ca27dcda2339f3c393f20ddf7d63eabf3c053610fb7e03ae9f47dcea0c24641127c7c
7
+ data.tar.gz: 334fed09e496be5d4770ae67ab3113491458e7f58acf744121ffeaab221220532078c4e225d9ebfb8157bd332d405ec1a2ac2e22afa6966343c60b96499d3f44
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ *.swp
4
+ .bundle
5
+ .config
6
+ .rvmrc
7
+ coverage
8
+ InstalledFiles
9
+ lib/bundler/man
10
+ pkg
11
+ rdoc
12
+ spec/reports
13
+ test/tmp
14
+ test/version_tmp
15
+ tmp
16
+
17
+ # YARD artifacts
18
+ .yardoc
19
+ _yardoc
20
+ doc/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'nokogiri'
4
+
5
+ group :development do
6
+ gem 'rspec', '~> 2'
7
+ end
@@ -0,0 +1,20 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ diff-lcs (1.2.5)
5
+ nokogiri (1.5.9)
6
+ rspec (2.99.0)
7
+ rspec-core (~> 2.99.0)
8
+ rspec-expectations (~> 2.99.0)
9
+ rspec-mocks (~> 2.99.0)
10
+ rspec-core (2.99.2)
11
+ rspec-expectations (2.99.2)
12
+ diff-lcs (>= 1.1.3, < 2.0)
13
+ rspec-mocks (2.99.3)
14
+
15
+ PLATFORMS
16
+ ruby
17
+
18
+ DEPENDENCIES
19
+ nokogiri
20
+ rspec (~> 2)
@@ -0,0 +1,39 @@
1
+ xliffer
2
+ =======
3
+
4
+ A XLIFF parser gem.
5
+
6
+ Currently implementing the [version 1.2](http://docs.oasis-open.org/xliff/xliff-core/xliff-core.html) from xliff. It is on a very alpha phase.
7
+
8
+ Usage
9
+ -----
10
+
11
+ ```ruby
12
+ require 'xliffer'
13
+
14
+ # Opens a xliff file - can be a file descriptor or a string.
15
+ xliff = XLIFFer::XLIFF.new(File.open('file.xml'))
16
+
17
+ # get the first file definition on this XLIFF.
18
+ file = xliff.files.first
19
+
20
+ # prints the name of this file
21
+ puts file.original
22
+
23
+ # Prints the source and target languages from this file.
24
+ puts file.source_language
25
+ puts file.target_language
26
+
27
+ # Prints all string and the translations on this file.
28
+ file.strings.each do |string|
29
+ puts "#{string.source} => #{string.target}"
30
+ end
31
+ ```
32
+
33
+
34
+ Roadmap
35
+ ------
36
+
37
+ * Read all fields according to 1.2 specification
38
+ * Be able to modify/add contents on the xliff files
39
+ * Regenerate the XML from the file
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,4 @@
1
+ require 'xliffer/exceptions'
2
+ require 'xliffer/xliff'
3
+ require 'xliffer/xliff/file'
4
+ require 'xliffer/xliff/string'
@@ -0,0 +1,5 @@
1
+ module XLIFFer
2
+ class FormatError < StandardError; end
3
+ class MultipleElement < FormatError; end
4
+ class NoElement < FormatError; end
5
+ end
@@ -0,0 +1,3 @@
1
+ module XLIFFer
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,43 @@
1
+ require 'nokogiri'
2
+ require 'xliffer/xliff/file'
3
+
4
+ module XLIFFer
5
+ class XLIFF
6
+ attr_reader :version, :files
7
+ def initialize(xliff = nil)
8
+ text = case xliff
9
+ when ::IO then xliff.read
10
+ when ::String then xliff
11
+ else fail ArgumentError, "Expects an IO or String"
12
+ end
13
+
14
+ parse(text)
15
+ end
16
+
17
+ private
18
+ def parse(text)
19
+ begin
20
+ xml = Nokogiri::XML(text)
21
+ rescue
22
+ fail FormatError, "Not a XML file"
23
+ end
24
+
25
+ xml.remove_namespaces!
26
+ root = xml.xpath('/xliff')
27
+ raise FormatError, "Not a XLIFF file" unless root.any?
28
+
29
+ @version = get_version(root)
30
+ @files = parse_files(root)
31
+ end
32
+
33
+ def get_version(root)
34
+ version = root.attr('version')
35
+ version ? version.value : nil
36
+ end
37
+
38
+ def parse_files(root)
39
+ root.xpath('//file').map{|f| File.new(f)}
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,32 @@
1
+ require 'xliffer/xliff'
2
+ require 'nokogiri'
3
+
4
+ module XLIFFer
5
+ class XLIFF
6
+ class File
7
+ attr_reader :source_language, :target_language, :original, :strings
8
+ alias_method :file_name, :original
9
+ def initialize(xml)
10
+ unless xml_element?(xml) and file?(xml)
11
+ raise ArgumentError, "can't create a File without a file subtree"
12
+ end
13
+
14
+ @original = xml.attr("original")
15
+ @source_language = xml.attr("source-language")
16
+ @target_language = xml.attr("target-language")
17
+ @strings = xml.xpath('.//trans-unit').map{|tu| String.new(tu)}
18
+ end
19
+
20
+
21
+ private
22
+ # TODO: move to public method on XLIFF
23
+ def xml_element?(xml)
24
+ xml.kind_of? Nokogiri::XML::Element
25
+ end
26
+
27
+ def file?(xml)
28
+ xml.name.downcase == "file"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,46 @@
1
+ module XLIFFer
2
+ class XLIFF
3
+ class String
4
+ attr_reader :id, :source, :target, :note
5
+ def initialize(xml)
6
+ unless xml_element?(xml) and trans_unit?(xml)
7
+ raise ArgumentError, "can't create a String without a trans-unit subtree"
8
+ end
9
+
10
+ @id = xml.attr('id')
11
+ @source = get_source(xml)
12
+ @target = get_target(xml)
13
+ @note = get_note(xml)
14
+ end
15
+
16
+ private
17
+ # TODO: move to public method on XLIFF
18
+ def xml_element?(xml)
19
+ xml.kind_of? Nokogiri::XML::Element
20
+ end
21
+
22
+ def trans_unit?(xml)
23
+ xml.name.downcase == "trans-unit"
24
+ end
25
+
26
+ def get_source(xml)
27
+ sources = xml.xpath("./source")
28
+ raise MultipleElement, "Should have only one source tag" if sources.size > 1
29
+ raise NoElement, "Should have one source tag" unless sources.size == 1
30
+ sources.first.text
31
+ end
32
+
33
+ def get_target(xml)
34
+ targets = xml.xpath("./target")
35
+ raise MultipleElement, "Should have only one target tag" if targets.size > 1
36
+ targets.first ? targets.first.text : ''
37
+ end
38
+
39
+ def get_note(xml)
40
+ notes = xml.xpath("./note")
41
+ raise MultipleElement, "Should have only one target tag" if notes.size > 1
42
+ notes.first ? notes.first.text : ''
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1 @@
1
+ <xliff version="1.2"></xliff>
@@ -0,0 +1 @@
1
+ foobar
@@ -0,0 +1,36 @@
1
+ <xliff version="1.2">
2
+ <file original="Graphic Example.psd"
3
+ source-language="en-US" target-language="ja-JP"
4
+ tool="Rainbow" datatype="photoshop">
5
+ <header>
6
+ <skl>
7
+ <external-file uid="3BB236513BB24732" href="Graphic Example.psd.skl"/>
8
+ </skl>
9
+ <phase-group>
10
+ <phase phase-name="extract" process-name="extraction"
11
+ tool="Rainbow" date="20010926T152258Z"
12
+ company-name="NeverLand Inc." job-id="123"
13
+ contact-name="Peter Pan" contact-email="ppan@example.com">
14
+ <note>Make sure to use the glossary I sent you yesterday.
15
+ Thanks.</note>
16
+ </phase>
17
+ </phase-group>
18
+ </header>
19
+ <body>
20
+ <trans-unit id="1" maxbytes="14">
21
+ <source xml:lang="en-US">Quetzal</source>
22
+ <target xml:lang="ja-JP">Quetzal</target>
23
+ </trans-unit>
24
+ <trans-unit id="3" maxbytes="114">
25
+ <source xml:lang="en-US">An application to manipulate and
26
+ process XLIFF documents</source>
27
+ <target xml:lang="ja-JP">XLIFF 文書を編集、または処理
28
+ するアプリケーションです。</target>
29
+ </trans-unit>
30
+ <trans-unit id="4" maxbytes="36">
31
+ <source xml:lang="en-US">XLIFF Data Manager</source>
32
+ <target xml:lang="ja-JP">XLIFF データ・マネージャ</target>
33
+ </trans-unit>
34
+ </body>
35
+ </file>
36
+ </xliff>
@@ -0,0 +1,15 @@
1
+ <xliff version='1.2'
2
+ xmlns='urn:oasis:names:tc:xliff:document:1.2'>
3
+ <file original='hello.txt' source-language='en' target-language='fr'
4
+ datatype='plaintext'>
5
+ <body>
6
+ <trans-unit id='hi'>
7
+ <source>Hello world</source>
8
+ <target>Bonjour le monde</target>
9
+ <alt-trans>
10
+ <target xml:lang='es'>Hola mundo</target>
11
+ </alt-trans>
12
+ </trans-unit>
13
+ </body>
14
+ </file>
15
+ </xliff>
@@ -0,0 +1,8 @@
1
+ require 'xliffer'
2
+
3
+ RSpec.configure do |config|
4
+ config.treat_symbols_as_metadata_keys_with_true_values = true
5
+ config.run_all_when_everything_filtered = true
6
+ config.filter_run :focus
7
+ config.order = 'random'
8
+ end
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+ require 'nokogiri'
3
+
4
+ module XLIFFer
5
+ describe XLIFF::File do
6
+ context "#new" do
7
+ it "is created with a nokogiri file node" do
8
+ file_node = Nokogiri::XML.parse("<file></file>").xpath("/file").first
9
+ XLIFF::File.new(file_node).should be
10
+ end
11
+
12
+ it "can't be created with a string" do
13
+ expect{XLIFF::File.new("<file></file>")}.to raise_error ArgumentError
14
+ end
15
+
16
+ it "can't be created with a node that is not a file node" do
17
+ file_node = Nokogiri::XML.parse("<xliff><file></file></xliff>").xpath("/xliff").first
18
+ expect{XLIFF::File.new(file_node)}.to raise_error ArgumentError
19
+ end
20
+ end
21
+
22
+ context "#original" do
23
+ it "is nil if not defined" do
24
+ file_node = Nokogiri::XML.parse("<xliff><file></file></xliff>").xpath("//file").first
25
+ XLIFF::File.new(file_node).original.should be nil
26
+ end
27
+
28
+ it "is the original attribute on file tag" do
29
+ file_node = Nokogiri::XML.parse('<xliff><file original="neat file.c"></file></xliff>').xpath("//file").first
30
+ XLIFF::File.new(file_node).original.should eql("neat file.c")
31
+ end
32
+ end
33
+
34
+ context "#original" do
35
+ it "is nil if not defined" do
36
+ file_node = Nokogiri::XML.parse("<xliff><file></file></xliff>").xpath("//file").first
37
+ XLIFF::File.new(file_node).original.should be nil
38
+ end
39
+
40
+ it "is the original attribute on file tag" do
41
+ file_node = Nokogiri::XML.parse('<xliff><file original="neat file.c"></file></xliff>').xpath("//file").first
42
+ XLIFF::File.new(file_node).original.should eql("neat file.c")
43
+ end
44
+ end
45
+
46
+ context "#source_language" do
47
+ it "is nil if not defined" do
48
+ file_node = Nokogiri::XML.parse("<xliff><file></file></xliff>").xpath("//file").first
49
+ XLIFF::File.new(file_node).source_language.should be nil
50
+ end
51
+
52
+ it "is the original attribute on file tag" do
53
+ file_node = Nokogiri::XML.parse('<xliff><file source-language="en"></file></xliff>').xpath("//file").first
54
+ XLIFF::File.new(file_node).source_language.should eql("en")
55
+ end
56
+ end
57
+
58
+ context "#target_language" do
59
+ it "is nil if not defined" do
60
+ file_node = Nokogiri::XML.parse("<xliff><file></file></xliff>").xpath("//file").first
61
+ XLIFF::File.new(file_node).target_language.should be nil
62
+ end
63
+
64
+ it "is the original attribute on file tag" do
65
+ file_node = Nokogiri::XML.parse('<xliff><file target-language="fr"></file></xliff>').xpath("//file").first
66
+ XLIFF::File.new(file_node).target_language.should eql("fr")
67
+ end
68
+ end
69
+
70
+ context "#strings" do
71
+ before(:all) do
72
+ @trans_unit = <<-EOF
73
+ <trans-unit id="my id">
74
+ <source>Hello World</source>
75
+ <target>Bonjour le monde</target>
76
+ </trans-unit>
77
+ EOF
78
+ end
79
+ it "is an array " do
80
+ file_node = Nokogiri::XML.parse("<xliff><file></file></xliff>").xpath("//file").first
81
+ XLIFF::File.new(file_node).strings.should be_kind_of(Array)
82
+ end
83
+
84
+ it "can be empty" do
85
+ file_node = Nokogiri::XML.parse("<xliff><file></file></xliff>").xpath("//file").first
86
+ XLIFF::File.new(file_node).strings.should be_empty
87
+ end
88
+
89
+ it "should have a string" do
90
+ file_node = Nokogiri::XML.parse("<xliff><file>#{@trans_unit}</file></xliff>").xpath("//file").first
91
+ XLIFF::File.new(file_node).strings.size.should eql(1)
92
+ end
93
+
94
+ it "should have multiple strings" do
95
+ file_node = Nokogiri::XML.parse("<xliff><file>#{@trans_unit * 10}</file></xliff>").xpath("//file").first
96
+ XLIFF::File.new(file_node).strings.size.should eql(10)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,93 @@
1
+ require 'spec_helper'
2
+ require 'nokogiri'
3
+
4
+ module XLIFFer
5
+ describe XLIFF::String do
6
+ context "#new" do
7
+ before(:all) do
8
+ @minimal_trans_unit = <<-EOF
9
+ <trans-unit id="my id">
10
+ <source>Hello World</source>
11
+ <target>Bonjour le monde</target>
12
+ </trans-unit>
13
+ EOF
14
+ end
15
+ it "is created with a nokogiri trans-unit node" do
16
+ trans_unit_node = Nokogiri::XML.parse(@minimal_trans_unit).xpath("//trans-unit").first
17
+ XLIFF::String.new(trans_unit_node).should be
18
+ end
19
+
20
+ it "can't be created with a string" do
21
+ expect{XLIFF::String.new("<file></file>")}.to raise_error ArgumentError
22
+ end
23
+
24
+ it "can't be created with a node that is not a file node" do
25
+ trans_unit_node = Nokogiri::XML.parse("<xliff></xliff>").xpath("/xliff").first
26
+ expect{XLIFF::String.new(trans_unit_node)}.to raise_error ArgumentError
27
+ end
28
+
29
+ it "have one source" do
30
+ xml = "<trans-unit><target></target></trans-unit>"
31
+ trans_unit_node = Nokogiri::XML.parse(xml).xpath("//trans-unit").first
32
+ expect{XLIFF::String.new(trans_unit_node)}.to raise_error NoElement
33
+ end
34
+
35
+ it "don't have multiple sources tag" do
36
+ xml = "<trans-unit>#{"<source></source>"*2}<target></target></trans-unit>"
37
+ trans_unit_node = Nokogiri::XML.parse(xml).xpath("//trans-unit").first
38
+ expect{XLIFF::String.new(trans_unit_node)}.to raise_error MultipleElement
39
+ end
40
+
41
+ it "don't have multiple targets tag" do
42
+ xml = "<trans-unit><source></source>#{"<target></target>"*2}</trans-unit>"
43
+ trans_unit_node = Nokogiri::XML.parse(xml).xpath("//trans-unit").first
44
+ expect{XLIFF::String.new(trans_unit_node)}.to raise_error MultipleElement
45
+ end
46
+ end
47
+
48
+ context "#id" do
49
+ it "is nil if not defined" do
50
+ xml = "<trans-unit><source></source><target></target></trans-unit>"
51
+ trans_unit_node = Nokogiri::XML.parse(xml).xpath("//trans-unit").first
52
+ XLIFF::String.new(trans_unit_node).id.should be nil
53
+ end
54
+
55
+ it "is the id attribute on trans-unit tag" do
56
+ xml = "<trans-unit id='my id'><source></source><target></target></trans-unit>"
57
+ trans_unit_node = Nokogiri::XML.parse(xml).xpath("//trans-unit").first
58
+ XLIFF::String.new(trans_unit_node).id.should eql("my id")
59
+ end
60
+ end
61
+
62
+
63
+ #context "#strings" do
64
+ # before(:all) do
65
+ # @trans_unit = <<-EOF
66
+ # <trans-unit id="my id">
67
+ # <source>Hello World</source>
68
+ # <target>Bonjour le monde</target>
69
+ # </trans-unit>
70
+ # EOF
71
+ # end
72
+ # it "is an array " do
73
+ # trans_unit_node = Nokogiri::XML.parse("<xliff><file></file></xliff>").xpath("//file").first
74
+ # XLIFF::File.new(trans_unit_node).strings.should be_kind_of(Array)
75
+ # end
76
+
77
+ # it "can be empty" do
78
+ # trans_unit_node = Nokogiri::XML.parse("<xliff><file></file></xliff>").xpath("//file").first
79
+ # XLIFF::File.new(trans_unit_node).strings.should be_empty
80
+ # end
81
+
82
+ # it "should have a string" do
83
+ # trans_unit_node = Nokogiri::XML.parse("<xliff><file>#{@trans_unit}</file></xliff>").xpath("//file").first
84
+ # XLIFF::File.new(trans_unit_node).strings.size.should eql(1)
85
+ # end
86
+
87
+ # it "should have multiple strings" do
88
+ # trans_unit_node = Nokogiri::XML.parse("<xliff><file>#{@trans_unit * 10}</file></xliff>").xpath("//file").first
89
+ # XLIFF::File.new(trans_unit_node).strings.size.should eql(10)
90
+ # end
91
+ #end
92
+ end
93
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ module XLIFFer
4
+ describe XLIFF do
5
+ context "#new" do
6
+ it "accepts a xliff file" do
7
+ XLIFF.new(::File.open("spec/files/empty.xliff")).should be
8
+ end
9
+
10
+ it "accepts a xliff string" do
11
+ XLIFF.new(::File.open("spec/files/empty.xliff").read).should be
12
+ end
13
+
14
+ it "doesn't accept a number" do
15
+ expect{XLIFF.new(123)}.to raise_error ArgumentError
16
+ end
17
+
18
+ it "doesn't accept a random string" do
19
+ expect{XLIFF.new("foobar")}.to raise_error FormatError
20
+ end
21
+
22
+ it "doesn't accept a random file" do
23
+ expect{XLIFF.new(::File.new("spec/files/file.foobar"))}.to raise_error FormatError
24
+ end
25
+ end
26
+
27
+ context "#version" do
28
+ it "is the xliff version" do
29
+ XLIFF.new('<xliff version="9.8"></xliff>').version.should eql("9.8")
30
+ end
31
+
32
+ it "is nil when it is not present" do
33
+ XLIFF.new('<xliff></xliff>').version.should be_nil
34
+ end
35
+
36
+ it "is a string when there is a xliff version" do
37
+ XLIFF.new('<xliff version="9.8"></xliff>').version.should be_kind_of(String)
38
+ end
39
+ end
40
+
41
+ context "#files" do
42
+ it "is an array " do
43
+ XLIFF.new('<xliff></xliff>').files.should be_kind_of(Array)
44
+ end
45
+
46
+ it "can be empty" do
47
+ XLIFF.new('<xliff></xliff>').files.should be_empty
48
+ end
49
+
50
+ it "should have a file" do
51
+ XLIFF.new('<xliff><file></file></xliff>').files.first.should be_kind_of(XLIFF::File)
52
+ end
53
+
54
+ it "should have multiple files" do
55
+ XLIFF.new('<xliff><file></file><file></file></xliff>').files.size.should eql(2)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe XLIFFer do
4
+ end
@@ -0,0 +1,23 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require 'xliffer/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'xliffer'
6
+ s.version = XLIFFer::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.licenses = ["MIT"]
9
+ s.date = '2012-01-01'
10
+ s.summary = "A XLIFF parser"
11
+ s.description = "A parser for XLIFF files"
12
+ s.authors = ["Felipe Tanus"]
13
+ s.email = 'fotanus@gmail.com'
14
+ s.homepage = 'http://github.com/fotanus/xliff'
15
+
16
+ s.add_development_dependency "rspec", "~> 2"
17
+ s.rubyforge_project = "xliffer"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xliffer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Felipe Tanus
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2012-01-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2'
27
+ description: A parser for XLIFF files
28
+ email: fotanus@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - ".gitignore"
34
+ - ".rspec"
35
+ - Gemfile
36
+ - Gemfile.lock
37
+ - README.md
38
+ - Rakefile
39
+ - lib/xliffer.rb
40
+ - lib/xliffer/exceptions.rb
41
+ - lib/xliffer/version.rb
42
+ - lib/xliffer/xliff.rb
43
+ - lib/xliffer/xliff/file.rb
44
+ - lib/xliffer/xliff/string.rb
45
+ - spec/files/empty.xliff
46
+ - spec/files/file.foobar
47
+ - spec/files/wiki.xliff
48
+ - spec/files/xliffspec1.xliff
49
+ - spec/spec_helper.rb
50
+ - spec/xliffer/file_spec.rb
51
+ - spec/xliffer/string_spec.rb
52
+ - spec/xliffer/xliff_spec.rb
53
+ - spec/xliffer_spec.rb
54
+ - xliffer.gemspec
55
+ homepage: http://github.com/fotanus/xliff
56
+ licenses:
57
+ - MIT
58
+ metadata: {}
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubyforge_project: xliffer
75
+ rubygems_version: 2.4.6
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: A XLIFF parser
79
+ test_files: []