open_xml_package 0.0.3 → 0.1.0.beta1

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: e0c48c674659490cb99dd732878aed3b4f0425cb
4
- data.tar.gz: db6e4f5b6a5e3275759ab1128acaadbe3157e410
3
+ metadata.gz: dccd074a45e7ab40ae475a08cc76fa971b1fdf28
4
+ data.tar.gz: 9c2b1b2f54b9ebe31ea4dc5fb897811ef868048c
5
5
  SHA512:
6
- metadata.gz: 32b928ff33b063c806d10de43e521499c05fb890ff2164a351ace3633450676f2afd1e87eda4e2e648036453df8eeb09eec32da245080047deffd6f5f347f708
7
- data.tar.gz: d20a4f7eeb74dfbc4ee8bab6dbd42c4b4aabf65c54bd8472a288055ae47ae64ecae59b1c48154d0c719411ad13ee11f1cb8c2e07b531c87e27a7c8aaab4f2264
6
+ metadata.gz: ed7b80d5fdc04c631963c985b7cd514b1a7dcaec082ad508e5a8f4eaf01185952dc25359bd3466a027eea5c4018bec380d3243e4ba111664cc196bd793a1b58c
7
+ data.tar.gz: 1e2c65ddc9e0c1f92f9b54dc02240ba50b6558f3289b0343bda5a79cc7337c8fbb2fe8b2194086cce6cb0a52a93d407f37d7caae00d9916fde35bba8fcf2a6ba
@@ -0,0 +1,18 @@
1
+ module OpenXml
2
+ class ContentTypesPresets
3
+ attr_reader :defaults, :overrides
4
+
5
+ def initialize
6
+ @defaults, @overrides = {}, {}
7
+ end
8
+
9
+ def default(extension, content_type)
10
+ defaults[extension] = content_type
11
+ end
12
+
13
+ def override(part_name, content_type)
14
+ overrides[part_name] = content_type
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ module OpenXml
2
+ module Errors
3
+
4
+ class MissingContentTypesPart < StandardError
5
+ end
6
+
7
+ end
8
+ end
@@ -0,0 +1,135 @@
1
+ require "open_xml_package/version"
2
+ require "open_xml/content_types_presets"
3
+ require "open_xml/rubyzip_fix"
4
+ require "open_xml/errors"
5
+ require "open_xml/types"
6
+ require "open_xml/parts"
7
+ require "zip"
8
+
9
+ module OpenXml
10
+ class Package
11
+ attr_reader :parts, :content_types, :rels
12
+
13
+
14
+
15
+ class << self
16
+ def content_types_presets
17
+ @content_types_presets ||= OpenXml::ContentTypesPresets.new
18
+ end
19
+
20
+ def content_types(&block)
21
+ content_types_presets.instance_eval &block
22
+ end
23
+
24
+ def open(path)
25
+ if block_given?
26
+ Zip::File.open(path) do |zipfile|
27
+ yield new(zipfile)
28
+ end
29
+ else
30
+ new Zip::File.open(path)
31
+ end
32
+ end
33
+
34
+ def from_stream(stream)
35
+ stream = StringIO.new(stream) if stream.is_a?(String)
36
+
37
+ # Hack: Zip::Entry.read_c_dir_entry initializes
38
+ # a new Zip::Entry by calling `io.path`. Zip::Entry
39
+ # uses this to open the original zipfile; but in
40
+ # this case, the StringIO _is_ the original.
41
+ def stream.path
42
+ self
43
+ end
44
+
45
+ zipfile = ::Zip::File.new("", true, true)
46
+ zipfile.read_from_stream(stream)
47
+ new(zipfile)
48
+ end
49
+ end
50
+
51
+
52
+
53
+ def initialize(zipfile=nil)
54
+ @zipfile = zipfile
55
+ @parts = {}
56
+
57
+ if zipfile
58
+ read_zipfile!
59
+ else
60
+ set_defaults
61
+ end
62
+ end
63
+
64
+
65
+
66
+ def add_part(path, part)
67
+ @parts[path] = part
68
+ end
69
+
70
+ def get_part(path)
71
+ @parts.fetch(path)
72
+ end
73
+
74
+ def type_of(path)
75
+ raise Errors::MissingContentTypesPart, "We haven't yet read [ContentTypes].xml; but are reading #{path.inspect}" unless content_types
76
+ content_types.of(path)
77
+ end
78
+
79
+
80
+
81
+ def close
82
+ zipfile.close if zipfile
83
+ end
84
+
85
+ def write_to(path)
86
+ File.open(path, "w") do |file|
87
+ file.write to_stream.string
88
+ end
89
+ end
90
+ alias :save :write_to
91
+
92
+ def to_stream
93
+ Zip::OutputStream.write_buffer do |io|
94
+ parts.each do |path, part|
95
+ io.put_next_entry path
96
+ io.write part.content
97
+ end
98
+ end
99
+ end
100
+
101
+ private
102
+
103
+ attr_reader :zipfile
104
+
105
+ def read_zipfile!
106
+ zipfile.entries.each do |entry|
107
+ path, part = entry.name, Parts::UnparsedPart.new(entry)
108
+ add_part path, case path
109
+ when "[Content_Types].xml" then @content_types = Parts::ContentTypes.parse(part.content)
110
+ when "_rels/.rels" then @rels = Parts::Rels.parse(part.content)
111
+ else part_for(path, type_of(path), part)
112
+ end
113
+ end
114
+ end
115
+
116
+ protected
117
+
118
+ def set_defaults
119
+ presets = self.class.content_types_presets
120
+ @content_types = Parts::ContentTypes.new(presets.defaults, presets.overrides)
121
+ add_part "[Content_Types].xml", content_types
122
+
123
+ @rels = Parts::Rels.new
124
+ add_part "_rels/.rels", rels
125
+ end
126
+
127
+ def part_for(path, content_type, part)
128
+ case content_type
129
+ when Types::RELATIONSHIPS then Parts::Rels.parse(part.content)
130
+ else part
131
+ end
132
+ end
133
+
134
+ end
135
+ end
@@ -0,0 +1,32 @@
1
+ require "nokogiri"
2
+
3
+ module OpenXml
4
+ class Part
5
+ include ::Nokogiri
6
+
7
+ def build_xml
8
+ XML::Builder.new(encoding: "utf-8") { |xml| yield xml }.to_xml
9
+ end
10
+
11
+ def build_standalone_xml
12
+ xml = Nokogiri::XML("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>")
13
+ XML::Builder.with(xml) { |xml| yield xml }.to_xml
14
+ end
15
+
16
+ def read
17
+ strip_whitespace to_xml
18
+ end
19
+ alias :content :read
20
+
21
+ def to_xml
22
+ raise NotImplementedError
23
+ end
24
+
25
+ protected
26
+
27
+ def strip_whitespace(xml)
28
+ xml.lines.map(&:strip).join
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,51 @@
1
+ module OpenXml
2
+ module Parts
3
+ class ContentTypes < OpenXml::Part
4
+ attr_reader :defaults, :overrides
5
+
6
+ REQUIRED_DEFAULTS = {
7
+ "xml" => Types::XML,
8
+ "rels" => Types::RELATIONSHIPS
9
+ }.freeze
10
+
11
+ def self.parse(xml)
12
+ document = Nokogiri(xml)
13
+ self.new.tap do |part|
14
+ document.css("Default").each do |default|
15
+ part.add_default default["Extension"], default["ContentType"]
16
+ end
17
+ document.css("Override").each do |default|
18
+ part.add_override default["PartName"], default["ContentType"]
19
+ end
20
+ end
21
+ end
22
+
23
+ def initialize(defaults={}, overrides={})
24
+ @defaults = REQUIRED_DEFAULTS.merge(defaults)
25
+ @overrides = overrides
26
+ end
27
+
28
+ def add_default(extension, content_type)
29
+ defaults[extension] = content_type
30
+ end
31
+
32
+ def add_override(part_name, content_type)
33
+ overrides[part_name] = content_type
34
+ end
35
+
36
+ def of(path)
37
+ overrides.fetch(path, defaults[File.extname(path)[1..-1]])
38
+ end
39
+
40
+ def to_xml
41
+ build_xml do |xml|
42
+ xml.Types(xmlns: "http://schemas.openxmlformats.org/package/2006/content-types") {
43
+ defaults.each { |extension, content_type| xml.Default("Extension" => extension, "ContentType" => content_type) }
44
+ overrides.each { |part_name, content_type| xml.Override("PartName" => part_name, "ContentType" => content_type) }
45
+ }
46
+ end
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,57 @@
1
+ require "securerandom"
2
+
3
+ module OpenXml
4
+ module Parts
5
+ class Rels < OpenXml::Part
6
+ include Enumerable
7
+
8
+ def self.parse(xml)
9
+ document = Nokogiri(xml)
10
+ self.new.tap do |part|
11
+ document.css("Relationship").each do |rel|
12
+ part.add_relationship rel["Type"], rel["Target"], rel["Id"]
13
+ end
14
+ end
15
+ end
16
+
17
+ def initialize(defaults=[])
18
+ @relationships = []
19
+ Array(defaults).each do |default|
20
+ add_relationship(*default.values_at("Type", "Target", "Id"))
21
+ end
22
+ end
23
+
24
+ def add_relationship(type, target, id=nil)
25
+ Relationship.new(type, target, id).tap do |relationship|
26
+ relationships.push relationship
27
+ end
28
+ end
29
+
30
+ def each(&block)
31
+ relationships.each(&block)
32
+ end
33
+
34
+ def to_xml
35
+ build_standalone_xml do |xml|
36
+ xml.Relationships(xmlns: "http://schemas.openxmlformats.org/package/2006/relationships") do
37
+ relationships.each do |rel|
38
+ xml.Relationship("Id" => rel.id, "Type" => rel.type, "Target" => rel.target)
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+
45
+
46
+ class Relationship < Struct.new(:type, :target, :id)
47
+ def initialize(type, target, id=nil)
48
+ super type, target, id || "R#{SecureRandom.hex}"
49
+ end
50
+ end
51
+
52
+ private
53
+ attr_reader :relationships
54
+
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,20 @@
1
+ module OpenXml
2
+ module Parts
3
+ class UnparsedPart
4
+
5
+ def initialize(content)
6
+ @content = content
7
+ end
8
+
9
+ def content
10
+ @content = @content.get_input_stream.read if promise?
11
+ @content
12
+ end
13
+
14
+ def promise?
15
+ @content.respond_to? :get_input_stream
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,10 @@
1
+ require "open_xml/part"
2
+
3
+ module OpenXml
4
+ module Parts
5
+ end
6
+ end
7
+
8
+ Dir.glob("#{File.join(File.dirname(__FILE__), "parts", "*.rb")}").each do |file|
9
+ require file
10
+ end
File without changes
@@ -0,0 +1,6 @@
1
+ module OpenXml
2
+ module Types
3
+ XML = "application/xml".freeze
4
+ RELATIONSHIPS = "application/vnd.openxmlformats-package.relationships+xml".freeze
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
- class OpenXmlPackage
2
- VERSION = "0.0.3"
1
+ module OpenXmlPackage
2
+ VERSION = "0.1.0.beta1"
3
3
  end
@@ -1,87 +1 @@
1
- require "open_xml_package/part"
2
- require "open_xml_package/rubyzip_fix"
3
- require "open_xml_package/version"
4
- require "zip"
5
-
6
-
7
- class OpenXmlPackage
8
- attr_reader :parts
9
-
10
- def self.open(path)
11
- if block_given?
12
- Zip::File.open(path) do |zipfile|
13
- yield new(zipfile)
14
- end
15
- else
16
- new Zip::File.open(path)
17
- end
18
- end
19
-
20
- def self.from_stream(stream)
21
- stream = StringIO.new(stream) if stream.is_a?(String)
22
-
23
- # Hack: Zip::Entry.read_c_dir_entry initializes
24
- # a new Zip::Entry by calling `io.path`. Zip::Entry
25
- # uses this to open the original zipfile; but in
26
- # this case, the StringIO _is_ the original.
27
- def stream.path
28
- self
29
- end
30
-
31
- zipfile = ::Zip::File.new("", true, true)
32
- zipfile.read_from_stream(stream)
33
- new(zipfile)
34
- end
35
-
36
- def initialize(zipfile=nil)
37
- @zipfile = zipfile
38
- @parts = []
39
- read_zipfile! if zipfile
40
- end
41
-
42
-
43
-
44
- def add_part(path_or_part, content=nil)
45
- path = path_or_part
46
- path = path_or_part.path if path_or_part.respond_to?(:path)
47
- content = path_or_part.read if path_or_part.respond_to?(:read)
48
-
49
- @parts << Part.new(path, content)
50
- end
51
-
52
- def get_part(path)
53
- @parts.detect { |part| part.path == path }
54
- end
55
-
56
-
57
-
58
- def close
59
- zipfile.close if zipfile
60
- end
61
-
62
- def write_to(path)
63
- File.open(path, "w") do |file|
64
- file.write to_stream.string
65
- end
66
- end
67
-
68
- def to_stream
69
- Zip::OutputStream.write_buffer do |io|
70
- parts.each do |part|
71
- io.put_next_entry part.path
72
- io.write part.content
73
- end
74
- end
75
- end
76
-
77
- private
78
-
79
- attr_reader :zipfile
80
-
81
- def read_zipfile!
82
- zipfile.entries.each do |entry|
83
- @parts << Part.new(entry.name, entry)
84
- end
85
- end
86
-
87
- end
1
+ require "open_xml/package"
@@ -18,11 +18,12 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "rubyzip"
21
+ spec.add_dependency "rubyzip", "~> 1.1.0"
22
+ spec.add_dependency "nokogiri"
22
23
 
23
24
  spec.add_development_dependency "bundler", "~> 1.6"
24
25
  spec.add_development_dependency "rake"
25
- spec.add_development_dependency "rails", ">= 3.2", "< 4.1"
26
+ spec.add_development_dependency "rails", ">= 3.2", "< 5.0"
26
27
  spec.add_development_dependency "turn"
27
28
  spec.add_development_dependency "pry"
28
29
  spec.add_development_dependency "rr"
@@ -0,0 +1,34 @@
1
+ require "test_helper"
2
+
3
+ class ContentTypesTest < ActiveSupport::TestCase
4
+ attr_reader :content_types
5
+
6
+ WORDPROCESSING_DOCUMENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"
7
+
8
+ setup do
9
+ @content_types = OpenXml::Parts::ContentTypes.new(
10
+ {"xml" => OpenXml::Types::XML, "rels" => OpenXml::Types::RELATIONSHIPS},
11
+ {"word/document.xml" => WORDPROCESSING_DOCUMENT_TYPE})
12
+ end
13
+
14
+
15
+ context "Given a path without an override" do
16
+ should "identify the content type from its extension" do
17
+ assert_equal OpenXml::Types::XML, content_types.of("content/some.xml")
18
+ end
19
+ end
20
+
21
+ context "Given a path with an override" do
22
+ should "identify the content type from its path" do
23
+ assert_equal WORDPROCESSING_DOCUMENT_TYPE, content_types.of("word/document.xml")
24
+ end
25
+ end
26
+
27
+ context "Given a path with an unrecognized extension" do
28
+ should "be nil" do
29
+ assert_equal nil, content_types.of("img/screenshot.jpg")
30
+ end
31
+ end
32
+
33
+
34
+ end
@@ -2,23 +2,17 @@ require "test_helper"
2
2
  require "fileutils"
3
3
  require "set"
4
4
 
5
-
6
5
  class OpenXmlPackageTest < ActiveSupport::TestCase
7
6
  attr_reader :package, :temp_file
8
7
 
9
8
 
10
9
 
11
10
  context "#add_part" do
12
- should "accept a path and content" do
13
- package = OpenXmlPackage.new
14
- package.add_part "PATH", "CONTENT"
15
- assert_equal 1, package.parts.count
16
- end
17
-
18
- should "accept a part that responds to :path and :read" do
19
- package = OpenXmlPackage.new
20
- package.add_part OpenXmlPackage::Part.new("PATH", "CONTENT")
21
- assert_equal 1, package.parts.count
11
+ should "accept a path and a part" do
12
+ package = OpenXml::Package.new
13
+ assert_difference "package.parts.count", +1 do
14
+ package.add_part "PATH", OpenXml::Part.new
15
+ end
22
16
  end
23
17
  end
24
18
 
@@ -32,14 +26,15 @@ class OpenXmlPackageTest < ActiveSupport::TestCase
32
26
 
33
27
  context "Given a simple part" do
34
28
  setup do
35
- @package = OpenXmlPackage.new
36
- package.add_part "content/document.xml", document_content
29
+ @package = OpenXml::Package.new
30
+ package.add_part "content/document.xml", OpenXml::Parts::UnparsedPart.new(document_content)
37
31
  end
38
32
 
39
33
  should "write a valid zip file with the expected parts" do
40
34
  package.write_to temp_file
41
35
  assert File.exists?(temp_file), "Expected the file #{temp_file.inspect} to have been created"
42
- assert_equal %w{content/document.xml}, Zip::File.open(temp_file).entries.map(&:name)
36
+ assert_equal %w{[Content_Types].xml _rels/.rels content/document.xml},
37
+ Zip::File.open(temp_file).entries.map(&:name)
43
38
  end
44
39
  end
45
40
  end
@@ -69,7 +64,7 @@ class OpenXmlPackageTest < ActiveSupport::TestCase
69
64
 
70
65
  context ".open" do
71
66
  setup do
72
- @package = OpenXmlPackage.open(temp_file)
67
+ @package = OpenXml::Package.open(temp_file)
73
68
  end
74
69
 
75
70
  teardown do
@@ -77,7 +72,7 @@ class OpenXmlPackageTest < ActiveSupport::TestCase
77
72
  end
78
73
 
79
74
  should "discover the expected parts" do
80
- assert_equal @expected_contents, package.parts.map(&:path).to_set
75
+ assert_equal @expected_contents, package.parts.keys.to_set
81
76
  end
82
77
 
83
78
  should "read their content on-demand" do
@@ -87,17 +82,48 @@ class OpenXmlPackageTest < ActiveSupport::TestCase
87
82
 
88
83
  context ".from_stream" do
89
84
  setup do
90
- @package = OpenXmlPackage.from_stream(File.open(temp_file, "rb", &:read))
85
+ @package = OpenXml::Package.from_stream(File.open(temp_file, "rb", &:read))
91
86
  end
92
87
 
93
88
  should "also discover the expected parts" do
94
- assert_equal @expected_contents, package.parts.map(&:path).to_set
89
+ assert_equal @expected_contents, package.parts.keys.to_set
95
90
  end
96
91
 
97
92
  should "read their content" do
98
93
  assert_equal web_settings_content, package.get_part("word/webSettings.xml").content
99
94
  end
100
95
  end
96
+
97
+ context "ContentTypes" do
98
+ setup do
99
+ @package = OpenXml::Package.open(temp_file)
100
+ end
101
+
102
+ teardown do
103
+ package.close
104
+ end
105
+
106
+ should "be parsed" do
107
+ assert_equal %w{jpeg png rels xml}, package.content_types.defaults.keys.sort
108
+ assert_equal "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml",
109
+ package.content_types.overrides["/word/document.xml"]
110
+ end
111
+ end
112
+
113
+ context "Rels" do
114
+ setup do
115
+ @package = OpenXml::Package.open(temp_file)
116
+ end
117
+
118
+ teardown do
119
+ package.close
120
+ end
121
+
122
+ should "be parsed" do
123
+ assert_equal %w{docProps/core.xml docProps/app.xml word/document.xml docProps/thumbnail.jpeg},
124
+ package.rels.map(&:target)
125
+ end
126
+ end
101
127
  end
102
128
  end
103
129
 
metadata CHANGED
@@ -1,145 +1,159 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open_xml_package
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Lail
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-06 00:00:00.000000000 Z
11
+ date: 2015-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
18
32
  - !ruby/object:Gem::Version
19
33
  version: '0'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
- - - '>='
38
+ - - ">="
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ~>
45
+ - - "~>"
32
46
  - !ruby/object:Gem::Version
33
47
  version: '1.6'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ~>
52
+ - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '1.6'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - '>='
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
61
  version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - '>='
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rails
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - '>='
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
75
  version: '3.2'
62
- - - <
76
+ - - "<"
63
77
  - !ruby/object:Gem::Version
64
- version: '4.1'
78
+ version: '5.0'
65
79
  type: :development
66
80
  prerelease: false
67
81
  version_requirements: !ruby/object:Gem::Requirement
68
82
  requirements:
69
- - - '>='
83
+ - - ">="
70
84
  - !ruby/object:Gem::Version
71
85
  version: '3.2'
72
- - - <
86
+ - - "<"
73
87
  - !ruby/object:Gem::Version
74
- version: '4.1'
88
+ version: '5.0'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: turn
77
91
  requirement: !ruby/object:Gem::Requirement
78
92
  requirements:
79
- - - '>='
93
+ - - ">="
80
94
  - !ruby/object:Gem::Version
81
95
  version: '0'
82
96
  type: :development
83
97
  prerelease: false
84
98
  version_requirements: !ruby/object:Gem::Requirement
85
99
  requirements:
86
- - - '>='
100
+ - - ">="
87
101
  - !ruby/object:Gem::Version
88
102
  version: '0'
89
103
  - !ruby/object:Gem::Dependency
90
104
  name: pry
91
105
  requirement: !ruby/object:Gem::Requirement
92
106
  requirements:
93
- - - '>='
107
+ - - ">="
94
108
  - !ruby/object:Gem::Version
95
109
  version: '0'
96
110
  type: :development
97
111
  prerelease: false
98
112
  version_requirements: !ruby/object:Gem::Requirement
99
113
  requirements:
100
- - - '>='
114
+ - - ">="
101
115
  - !ruby/object:Gem::Version
102
116
  version: '0'
103
117
  - !ruby/object:Gem::Dependency
104
118
  name: rr
105
119
  requirement: !ruby/object:Gem::Requirement
106
120
  requirements:
107
- - - '>='
121
+ - - ">="
108
122
  - !ruby/object:Gem::Version
109
123
  version: '0'
110
124
  type: :development
111
125
  prerelease: false
112
126
  version_requirements: !ruby/object:Gem::Requirement
113
127
  requirements:
114
- - - '>='
128
+ - - ">="
115
129
  - !ruby/object:Gem::Version
116
130
  version: '0'
117
131
  - !ruby/object:Gem::Dependency
118
132
  name: simplecov
119
133
  requirement: !ruby/object:Gem::Requirement
120
134
  requirements:
121
- - - '>='
135
+ - - ">="
122
136
  - !ruby/object:Gem::Version
123
137
  version: '0'
124
138
  type: :development
125
139
  prerelease: false
126
140
  version_requirements: !ruby/object:Gem::Requirement
127
141
  requirements:
128
- - - '>='
142
+ - - ">="
129
143
  - !ruby/object:Gem::Version
130
144
  version: '0'
131
145
  - !ruby/object:Gem::Dependency
132
146
  name: shoulda-context
133
147
  requirement: !ruby/object:Gem::Requirement
134
148
  requirements:
135
- - - '>='
149
+ - - ">="
136
150
  - !ruby/object:Gem::Version
137
151
  version: '0'
138
152
  type: :development
139
153
  prerelease: false
140
154
  version_requirements: !ruby/object:Gem::Requirement
141
155
  requirements:
142
- - - '>='
156
+ - - ">="
143
157
  - !ruby/object:Gem::Version
144
158
  version: '0'
145
159
  description: A Ruby implementation of OpenXmlPackage
@@ -149,16 +163,25 @@ executables: []
149
163
  extensions: []
150
164
  extra_rdoc_files: []
151
165
  files:
152
- - .gitignore
166
+ - ".gitignore"
153
167
  - Gemfile
154
168
  - LICENSE.txt
155
169
  - README.md
156
170
  - Rakefile
171
+ - lib/open_xml/content_types_presets.rb
172
+ - lib/open_xml/errors.rb
173
+ - lib/open_xml/package.rb
174
+ - lib/open_xml/part.rb
175
+ - lib/open_xml/parts.rb
176
+ - lib/open_xml/parts/content_types.rb
177
+ - lib/open_xml/parts/rels.rb
178
+ - lib/open_xml/parts/unparsed_part.rb
179
+ - lib/open_xml/rubyzip_fix.rb
180
+ - lib/open_xml/types.rb
157
181
  - lib/open_xml_package.rb
158
- - lib/open_xml_package/part.rb
159
- - lib/open_xml_package/rubyzip_fix.rb
160
182
  - lib/open_xml_package/version.rb
161
183
  - open_xml_package.gemspec
184
+ - test/content_types_test.rb
162
185
  - test/open_xml_package_test.rb
163
186
  - test/support/sample.docx
164
187
  - test/test_helper.rb
@@ -172,21 +195,22 @@ require_paths:
172
195
  - lib
173
196
  required_ruby_version: !ruby/object:Gem::Requirement
174
197
  requirements:
175
- - - '>='
198
+ - - ">="
176
199
  - !ruby/object:Gem::Version
177
200
  version: '0'
178
201
  required_rubygems_version: !ruby/object:Gem::Requirement
179
202
  requirements:
180
- - - '>='
203
+ - - ">"
181
204
  - !ruby/object:Gem::Version
182
- version: '0'
205
+ version: 1.3.1
183
206
  requirements: []
184
207
  rubyforge_project:
185
- rubygems_version: 2.2.1
208
+ rubygems_version: 2.2.2
186
209
  signing_key:
187
210
  specification_version: 4
188
211
  summary: A Ruby implementation of OpenXmlPackage
189
212
  test_files:
213
+ - test/content_types_test.rb
190
214
  - test/open_xml_package_test.rb
191
215
  - test/support/sample.docx
192
216
  - test/test_helper.rb
@@ -1,14 +0,0 @@
1
- class OpenXmlPackage
2
- class Part < Struct.new(:path, :content)
3
-
4
- def content
5
- self[:content] = self[:content].get_input_stream.read if promise?
6
- super
7
- end
8
-
9
- def promise?
10
- self[:content].respond_to?(:get_input_stream)
11
- end
12
-
13
- end
14
- end