clamsy 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.txt +6 -0
- data/README.rdoc +3 -4
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/clamsy.gemspec +5 -5
- data/lib/clamsy.rb +27 -25
- data/spec/spec_helper.rb +2 -1
- metadata +13 -12
data/HISTORY.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 0.0.2 (Apr 22, 2010)
|
2
|
+
|
3
|
+
= 2nd official (yet still as embarrassing) release
|
4
|
+
|
5
|
+
* instead of using system ps2pdf & pdf2ps commands, we use rghost gem to take care of ps/pdf conversions [#ngty]
|
6
|
+
|
1
7
|
=== 0.0.1 (Apr 21, 2010)
|
2
8
|
|
3
9
|
= 1st official (yet embarrassing) release
|
data/README.rdoc
CHANGED
@@ -11,7 +11,7 @@ Ruby wrapper for generating a single pdf for multiple contexts from an odt templ
|
|
11
11
|
(how bad it is depends on ur platform) & even manual setting up of
|
12
12
|
cups printer is needed
|
13
13
|
|
14
|
-
== Using It
|
14
|
+
== Using It (sorry, still WIP for more decent examples)
|
15
15
|
|
16
16
|
#1. Generating single context pdf:
|
17
17
|
|
@@ -53,10 +53,9 @@ Ruby wrapper for generating a single pdf for multiple contexts from an odt templ
|
|
53
53
|
|
54
54
|
* add support for configuration, eg. Clamsy.configure {|config| ... }
|
55
55
|
|
56
|
-
*
|
56
|
+
* automate cups-pdf printer setup
|
57
57
|
|
58
|
-
*
|
59
|
-
for these foreign function calls (eg. using ffi ??)
|
58
|
+
* avoid making system call to 'ooffice'
|
60
59
|
|
61
60
|
== Note on Patches/Pull Requests
|
62
61
|
|
data/Rakefile
CHANGED
@@ -11,8 +11,8 @@ begin
|
|
11
11
|
gem.homepage = "http://github.com/ngty/clamsy"
|
12
12
|
gem.authors = ["NgTzeYang"]
|
13
13
|
gem.add_dependency "rubyzip", "= 0.9.4"
|
14
|
+
gem.add_dependency "rghost", "= 0.8.7.2"
|
14
15
|
gem.add_development_dependency "bacon", ">= 1.1.0"
|
15
|
-
gem.add_development_dependency "differ", ">= 0.1.1"
|
16
16
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
17
17
|
end
|
18
18
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/clamsy.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{clamsy}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["NgTzeYang"]
|
12
|
-
s.date = %q{2010-04-
|
12
|
+
s.date = %q{2010-04-22}
|
13
13
|
s.description = %q{}
|
14
14
|
s.email = %q{ngty77@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -54,17 +54,17 @@ Gem::Specification.new do |s|
|
|
54
54
|
|
55
55
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
56
56
|
s.add_runtime_dependency(%q<rubyzip>, ["= 0.9.4"])
|
57
|
+
s.add_runtime_dependency(%q<rghost>, ["= 0.8.7.2"])
|
57
58
|
s.add_development_dependency(%q<bacon>, [">= 1.1.0"])
|
58
|
-
s.add_development_dependency(%q<differ>, [">= 0.1.1"])
|
59
59
|
else
|
60
60
|
s.add_dependency(%q<rubyzip>, ["= 0.9.4"])
|
61
|
+
s.add_dependency(%q<rghost>, ["= 0.8.7.2"])
|
61
62
|
s.add_dependency(%q<bacon>, [">= 1.1.0"])
|
62
|
-
s.add_dependency(%q<differ>, [">= 0.1.1"])
|
63
63
|
end
|
64
64
|
else
|
65
65
|
s.add_dependency(%q<rubyzip>, ["= 0.9.4"])
|
66
|
+
s.add_dependency(%q<rghost>, ["= 0.8.7.2"])
|
66
67
|
s.add_dependency(%q<bacon>, [">= 1.1.0"])
|
67
|
-
s.add_dependency(%q<differ>, [">= 0.1.1"])
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
data/lib/clamsy.rb
CHANGED
@@ -3,9 +3,12 @@ require 'digest/md5'
|
|
3
3
|
require 'tempfile'
|
4
4
|
require 'zip/zip'
|
5
5
|
require 'clamsy/tenjin'
|
6
|
+
require 'rghost'
|
6
7
|
|
7
8
|
module Clamsy
|
8
9
|
|
10
|
+
class MissingFileError < Exception ; end
|
11
|
+
|
9
12
|
class << self
|
10
13
|
|
11
14
|
def process(contexts, template_odt, final_pdf)
|
@@ -28,7 +31,7 @@ module Clamsy
|
|
28
31
|
(@trashable_tmp_files || []).select {|f| f.path }.map(&:unlink)
|
29
32
|
end
|
30
33
|
|
31
|
-
def
|
34
|
+
def tmp_file(file_name)
|
32
35
|
((@trashable_tmp_files ||= []) << Tempfile.new(file_name))[-1]
|
33
36
|
end
|
34
37
|
|
@@ -57,7 +60,7 @@ module Clamsy
|
|
57
60
|
def working_odt
|
58
61
|
(@working_odts ||= {})[@context_id] ||=
|
59
62
|
begin
|
60
|
-
dest_odt =
|
63
|
+
dest_odt = tmp_file(@context_id)
|
61
64
|
File.copy(@template_odt, dest_odt.path) ; dest_odt
|
62
65
|
end
|
63
66
|
end
|
@@ -66,7 +69,7 @@ module Clamsy
|
|
66
69
|
lambda do |entry|
|
67
70
|
(@workers ||= {})[entry.to_s] ||=
|
68
71
|
begin
|
69
|
-
tmp_file =
|
72
|
+
tmp_file = tmp_file("#{@context_id}.#{File.basename(entry.to_s)}")
|
70
73
|
tmp_file.write(entry.get_input_stream.read)
|
71
74
|
tmp_file.close
|
72
75
|
Tenjin::Template.new(tmp_file.path)
|
@@ -86,24 +89,16 @@ module Clamsy
|
|
86
89
|
# to be set up in cups.
|
87
90
|
ODT_TO_PDF_CMD = "ooffice -norestore -nofirststartwizard -nologo -headless -pt Cups-PDF"
|
88
91
|
|
89
|
-
# PDF to PS & vice versa
|
90
|
-
PDF_TO_PS_CMD = "pdf2ps"
|
91
|
-
PS_TO_PDF_CMD = "ps2pdf"
|
92
|
-
|
93
|
-
# Misc commands
|
94
|
-
CAT_CMD = 'cat'
|
95
|
-
|
96
92
|
class << self
|
97
93
|
|
98
94
|
include HasTrashableTempFiles
|
99
95
|
|
100
96
|
def print_odts_to_pdf(from_odts, to_pdf)
|
101
97
|
begin
|
102
|
-
tmp_ps =
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
].join(' && '))
|
98
|
+
tmp_ps = tmp_file(File.basename(to_pdf, '.pdf'))
|
99
|
+
from_odts.map {|odt| tmp_ps << odt_to_ps_stream(odt) }
|
100
|
+
tmp_ps.close
|
101
|
+
gs_convert(:pdf, tmp_ps.path, to_pdf)
|
107
102
|
ensure
|
108
103
|
trash_tmp_files
|
109
104
|
end
|
@@ -111,16 +106,23 @@ module Clamsy
|
|
111
106
|
|
112
107
|
private
|
113
108
|
|
114
|
-
def
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
109
|
+
def odt_to_ps_stream(odt)
|
110
|
+
ensure_file_exists!(odt_path = odt.path)
|
111
|
+
pdf_path = File.join(PDF_OUTPUT_DIR, File.basename(odt_path, '.odt')) + '.pdf'
|
112
|
+
system("#{ODT_TO_PDF_CMD} #{odt_path}")
|
113
|
+
gs_convert(:ps, pdf_path)
|
114
|
+
end
|
115
|
+
|
116
|
+
def gs_convert(format, src_path, dest_path=nil)
|
117
|
+
ensure_file_exists!(src_path)
|
118
|
+
method, opts = dest_path ? [:path, {:filename => dest_path}] : [:read, {}]
|
119
|
+
RGhost::Convert.new(src_path).to(format, opts).send(method)
|
120
|
+
end
|
121
|
+
|
122
|
+
def ensure_file_exists!(file_path)
|
123
|
+
exist_flg = false
|
124
|
+
0.upto(10) {|i| File.exists?(file_path) ? (exist_flg = true; break) : sleep(1) }
|
125
|
+
exist_flg or raise MissingFileError.new(file_path)
|
124
126
|
end
|
125
127
|
|
126
128
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'bacon'
|
3
3
|
require 'differ'
|
4
4
|
require 'tempfile'
|
5
|
+
require 'digest/md5'
|
5
6
|
|
6
7
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
7
8
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
@@ -19,7 +20,7 @@ shared 'has standard files support' do
|
|
19
20
|
data_file("#{name}_example.pdf")
|
20
21
|
end
|
21
22
|
def comparable_content(file)
|
22
|
-
|
23
|
+
RGhost::Convert.new(file).to(:ps).read.grep(/^[^%][^%]?/).
|
23
24
|
reject {|line| line =~ /^q\[\-?\d+( \-?\d+){5}\]concat\n$/ }
|
24
25
|
end
|
25
26
|
def trash_tmp_files
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- NgTzeYang
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-22 00:00:00 +08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -32,31 +32,32 @@ dependencies:
|
|
32
32
|
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
35
|
+
name: rghost
|
36
36
|
prerelease: false
|
37
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - "
|
39
|
+
- - "="
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
segments:
|
42
|
-
- 1
|
43
|
-
- 1
|
44
42
|
- 0
|
45
|
-
|
46
|
-
|
43
|
+
- 8
|
44
|
+
- 7
|
45
|
+
- 2
|
46
|
+
version: 0.8.7.2
|
47
|
+
type: :runtime
|
47
48
|
version_requirements: *id002
|
48
49
|
- !ruby/object:Gem::Dependency
|
49
|
-
name:
|
50
|
+
name: bacon
|
50
51
|
prerelease: false
|
51
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
52
53
|
requirements:
|
53
54
|
- - ">="
|
54
55
|
- !ruby/object:Gem::Version
|
55
56
|
segments:
|
56
|
-
- 0
|
57
57
|
- 1
|
58
58
|
- 1
|
59
|
-
|
59
|
+
- 0
|
60
|
+
version: 1.1.0
|
60
61
|
type: :development
|
61
62
|
version_requirements: *id003
|
62
63
|
description: ""
|