documentalist 0.1.0 → 0.1.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.
- data/Manifest +48 -12
- data/README.rdoc +1 -1
- data/Rakefile +28 -12
- data/config/default.yml +17 -0
- data/documentalist.gemspec +40 -34
- data/lib/backends/net_pbm.rb +10 -0
- data/lib/backends/odf_merge.rb +64 -0
- data/lib/backends/open_office.rb +108 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/ChangeLog.txt +119 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/LICENSE.txt +504 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/README.txt +58 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/docs/jodconverter-2.2.2-javadoc.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/docs/third-party-licenses/license-commons-io.txt +203 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/docs/third-party-licenses/license-openoffice.org.txt +8 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/docs/third-party-licenses/license-slf4j.txt +24 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/docs/third-party-licenses/license-xstream.txt +27 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/document-formats.xml +513 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/DEPENDENCIES.txt +17 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/commons-cli-1.2.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/commons-io-1.4.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/jodconverter-2.2.2.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/juh-3.0.1.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/jurt-3.0.1.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/ridl-3.0.1.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/slf4j-api-1.5.6.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/slf4j-jdk14-1.5.6.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/unoil-3.0.1.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/lib/xstream-1.3.1.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/src/jodconverter-2.2.2-sources.jar +0 -0
- data/lib/backends/open_office/bridges/jodconverter-2.2.2/src/jodconverter-cli-2.2.2-sources.jar +0 -0
- data/lib/{DocumentConverter.py → backends/open_office/bridges/pyodconverter.py} +0 -0
- data/lib/{open_office → backends/open_office}/server.rb +8 -5
- data/lib/backends/pdf_tools.rb +14 -0
- data/lib/documentalist.rb +130 -42
- data/lib/tasks/tasks.rb +6 -0
- data/rails/config/documentalist.yml.tpl +67 -0
- data/rails/init.rb +12 -1
- data/rails/initialize_configuration.rb +6 -0
- data/test/documentalist_test.rb +48 -25
- data/test/fixtures/{fixture.odt → fixture_001.odt} +0 -0
- data/test/net_pbm_test.rb +7 -0
- data/test/odf_merge_test.rb +56 -0
- data/test/open_office_test.rb +70 -13
- data/test/pdf_tools_test.rb +8 -0
- data/test/rails_integration_test.rb +39 -0
- data/test/test_helper.rb +29 -0
- metadata +112 -12
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
To use the library in your own Java app you need
|
|
2
|
+
|
|
3
|
+
* commons-io
|
|
4
|
+
* jodconverter
|
|
5
|
+
* juh
|
|
6
|
+
* jurt
|
|
7
|
+
* ridl
|
|
8
|
+
* slf4j-api
|
|
9
|
+
* slf4j-jdk14 or another slf4j implementation - see http://slf4j.org
|
|
10
|
+
* unoil
|
|
11
|
+
* xstream - only if you use XmlDocumentFormatRegistry
|
|
12
|
+
|
|
13
|
+
The command line interface additionally requires
|
|
14
|
+
|
|
15
|
+
* commons-cli
|
|
16
|
+
* jodconverter-cli
|
|
17
|
+
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/lib/backends/open_office/bridges/jodconverter-2.2.2/src/jodconverter-cli-2.2.2-sources.jar
ADDED
|
Binary file
|
|
File without changes
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'system_timer'
|
|
2
2
|
require 'tmpdir'
|
|
3
3
|
|
|
4
4
|
module OpenOffice
|
|
5
5
|
module Server
|
|
6
6
|
# Path to the Python executable
|
|
7
|
+
# TODO : Eww, use config instead
|
|
7
8
|
PYTHON_PATH = "/usr/bin/python"
|
|
8
9
|
|
|
9
10
|
# Server can convert from the following file formats
|
|
@@ -13,6 +14,7 @@ module OpenOffice
|
|
|
13
14
|
CONVERT_TO = [:odt, :doc, :rtf, :pdf, :txt, :html, :htm, :wps]
|
|
14
15
|
|
|
15
16
|
# Python conversion script path
|
|
17
|
+
# TODO : Wrong
|
|
16
18
|
PY_OD_CONVERTER = File.join(File.dirname(__FILE__), "../DocumentConverter.py")
|
|
17
19
|
|
|
18
20
|
# Maximum allowed CPU usage for an OpenOffice process
|
|
@@ -22,6 +24,7 @@ module OpenOffice
|
|
|
22
24
|
SERVER_START_DELAY = 4
|
|
23
25
|
|
|
24
26
|
# Log file
|
|
27
|
+
# TODO : Wrong
|
|
25
28
|
LOG_FILE = Object.const_defined?(:RAILS_ROOT) ? File.join(RAILS_ROOT, "log", "openoffice.log") : ""
|
|
26
29
|
|
|
27
30
|
def self.convert(origin, options = {:to => :txt})
|
|
@@ -37,7 +40,7 @@ module OpenOffice
|
|
|
37
40
|
raise "Can't convert #{origin} to #{options[:to]}"
|
|
38
41
|
end
|
|
39
42
|
|
|
40
|
-
timeout(10, :attempts => 2) do
|
|
43
|
+
Documentalist.timeout(10, :attempts => 2) do
|
|
41
44
|
system("#{PYTHON_PATH} #{PY_OD_CONVERTER} #{origin} #{destination} > /dev/null 2>&1")
|
|
42
45
|
|
|
43
46
|
# HACK : sometimes text files get saved in ISO-8859-1 instead of regular UTF-8, so we force
|
|
@@ -70,7 +73,7 @@ module OpenOffice
|
|
|
70
73
|
system("/usr/bin/soffice -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard -nologo -nocrashreport -norestore -nolockcheck -nodefault #{">>" unless LOG_FILE.empty?} #{LOG_FILE} 2>&1 &")
|
|
71
74
|
|
|
72
75
|
begin
|
|
73
|
-
timeout(2) do
|
|
76
|
+
SystemTimer.timeout(2.seconds) do
|
|
74
77
|
while !running?
|
|
75
78
|
print "."
|
|
76
79
|
end
|
|
@@ -90,7 +93,7 @@ module OpenOffice
|
|
|
90
93
|
raise "Not running!" unless running?
|
|
91
94
|
|
|
92
95
|
begin
|
|
93
|
-
timeout(3, :attempts => 2) do
|
|
96
|
+
Documentalist.timeout(3, :attempts => 2) do
|
|
94
97
|
while(running?)
|
|
95
98
|
system("pkill -9 office")
|
|
96
99
|
end
|
|
@@ -129,7 +132,7 @@ module OpenOffice
|
|
|
129
132
|
if block_given?
|
|
130
133
|
attempts = options[:attempts] || 1
|
|
131
134
|
begin
|
|
132
|
-
|
|
135
|
+
SystemTimer.timeout(max_time) do
|
|
133
136
|
yield
|
|
134
137
|
end
|
|
135
138
|
rescue Timeout::Error
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# To change this template, choose Tools | Templates
|
|
2
|
+
# and open the template in the editor.
|
|
3
|
+
|
|
4
|
+
module Documentalist
|
|
5
|
+
module PdfTools
|
|
6
|
+
def self.convert(origin, options)
|
|
7
|
+
if system("pdftotext #{origin} #{options[:destination]} > /dev/null 2>&1")
|
|
8
|
+
options[:destination]
|
|
9
|
+
else
|
|
10
|
+
raise "PdfTools failed"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
data/lib/documentalist.rb
CHANGED
|
@@ -1,63 +1,151 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
|
-
require '
|
|
3
|
-
require '
|
|
4
|
-
require '
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
require 'yaml'
|
|
3
|
+
require 'system_timer'
|
|
4
|
+
require 'logger'
|
|
5
|
+
|
|
6
|
+
# Require all backends
|
|
7
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'backends', '*.rb')).each do |backend|
|
|
8
|
+
require backend
|
|
9
|
+
end
|
|
7
10
|
|
|
8
11
|
module Documentalist
|
|
9
|
-
|
|
10
|
-
|
|
12
|
+
@@config = {}
|
|
13
|
+
@@logger = nil
|
|
11
14
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
end
|
|
15
|
+
def self.config
|
|
16
|
+
default_config! unless config?
|
|
17
|
+
@@config
|
|
18
|
+
end
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
def self.config=(hash)
|
|
21
|
+
# We want to symbolize keys ourselves since we're not depending on Active Support
|
|
22
|
+
@@config = symbolize hash
|
|
19
23
|
end
|
|
20
24
|
|
|
21
|
-
def self.
|
|
22
|
-
|
|
23
|
-
Zip::ZipFile.open(odt_file) { |zip| contents = zip.read("content.xml") }
|
|
24
|
-
contents.gsub("<%", "<%").gsub("%>", "%>")
|
|
25
|
+
def self.config?
|
|
26
|
+
@@config != {}
|
|
25
27
|
end
|
|
26
28
|
|
|
27
|
-
def self.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
def self.default_config!
|
|
30
|
+
config_from_yaml! File.join(File.dirname(__FILE__), %w{.. config default.yml})
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.config_from_yaml!(file, options = {})
|
|
34
|
+
self.config = YAML::load(File.open(file))
|
|
35
|
+
self.config = config[options[:section].to_sym] if options[:section]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
BACKENDS = {
|
|
39
|
+
OpenOffice => {[:odt, :doc, :rtf, :docx, :txt, :html, :htm, :wps] => [:odt, :doc, :rtf, :pdf, :txt, :html, :htm, :wps]},
|
|
40
|
+
NetPBM => {:ppm => [:jpg, :jpeg]},
|
|
41
|
+
PdfTools => {:pdf => :txt},
|
|
42
|
+
|
|
43
|
+
# Find a better pattern to pick backend, this one smells pretty bad
|
|
44
|
+
# WkHTML2PDF => {[:html, :htm] => :pdf}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
# Finds the relevant server to perform the conversion
|
|
48
|
+
def self.backend_for_conversion(origin, destination)
|
|
49
|
+
origin = origin.to_s.gsub(/.*\./, "").to_sym
|
|
50
|
+
destination = destination.to_s.gsub(/.*\./, "").to_sym
|
|
51
|
+
|
|
52
|
+
BACKENDS.detect do |s, conversions|
|
|
53
|
+
conversions.keys.flatten.include?(origin) and conversions.values.flatten.include?(destination)
|
|
54
|
+
end.to_a.first
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Takes all conversion requests and dispatches them appropriately
|
|
58
|
+
def self.convert(file, options={})
|
|
59
|
+
raise "#{file} does not exist !" unless File.exist?(file)
|
|
60
|
+
|
|
61
|
+
unless options[:to] or options[:to_format]
|
|
62
|
+
raise Documentalist::Error.new("No destination or format was given")
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Convert to plain text by default
|
|
66
|
+
options[:to_format] = options[:to_format] ? options[:to_format].to_sym : :txt
|
|
67
|
+
|
|
68
|
+
unless options[:to]
|
|
69
|
+
options[:to] = file.gsub(/#{"\\" + File.extname(file)}$/, ".#{options[:to_format].to_s}")
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
options[:from_format] = File.extname(file).gsub(/\./, "").to_sym
|
|
32
73
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
FileUtils.cp(template, tmp_merged_template)
|
|
74
|
+
backend = backend_for_conversion(options[:from_format], options[:to_format])
|
|
75
|
+
converted = backend.convert(file, options)
|
|
36
76
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
77
|
+
yield(converted) if block_given?
|
|
78
|
+
converted
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def self.extract_text(file)
|
|
82
|
+
converted = convert(file, :to => :txt)
|
|
83
|
+
if converted and File.exist?(converted)
|
|
84
|
+
text = File.open(converted).read.toutf8
|
|
85
|
+
FileUtils.rm(converted)
|
|
86
|
+
|
|
87
|
+
yield(extracted_text) if block_given?
|
|
88
|
+
text
|
|
41
89
|
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def self.extract_images(file)
|
|
93
|
+
temp_dir = File.join(CONVERSIONS_PATH, (Time.new.to_f*100_000).to_i.to_s)
|
|
94
|
+
|
|
95
|
+
if File.extname(file) == '.pdf'
|
|
96
|
+
temp_file = File.join(temp_dir, File.basename(file))
|
|
42
97
|
|
|
43
|
-
|
|
44
|
-
|
|
98
|
+
system "mkdir #{temp_dir} && cp #{file} #{temp_file}"
|
|
99
|
+
system "cd #{temp_dir} && pdfimages #{temp_file} 'img'"
|
|
45
100
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if File.extname(options[:to]) == File.extname(template)
|
|
49
|
-
FileUtils.mv(tmp_merged_template, options[:to])
|
|
50
|
-
else
|
|
51
|
-
OpenOffice::Server.convert(tmp_merged_template, options[:to])
|
|
52
|
-
FileUtils.rm(tmp_merged_template)
|
|
101
|
+
Dir.glob(File.join(temp_dir, "*.ppm")).each do |ppm_image|
|
|
102
|
+
Documentalist.convert(ppm_image, :to => :jpeg)
|
|
53
103
|
end
|
|
54
104
|
else
|
|
55
|
-
|
|
56
|
-
FileUtils.mv(tmp_merged_template, template)
|
|
105
|
+
convert file, :to => :html, :directory => temp_dir
|
|
57
106
|
end
|
|
107
|
+
|
|
108
|
+
image_file_names = Dir.glob(File.join(temp_dir, "*.{jpg,jpeg,bmp,tif,tiff,gif,png}"))
|
|
109
|
+
|
|
110
|
+
yield(image_file_names) if block_given?
|
|
111
|
+
image_file_names
|
|
58
112
|
end
|
|
59
113
|
|
|
60
|
-
|
|
61
|
-
|
|
114
|
+
# Runs a block with a system-enforced timeout and optionally retry with an
|
|
115
|
+
# optional sleep between attempts of running the given block.
|
|
116
|
+
# All times are in seconds.
|
|
117
|
+
def self.timeout(time_limit = 0, options = {:attempts => 1, :sleep => nil})
|
|
118
|
+
if block_given?
|
|
119
|
+
attempts = options[:attempts] || 1
|
|
120
|
+
begin
|
|
121
|
+
SystemTimer.timeout time_limit do
|
|
122
|
+
yield
|
|
123
|
+
end
|
|
124
|
+
rescue Timeout::Error
|
|
125
|
+
attempts -= 1
|
|
126
|
+
sleep(options[:sleep]) if options[:sleep]
|
|
127
|
+
retry unless attempts.zero?
|
|
128
|
+
raise
|
|
129
|
+
end
|
|
130
|
+
end
|
|
62
131
|
end
|
|
132
|
+
|
|
133
|
+
def self.logger
|
|
134
|
+
unless @@logger
|
|
135
|
+
@@logger = Logger.new(Documentalist.config[:log_file])
|
|
136
|
+
@@logger.level = Logger.const_get(config[:log_level] ? config[:log_level].upcase : "WARN")
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
@@logger
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Returns a new hash with recursively symbolized keys
|
|
143
|
+
def self.symbolize(hash)
|
|
144
|
+
hash.each_key do |key|
|
|
145
|
+
hash[key.to_sym] = hash.delete key
|
|
146
|
+
hash[key.to_sym] = symbolize(hash[key.to_sym]) if hash[key.to_sym].is_a?(Hash)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
class Error < RuntimeError; end
|
|
63
151
|
end
|
data/lib/tasks/tasks.rb
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Sample Rails configuration file
|
|
2
|
+
# Optional settings are :
|
|
3
|
+
# * log_path : Allows you to override the default log file [Rail.root/log/documentalist.log]
|
|
4
|
+
|
|
5
|
+
development:
|
|
6
|
+
# Python configuration
|
|
7
|
+
python:
|
|
8
|
+
path: /usr/bin/python
|
|
9
|
+
|
|
10
|
+
# Java configuration
|
|
11
|
+
java:
|
|
12
|
+
path: /usr/bin/java
|
|
13
|
+
|
|
14
|
+
# OpenOffice configuration
|
|
15
|
+
open_office:
|
|
16
|
+
# Path to the OpenOpffice binary
|
|
17
|
+
path: /usr/bin/soffice
|
|
18
|
+
|
|
19
|
+
# Select desired bridge between PYOD and JOD
|
|
20
|
+
bridge: JOD
|
|
21
|
+
|
|
22
|
+
# Maximum allowed CPU usage before the process is considered stalled
|
|
23
|
+
max_cpu: 80
|
|
24
|
+
|
|
25
|
+
# OpenOffice server allowed startup time (seconds)
|
|
26
|
+
max_startup_time: 4
|
|
27
|
+
|
|
28
|
+
# OpenOffice server allowed waking up time (between startup and actual processing)
|
|
29
|
+
wakeup_time: 3
|
|
30
|
+
|
|
31
|
+
# Conversion tries before giving up
|
|
32
|
+
max_conversion_attempts: 3
|
|
33
|
+
|
|
34
|
+
# Maximum allowed time for converting a document
|
|
35
|
+
max_conversion_time: 6
|
|
36
|
+
|
|
37
|
+
test:
|
|
38
|
+
python:
|
|
39
|
+
path: /usr/bin/python
|
|
40
|
+
|
|
41
|
+
java:
|
|
42
|
+
path: /usr/bin/java
|
|
43
|
+
|
|
44
|
+
open_office:
|
|
45
|
+
path: /usr/bin/soffice
|
|
46
|
+
bridge: JOD
|
|
47
|
+
max_cpu: 80
|
|
48
|
+
max_startup_time: 4
|
|
49
|
+
wakeup_time: 3
|
|
50
|
+
max_conversion_attempts: 3
|
|
51
|
+
max_conversion_time: 6
|
|
52
|
+
|
|
53
|
+
production:
|
|
54
|
+
python:
|
|
55
|
+
path: /usr/bin/python
|
|
56
|
+
|
|
57
|
+
java:
|
|
58
|
+
path: /usr/bin/java
|
|
59
|
+
|
|
60
|
+
open_office:
|
|
61
|
+
path: /usr/bin/soffice
|
|
62
|
+
bridge: JOD
|
|
63
|
+
max_cpu: 80
|
|
64
|
+
max_startup_time: 4
|
|
65
|
+
wakeup_time: 3
|
|
66
|
+
max_conversion_attempts: 3
|
|
67
|
+
max_conversion_time: 6
|
data/rails/init.rb
CHANGED
|
@@ -1 +1,12 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'yaml'
|
|
2
|
+
|
|
3
|
+
require File.join(File.dirname(__FILE__), %w{initialize_configuration})
|
|
4
|
+
require File.join(File.dirname(__FILE__), %w{.. lib documentalist})
|
|
5
|
+
|
|
6
|
+
# Load configuration from Rails.root/config/documentalist.yml
|
|
7
|
+
Documentalist.config_from_yaml! File.join(RAILS_ROOT, %w{config documentalist.yml}), :section => RAILS_ENV
|
|
8
|
+
|
|
9
|
+
# Set a default for the logfile if it hasn't been provided by the configuration file
|
|
10
|
+
unless Documentalist.config[:logfile]
|
|
11
|
+
Documentalist.config[:logfile] = File.join(RAILS_ROOT, %w{log documentalist-#{RAILS_ENV}.log})
|
|
12
|
+
end
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Initializes a standard configuration file in Rails.root/config/documentalist.yml
|
|
2
|
+
unless File.exists?(File.join(RAILS_ROOT , %w{config documentalist.yml}))
|
|
3
|
+
FileUtils.cp(File.join(File.dirname(__FILE__), %w{config documentalist.yml.tpl}), File.join(RAILS_ROOT, %w{config documentalist.yml}))
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
|
data/test/documentalist_test.rb
CHANGED
|
@@ -1,40 +1,63 @@
|
|
|
1
|
-
require '
|
|
2
|
-
require '
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'system_timer'
|
|
3
|
+
require 'tmpdir'
|
|
3
4
|
|
|
4
5
|
class DocumentalistTest < Test::Unit::TestCase
|
|
5
|
-
|
|
6
|
+
include FlexMock::TestCase
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
# Test the custom symbolize method used as a replacement for the Active Support version
|
|
9
|
+
def test_symbolize
|
|
10
|
+
hash = { "a" => "b",
|
|
11
|
+
"c" => {
|
|
12
|
+
"d" => "e"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
9
15
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
:
|
|
16
|
+
symbolized = { :a => "b",
|
|
17
|
+
:c => {
|
|
18
|
+
:d => "e"
|
|
13
19
|
}
|
|
14
|
-
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
assert_equal Documentalist.send(:symbolize, hash),
|
|
23
|
+
symbolized,
|
|
24
|
+
"Hash wasn't properly symbolized"
|
|
25
|
+
end
|
|
15
26
|
|
|
16
|
-
|
|
27
|
+
# Test that we use a system timeout and not a green thread based timeout that
|
|
28
|
+
# could possibly not work on some long external system calls
|
|
29
|
+
def test_timeout_uses_system_timeout
|
|
30
|
+
flexmock(SystemTimer).should_receive(:timeout).once
|
|
31
|
+
Documentalist.timeout(0.1) { }
|
|
17
32
|
end
|
|
18
33
|
|
|
19
|
-
|
|
20
|
-
|
|
34
|
+
# Test that we have a default configuration for Documentalist even if
|
|
35
|
+
def test_default_config
|
|
36
|
+
# Check that we did not get some Rails context from other tests
|
|
37
|
+
assert !Object.const_defined?(:RAILS_ENV)
|
|
21
38
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
assert !(contents =~ /%>/)
|
|
25
|
-
assert !(contents =~ /<%=/)
|
|
39
|
+
# Check that at least a configuration key has been magically set
|
|
40
|
+
assert Documentalist.config[:open_office]
|
|
26
41
|
end
|
|
27
42
|
|
|
28
|
-
def
|
|
29
|
-
|
|
30
|
-
|
|
43
|
+
def test_logger
|
|
44
|
+
log_file = File.join(Dir.tmpdir, "#{rand(10 ** 9).to_s}.log")
|
|
45
|
+
|
|
46
|
+
Documentalist.config[:log_file] = log_file
|
|
47
|
+
assert !File.exists?(log_file), "Log file already exists"
|
|
48
|
+
|
|
49
|
+
Documentalist.logger
|
|
50
|
+
assert File.exists?(log_file), "Log file should have been created"
|
|
51
|
+
|
|
52
|
+
assert_no_difference("File.size(\"#{log_file}\")", "Nothing should have been written") do
|
|
53
|
+
Documentalist.logger.debug("This message should go nowhere")
|
|
54
|
+
end
|
|
31
55
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
)
|
|
56
|
+
assert_difference("File.size(\"#{log_file}\")", nil, "Nothing should have been written") do
|
|
57
|
+
Documentalist.logger.warn("This message should be written !")
|
|
58
|
+
end
|
|
36
59
|
|
|
37
|
-
|
|
38
|
-
File.
|
|
60
|
+
FileUtils.rm(log_file)
|
|
61
|
+
assert !File.exists?(log_file), "Log file hasn't been removed properly"
|
|
39
62
|
end
|
|
40
63
|
end
|