docxi 0.0.6 → 0.1.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
- SHA1:
3
- metadata.gz: 5076084e490ded4f975883817964681a11cb0020
4
- data.tar.gz: 8e6c401e687f6eaad1c5a1c23060481f0e552576
2
+ SHA256:
3
+ metadata.gz: c1dc965f6024c4edc44877ee9eab41d37d01902fd45300e6d8a889e7eb68c32e
4
+ data.tar.gz: 2b6f6482b0dc4589e4a77e2bf00b5d8d28bfe350265bca015faef3274260d7e6
5
5
  SHA512:
6
- metadata.gz: 2b1f94d68e5d454c5703c9c26ab851bd4a886a2c7c7c27f8162d7fa2ef3599dd0eb179e02f18a1bef9065b4df27c31bff15f3383d0e99e0e95279f184b152a52
7
- data.tar.gz: 7e714bdd0ccbfb487180beb5ef57f3fbb84c3ff6661d929d0750d9bc2f336cbf6af9b5b8ff4a14b962cd299ec7942cf181664e8feef9f3bcd6318bc30086f396
6
+ metadata.gz: 143893cbd4f2ac9973059aa1760a56ada3c81ecc290c19d33b1af05d4958d738ee7afb006a18e37c2b6465218713e73c1772c629c506364026bba1833b668e2e
7
+ data.tar.gz: 626c1713161acd877bee8fd730f1bc67907a14835a37180d66a603ac2c9348ef780a80460f8fab7cd175a33a06c610047b3f325c6fcf22a774aa345750f7c868
data/CHANGELOG.md ADDED
@@ -0,0 +1,31 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (2026-10-28)
4
+
5
+ docxi installs and runs again in current apps, with or without Rails. No code changes are needed, and the generated documents are the same as 0.0.6's (the tests compare them against 0.0.6's output).
6
+
7
+ ### Compatibility
8
+
9
+ - Requires Ruby 2.5 or newer. Apps on older Rubies stay on 0.0.6.
10
+ - Works with or without Rails, and is tested alongside Rails 5.2 through 8.1.
11
+ - nokogiri `>= 1.8, < 2` instead of `>= 1.6.3, < 1.7`, which conflicted with every Rails version since 6.0.
12
+ - rubyzip `>= 1.3, < 4` instead of `~> 0.9.9`.
13
+ - No longer calls ActiveSupport's `blank?` and `present?`, which only worked when Rails had loaded them.
14
+
15
+ ### Fixes
16
+
17
+ - Documents written with rubyzip 3 no longer contain Zip64 records, which Google Docs and older LibreOffice versions reject.
18
+ - `add_media` with an image URL works on Ruby 3 again.
19
+ - `add_media` no longer runs a string that starts with `|` as a shell command.
20
+ - `tab` and `frame` no longer raise `NameError`.
21
+ - `document.frame("text")` no longer raises `TypeError`.
22
+ - `page_numbers` in a header no longer raises `NameError`.
23
+
24
+ ### Gem
25
+
26
+ - New maintainer, homepage and changelog links.
27
+ - Releases require MFA.
28
+
29
+ ## 0.0.6 (2016-10-18)
30
+
31
+ Last release before the 0.1.0 update.
data/README.md CHANGED
@@ -13,6 +13,26 @@ Docxi gem provides ability to create docx documents using Ruby.
13
13
  At the moment, the gem supports a limited number of functions, but the development of the gem is still in progress, and perhaps functionality will be expanded in the future. First of all, try to add documentation for the code and tests.
14
14
  ## NOTE
15
15
  Use Latest version of Gem. Old Version has bugs.
16
+
17
+ ## Installation
18
+
19
+ ```ruby
20
+ gem "docxi", "~> 0.1"
21
+ ```
22
+
23
+ ## Supported versions
24
+
25
+ | Dependency | Supported versions |
26
+ |---|---|
27
+ | Ruby | 2.5 or newer |
28
+ | Rails | Not required. Tested alongside Rails 5.2, 6.0, 6.1, 7.0, 7.1, 7.2, 8.0 and 8.1 |
29
+ | nokogiri | 1.8 or newer |
30
+ | rubyzip | 1.3 or newer, including 3.x |
31
+
32
+ ### Upgrading from 0.0.x
33
+
34
+ Run `bundle update docxi`. The API is unchanged and 0.1.0 generates the same documents as 0.0.6. Apps on a Ruby older than 2.5 stay on 0.0.6 automatically.
35
+
16
36
  ## Usage
17
37
 
18
38
  ```ruby
@@ -133,7 +153,7 @@ document.p do |p|
133
153
  # Adds image to container
134
154
  media = document.add_media File.open('image.png')
135
155
  # Or add image URL
136
- media = document.add_media image_url
156
+ # media = document.add_media image_url
137
157
  # Insert media into paragraph
138
158
  p.image media, style: { width: '200pt', height: '200pt' }
139
159
 
@@ -157,4 +177,18 @@ end
157
177
  # Creates Word Document
158
178
  io = word.render
159
179
  File.open('doc_1.docx', 'wb'){|f| f.write(io.string) }
160
- ```
180
+ ```
181
+
182
+ ## Development
183
+
184
+ ```sh
185
+ bundle install
186
+ bundle exec rake test # run the tests
187
+ bundle exec rake samples # write tmp/samples/*.docx to open in Word, LibreOffice or Google Docs
188
+
189
+ # run the tests with a specific Rails version loaded
190
+ BUNDLE_GEMFILE=gemfiles/rails_8.1.gemfile bundle install
191
+ BUNDLE_GEMFILE=gemfiles/rails_8.1.gemfile DOCXI_WITH_RAILS=1 bundle exec rake test
192
+ ```
193
+
194
+ `test/golden` holds the XML that 0.0.6 generated for the sample documents in `test/support/sample_documents.rb`, and the tests check every release against it. After an intentional change to the generated XML, update it with `bundle exec rake golden` and review the diff.
data/Rakefile CHANGED
@@ -4,6 +4,34 @@ require 'rake/testtask'
4
4
 
5
5
  Rake::TestTask.new do |t|
6
6
  t.libs << 'test'
7
+ t.pattern = 'test/**/test_*.rb'
8
+ t.warning = false
9
+ end
10
+
11
+ desc 'Rewrite test/golden from the current code (only after an intentional output change)'
12
+ task :golden do
13
+ $LOAD_PATH.unshift File.expand_path('lib', __dir__)
14
+ require 'docxi'
15
+ require_relative 'test/support/package'
16
+ require_relative 'test/support/sample_documents'
17
+
18
+ SampleDocuments.all.each do |name, word|
19
+ Package.write_golden(File.join(__dir__, 'test', 'golden', name), word.render.string)
20
+ end
21
+ end
22
+
23
+ desc 'Write the sample documents to tmp/samples for opening in Word, LibreOffice or Google Docs'
24
+ task :samples do
25
+ $LOAD_PATH.unshift File.expand_path('lib', __dir__)
26
+ require 'docxi'
27
+ require 'fileutils'
28
+ require_relative 'test/support/sample_documents'
29
+
30
+ FileUtils.mkdir_p('tmp/samples')
31
+ SampleDocuments.all.each do |name, word|
32
+ File.binwrite("tmp/samples/#{name}.docx", word.render.string)
33
+ puts "tmp/samples/#{name}.docx"
34
+ end
7
35
  end
8
36
 
9
37
  desc "Run tests"
@@ -39,8 +39,7 @@ module Docxi
39
39
  end
40
40
 
41
41
  def render(zip)
42
- zip.put_next_entry('[Content_Types].xml')
43
- zip.write(Docxi.to_xml(document))
42
+ Docxi.write_entry(zip, '[Content_Types].xml', Docxi.to_xml(document))
44
43
  end
45
44
 
46
45
  private
@@ -24,7 +24,7 @@ module Docxi
24
24
  end
25
25
 
26
26
  def render
27
- Zip::ZipOutputStream.write_buffer do |zip|
27
+ Zip::OutputStream.write_buffer do |zip|
28
28
  document.render(zip)
29
29
  properties.render(zip)
30
30
  relationships.render(zip)
@@ -18,11 +18,9 @@ module Docxi
18
18
  end
19
19
 
20
20
  def render(zip)
21
- zip.put_next_entry('docProps/app.xml')
22
- zip.write(Docxi.to_xml(app.document))
21
+ Docxi.write_entry(zip, 'docProps/app.xml', Docxi.to_xml(app.document))
23
22
 
24
- zip.put_next_entry('docProps/core.xml')
25
- zip.write(Docxi.to_xml(core.document))
23
+ Docxi.write_entry(zip, 'docProps/core.xml', Docxi.to_xml(core.document))
26
24
  end
27
25
 
28
26
  end
@@ -21,8 +21,7 @@ module Docxi
21
21
  end
22
22
 
23
23
  def render(zip)
24
- zip.put_next_entry('_rels/.rels')
25
- zip.write(Docxi.to_xml(document))
24
+ Docxi.write_entry(zip, '_rels/.rels', Docxi.to_xml(document))
26
25
  end
27
26
 
28
27
  private
data/lib/docxi/util.rb ADDED
@@ -0,0 +1,19 @@
1
+ module Docxi
2
+ module Util
3
+
4
+ # Same rules as ActiveSupport's Object#blank?, which older versions of this
5
+ # gem called without depending on ActiveSupport.
6
+ def self.blank?(value)
7
+ case value
8
+ when nil, false then true
9
+ when String then /\A[[:space:]]*\z/ === value
10
+ else value.respond_to?(:empty?) ? !!value.empty? : false
11
+ end
12
+ end
13
+
14
+ def self.present?(value)
15
+ !blank?(value)
16
+ end
17
+
18
+ end
19
+ end
data/lib/docxi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Docxi
2
- VERSION = "0.0.6"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -85,7 +85,7 @@ module Docxi
85
85
  end
86
86
  else
87
87
  xml['v'].rect("fillcolor"=> options[:fill_color], 'id' => @media.uniq_id, 'type' => @media.type, 'style' => styles, :stroked => "f" ) do
88
- if options[:opacity].present?
88
+ if Docxi::Util.present?(options[:opacity])
89
89
  xml['v'].fill("opacity" => options[:opacity])
90
90
  end
91
91
  xml['v'].imagedata( 'r:id' => @media.sequence, 'o:title' => @options[:title] )
@@ -92,7 +92,7 @@ module Docxi
92
92
 
93
93
  def render(xml)
94
94
  xml['w'].tr do
95
- if options[:height].present?
95
+ if Docxi::Util.present?(options[:height])
96
96
  xml['w'].trPr do
97
97
  xml['w'].trHeight('w:val' => options[:height], 'w:hRule' => 'atLeast')
98
98
  xml['w'].cantSplit('w:val' => 'false')
@@ -119,7 +119,7 @@ module Docxi
119
119
  end
120
120
 
121
121
  def render(xml)
122
- if options[:fill].blank?
122
+ if Docxi::Util.blank?(options[:fill])
123
123
  options[:fill] = 'FFFFFF'
124
124
  end
125
125
  xml['w'].tc do
@@ -1,4 +1,6 @@
1
1
  require 'docxi/word/contents/break'
2
+ require 'docxi/word/contents/tab'
3
+ require 'docxi/word/contents/frame'
2
4
  require 'docxi/word/contents/text'
3
5
  require 'docxi/word/contents/table_of_content'
4
6
  require 'docxi/word/contents/image'
@@ -125,8 +125,7 @@ module Docxi
125
125
  end
126
126
 
127
127
  def render(zip)
128
- zip.put_next_entry('word/document.xml')
129
- zip.write(Docxi.to_xml(document))
128
+ Docxi.write_entry(zip, 'word/document.xml', Docxi.to_xml(document))
130
129
 
131
130
  fonts.render(zip)
132
131
  settings.render(zip)
@@ -166,7 +165,7 @@ module Docxi
166
165
  xml['w'].footerReference( 'w:type' => "first", 'r:id' => @first_footer.sequence ) if @first_footer
167
166
  xml['w'].titlePg
168
167
  xml['w'].pgSz( 'w:w' => 12240, 'w:h' => 15840 )
169
- xml['w'].pgMar( 'w:top' => @options[:top], 'w:right' => @options[:right], 'w:bottom' => @options[:bottom], 'w:left' => @options[:left], 'w:header' => @options[:header].present? ? @options[:header] : 190, 'w:footer' => @options[:footer].present? ? @options[:footer] : 200 , 'w:gutter' => 0)
168
+ xml['w'].pgMar( 'w:top' => @options[:top], 'w:right' => @options[:right], 'w:bottom' => @options[:bottom], 'w:left' => @options[:left], 'w:header' => Docxi::Util.present?(@options[:header]) ? @options[:header] : 190, 'w:footer' => Docxi::Util.present?(@options[:footer]) ? @options[:footer] : 200 , 'w:gutter' => 0)
170
169
  xml['w'].cols( 'w:space' => 720)
171
170
  xml['w'].docGrid( 'w:linePitch' => "360")
172
171
  end
@@ -8,8 +8,7 @@ module Docxi
8
8
  end
9
9
 
10
10
  def render(zip)
11
- zip.put_next_entry('word/stylesWithEffects.xml')
12
- zip.write(Docxi.to_xml(document))
11
+ Docxi.write_entry(zip, 'word/stylesWithEffects.xml', Docxi.to_xml(document))
13
12
  end
14
13
 
15
14
  private
@@ -8,8 +8,7 @@ module Docxi
8
8
  end
9
9
 
10
10
  def render(zip)
11
- zip.put_next_entry('word/endnotes.xml')
12
- zip.write(Docxi.to_xml(document))
11
+ Docxi.write_entry(zip, 'word/endnotes.xml', Docxi.to_xml(document))
13
12
  end
14
13
 
15
14
  def document
@@ -20,8 +20,7 @@ module Docxi
20
20
  end
21
21
 
22
22
  def render(zip)
23
- zip.put_next_entry('word/fontTable.xml')
24
- zip.write(Docxi.to_xml(document))
23
+ Docxi.write_entry(zip, 'word/fontTable.xml', Docxi.to_xml(document))
25
24
  end
26
25
 
27
26
  private
@@ -33,12 +33,10 @@ module Docxi
33
33
  end
34
34
 
35
35
  def render(zip)
36
- zip.put_next_entry("word/#{target}")
37
- zip.write(Docxi.to_xml(document))
36
+ Docxi.write_entry(zip, "word/#{target}", Docxi.to_xml(document))
38
37
 
39
38
  if !@relationships.empty?
40
- zip.put_next_entry("word/_rels/#{target}.rels")
41
- zip.write(Docxi.to_xml(relationships))
39
+ Docxi.write_entry(zip, "word/_rels/#{target}.rels", Docxi.to_xml(relationships))
42
40
  end
43
41
  end
44
42
 
@@ -8,8 +8,7 @@ module Docxi
8
8
  end
9
9
 
10
10
  def render(zip)
11
- zip.put_next_entry('word/footnotes.xml')
12
- zip.write(Docxi.to_xml(document))
11
+ Docxi.write_entry(zip, 'word/footnotes.xml', Docxi.to_xml(document))
13
12
  end
14
13
 
15
14
  private
@@ -27,12 +27,10 @@ module Docxi
27
27
  end
28
28
 
29
29
  def render(zip)
30
- zip.put_next_entry("word/#{target}")
31
- zip.write(Docxi.to_xml(document))
30
+ Docxi.write_entry(zip, "word/#{target}", Docxi.to_xml(document))
32
31
 
33
32
  if !@relationships.empty?
34
- zip.put_next_entry("word/_rels/#{target}.rels")
35
- zip.write(Docxi.to_xml(relationships))
33
+ Docxi.write_entry(zip, "word/_rels/#{target}.rels", Docxi.to_xml(relationships))
36
34
  end
37
35
  end
38
36
 
@@ -52,8 +50,8 @@ module Docxi
52
50
  element
53
51
  end
54
52
 
55
- def page_numbers
56
- numbers = PageNumbers.new
53
+ def page_numbers(options={})
54
+ numbers = Docxi::Word::Footers::Footer::PageNumbers.new(options)
57
55
  @content << numbers
58
56
  numbers
59
57
  end
@@ -10,7 +10,7 @@ module Docxi
10
10
 
11
11
  def frame(text, options={})
12
12
  p(options) do |p|
13
- p.frame text
13
+ p.frame(options) { |f| f.text text }
14
14
  end
15
15
  end
16
16
 
@@ -31,11 +31,9 @@ module Docxi
31
31
  end
32
32
 
33
33
  def render(zip)
34
- zip.put_next_entry("word/#{target}")
35
- zip.write(Docxi.to_xml(document))
34
+ Docxi.write_entry(zip, "word/#{target}", Docxi.to_xml(document))
36
35
  if !@relationships.empty?
37
- zip.put_next_entry("word/_rels/#{target}.rels")
38
- zip.write(Docxi.to_xml(relationships))
36
+ Docxi.write_entry(zip, "word/_rels/#{target}.rels", Docxi.to_xml(relationships))
39
37
  end
40
38
  end
41
39
 
@@ -3,6 +3,8 @@ module Docxi
3
3
  class Medias
4
4
  class Media
5
5
 
6
+ URL = %r{\A(?:https?|ftp)://}i
7
+
6
8
  attr_accessor :id, :sequence, :file
7
9
  def initialize(id, file, options)
8
10
  @id = id
@@ -10,6 +12,22 @@ module Docxi
10
12
  self
11
13
  end
12
14
 
15
+ # Strings are URLs or file paths. Kernel#open, and File.binread on
16
+ # Ruby 2.5, run strings starting with "|" as shell commands, and
17
+ # Kernel#open stopped fetching URLs in Ruby 3.
18
+ def read
19
+ if @file.is_a?(String)
20
+ if @file =~ URL
21
+ require 'open-uri'
22
+ URI.parse(@file).open { |io| io.read }
23
+ else
24
+ File.open(@file, 'rb') { |file| file.read }
25
+ end
26
+ else
27
+ @file.read
28
+ end
29
+ end
30
+
13
31
  def set_sequence(sequence)
14
32
  @sequence = sequence
15
33
  self
@@ -21,14 +21,7 @@ module Docxi
21
21
 
22
22
  def render(zip)
23
23
  @medias.each do |media|
24
- zip.put_next_entry("word/#{media.target}")
25
- if media.file.class == String
26
- file = open(media.file)
27
- zip.write(file.read)
28
- file.close
29
- else
30
- zip.write(media.file.read)
31
- end
24
+ Docxi.write_entry(zip, "word/#{media.target}", media.read)
32
25
  end
33
26
  end
34
27
 
@@ -9,8 +9,7 @@ module Docxi
9
9
  end
10
10
 
11
11
  def render(zip)
12
- zip.put_next_entry('word/numbering.xml')
13
- zip.write(Docxi.to_xml(document))
12
+ Docxi.write_entry(zip, 'word/numbering.xml', Docxi.to_xml(document))
14
13
  end
15
14
 
16
15
  private
@@ -13,7 +13,7 @@ module Docxi
13
13
  end
14
14
 
15
15
  def build(xml)
16
- if @tm.blank?
16
+ if Docxi::Util.blank?(@tm)
17
17
  xml.Relationship('Id' => @id, 'Type' => @type, 'Target' => @target)
18
18
  else
19
19
  xml.Relationship('Id' => @id, 'Type' => @type, 'Target' => @target, 'TargetMode' => @tm)
@@ -28,8 +28,7 @@ module Docxi
28
28
  end
29
29
 
30
30
  def render(zip)
31
- zip.put_next_entry('word/_rels/document.xml.rels')
32
- zip.write(Docxi.to_xml(document))
31
+ Docxi.write_entry(zip, 'word/_rels/document.xml.rels', Docxi.to_xml(document))
33
32
  end
34
33
 
35
34
  private
@@ -8,8 +8,7 @@ module Docxi
8
8
  end
9
9
 
10
10
  def render(zip)
11
- zip.put_next_entry('word/settings.xml')
12
- zip.write(Docxi.to_xml(document))
11
+ Docxi.write_entry(zip, 'word/settings.xml', Docxi.to_xml(document))
13
12
  end
14
13
 
15
14
  private
@@ -8,8 +8,7 @@ module Docxi
8
8
  end
9
9
 
10
10
  def render(zip)
11
- zip.put_next_entry('word/styles.xml')
12
- zip.write(Docxi.to_xml(document))
11
+ Docxi.write_entry(zip, 'word/styles.xml', Docxi.to_xml(document))
13
12
  end
14
13
 
15
14
  private
@@ -20,8 +20,7 @@ module Docxi
20
20
 
21
21
  def render(zip)
22
22
  @themes.each do |theme|
23
- zip.put_next_entry("word/theme/theme#{theme.sequence}.xml")
24
- zip.write(theme.render)
23
+ Docxi.write_entry(zip, "word/theme/theme#{theme.sequence}.xml", theme.render)
25
24
  end
26
25
  end
27
26
 
@@ -8,8 +8,7 @@ module Docxi
8
8
  end
9
9
 
10
10
  def render(zip)
11
- zip.put_next_entry('word/webSettings.xml')
12
- zip.write(Docxi.to_xml(document))
11
+ Docxi.write_entry(zip, 'word/webSettings.xml', Docxi.to_xml(document))
13
12
  end
14
13
 
15
14
  private
data/lib/docxi.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'nokogiri'
2
- require 'zip/zip'
2
+ require 'zip'
3
3
 
4
+ require 'docxi/version'
5
+ require 'docxi/util'
4
6
  require 'docxi/relationships'
5
7
  require 'docxi/content_types'
6
8
  require 'docxi/properties'
@@ -13,6 +15,15 @@ module Docxi
13
15
  document.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML).gsub("\n", "\r\n").strip
14
16
  end
15
17
 
18
+ # The size is set up front because rubyzip 3 otherwise adds Zip64 extra
19
+ # fields to every entry, and Google Docs and older LibreOffice reject those.
20
+ def self.write_entry(zip, name, data)
21
+ entry = Zip::Entry.new('', name)
22
+ entry.size = data.bytesize
23
+ zip.put_next_entry(entry)
24
+ zip.write(data)
25
+ end
26
+
16
27
  def self.test
17
28
  word = Docxi::Document.new
18
29
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docxi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - Irfan Babar
8
- autorequire:
7
+ - Hammad Maqbool
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2016-10-14 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: nokogiri
@@ -16,40 +15,89 @@ dependencies:
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: 1.6.3
18
+ version: '1.8'
20
19
  - - "<"
21
20
  - !ruby/object:Gem::Version
22
- version: '1.7'
21
+ version: '2'
23
22
  type: :runtime
24
23
  prerelease: false
25
24
  version_requirements: !ruby/object:Gem::Requirement
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- version: 1.6.3
28
+ version: '1.8'
30
29
  - - "<"
31
30
  - !ruby/object:Gem::Version
32
- version: '1.7'
31
+ version: '2'
33
32
  - !ruby/object:Gem::Dependency
34
33
  name: rubyzip
35
34
  requirement: !ruby/object:Gem::Requirement
36
35
  requirements:
37
- - - "~>"
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '1.3'
39
+ - - "<"
38
40
  - !ruby/object:Gem::Version
39
- version: 0.9.9
41
+ version: '4'
40
42
  type: :runtime
41
43
  prerelease: false
42
44
  version_requirements: !ruby/object:Gem::Requirement
43
45
  requirements:
44
- - - "~>"
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '1.3'
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '4'
52
+ - !ruby/object:Gem::Dependency
53
+ name: minitest
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '5.15'
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '7'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
45
67
  - !ruby/object:Gem::Version
46
- version: 0.9.9
68
+ version: '5.15'
69
+ - - "<"
70
+ - !ruby/object:Gem::Version
71
+ version: '7'
72
+ - !ruby/object:Gem::Dependency
73
+ name: rake
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '12'
79
+ - - "<"
80
+ - !ruby/object:Gem::Version
81
+ version: '14'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '12'
89
+ - - "<"
90
+ - !ruby/object:Gem::Version
91
+ version: '14'
47
92
  description: Create docx template using Ruby
48
- email: salman.shan@phaedrasolutions.com
93
+ email:
94
+ - hammad.maqbool@phaedrasolutions.com
95
+ - hammad417@gmail.com
49
96
  executables: []
50
97
  extensions: []
51
98
  extra_rdoc_files: []
52
99
  files:
100
+ - CHANGELOG.md
53
101
  - LICENSE
54
102
  - README.md
55
103
  - Rakefile
@@ -63,6 +111,7 @@ files:
63
111
  - lib/docxi/properties/core.rb
64
112
  - lib/docxi/relationships.rb
65
113
  - lib/docxi/relationships/relationship.rb
114
+ - lib/docxi/util.rb
66
115
  - lib/docxi/version.rb
67
116
  - lib/docxi/word.rb
68
117
  - lib/docxi/word/contents.rb
@@ -97,11 +146,14 @@ files:
97
146
  - lib/docxi/word/themes.rb
98
147
  - lib/docxi/word/themes/theme.rb
99
148
  - lib/docxi/word/web_settings.rb
100
- homepage: ''
149
+ homepage: https://github.com/hammad417/docxi
101
150
  licenses:
102
151
  - MIT
103
- metadata: {}
104
- post_install_message:
152
+ metadata:
153
+ source_code_uri: https://github.com/hammad417/docxi
154
+ changelog_uri: https://github.com/hammad417/docxi/blob/master/CHANGELOG.md
155
+ bug_tracker_uri: https://github.com/hammad417/docxi/issues
156
+ rubygems_mfa_required: 'true'
105
157
  rdoc_options: []
106
158
  require_paths:
107
159
  - lib
@@ -109,16 +161,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
109
161
  requirements:
110
162
  - - ">="
111
163
  - !ruby/object:Gem::Version
112
- version: '0'
164
+ version: '2.5'
113
165
  required_rubygems_version: !ruby/object:Gem::Requirement
114
166
  requirements:
115
167
  - - ">="
116
168
  - !ruby/object:Gem::Version
117
169
  version: '0'
118
170
  requirements: []
119
- rubyforge_project:
120
- rubygems_version: 2.4.3
121
- signing_key:
171
+ rubygems_version: 4.0.20
122
172
  specification_version: 4
123
173
  summary: Docx Template Generator
124
174
  test_files: []