chupa-text 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -0
- data/data/mime-types.conf +15 -0
- data/doc/text/news.md +9 -0
- data/lib/chupa-text.rb +14 -2
- data/lib/chupa-text/command/chupa-text.rb +44 -3
- data/lib/chupa-text/default-logger.rb +150 -0
- data/lib/chupa-text/error.rb +20 -0
- data/lib/chupa-text/external-command.rb +136 -0
- data/lib/chupa-text/extractor.rb +17 -0
- data/lib/chupa-text/loggable.rb +49 -0
- data/lib/chupa-text/logger.rb +30 -0
- data/lib/chupa-text/size-parser.rb +65 -0
- data/lib/chupa-text/version.rb +1 -1
- data/test/test-default-logger.rb +184 -0
- data/test/test-external-command.rb +79 -0
- data/test/test-size-parser.rb +79 -0
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5899941addcc8a58730a1d5ff4194d13f17f6504
|
4
|
+
data.tar.gz: b219d29ca910fd3a4951236f922e3bfe7211e6ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8cc52887b919a6cbb4936c1c039eeb7161a239257558e01198083af19c0c4f950ee85adf21f7d3ee4dbbf0b0f06475a6484dc02633361ff9d27da33d75d2e82d
|
7
|
+
data.tar.gz: b342d42379f88c32e30a20d53008a557cca0f3e5f4ddfde75fe2aca4ad921c24bd4eef6fd0515203fec1d3f2cc71f93fc150e7bde5d43cf34055dd0da8b30d81
|
data/README.md
CHANGED
@@ -79,6 +79,11 @@ See
|
|
79
79
|
[doc/text/decomposer.md](http://rubydoc.info/gems/chupa-text/file/doc/text/decomposer.md)
|
80
80
|
how to write a decomposer.
|
81
81
|
|
82
|
+
## Available plugins
|
83
|
+
|
84
|
+
Search by `chupa-text-decomposer-` on https://rubygems.org/:
|
85
|
+
http://rubygems.org/search?query=chupa-text-decomposer-
|
86
|
+
|
82
87
|
## Author
|
83
88
|
|
84
89
|
* Kouhei Sutou `<kou@clear-code.com>`
|
data/data/mime-types.conf
CHANGED
@@ -19,3 +19,18 @@ mime_types["csv"] = "text/csv"
|
|
19
19
|
mime_types["tsv"] = "text/tab-separated-values"
|
20
20
|
|
21
21
|
mime_types["pdf"] = "application/pdf"
|
22
|
+
|
23
|
+
mime_types["odt"] = "application/vnd.oasis.opendocument.text"
|
24
|
+
mime_types["ods"] = "application/vnd.oasis.opendocument.spreadsheet"
|
25
|
+
mime_types["odp"] = "application/vnd.oasis.opendocument.presentation"
|
26
|
+
|
27
|
+
mime_types["doc"] = "application/msword"
|
28
|
+
mime_types["xls"] = "application/vnd.ms-excel"
|
29
|
+
mime_types["ppt"] = "application/vnd.ms-powerpoint"
|
30
|
+
|
31
|
+
mime_types["docx"] =
|
32
|
+
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
33
|
+
mime_types["xlsx"] =
|
34
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
35
|
+
mime_types["pptx"] =
|
36
|
+
"application/vnd.openxmlformats-officedocument.presentationml.presentation"
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 1.0.2: 2014-02-15
|
4
|
+
|
5
|
+
* Added `ChupaText::SizeParser`.
|
6
|
+
* Added `ChupaText::DefaultLogger`.
|
7
|
+
* chupa-text: Added `--log-output` option.
|
8
|
+
* chupa-text: Added `--log-level` option.
|
9
|
+
* Added `ChupaText::ExternalCommand`.
|
10
|
+
* Added MIME types for office files.
|
11
|
+
|
3
12
|
## 1.0.1: 2014-01-05
|
4
13
|
|
5
14
|
* chupa-text: Supported loading decomposers installed by RubyGems.
|
data/lib/chupa-text.rb
CHANGED
@@ -16,15 +16,27 @@
|
|
16
16
|
|
17
17
|
require "chupa-text/version"
|
18
18
|
|
19
|
+
require "chupa-text/error"
|
20
|
+
|
21
|
+
require "chupa-text/size-parser"
|
22
|
+
require "chupa-text/default-logger"
|
23
|
+
require "chupa-text/logger"
|
24
|
+
|
25
|
+
require "chupa-text/loggable"
|
26
|
+
|
19
27
|
require "chupa-text/configuration"
|
20
28
|
require "chupa-text/configuration-loader"
|
29
|
+
require "chupa-text/mime-type"
|
30
|
+
require "chupa-text/mime-type-registry"
|
31
|
+
|
32
|
+
require "chupa-text/external-command"
|
33
|
+
|
21
34
|
require "chupa-text/decomposer"
|
22
35
|
require "chupa-text/decomposer-registry"
|
23
36
|
require "chupa-text/decomposers"
|
37
|
+
|
24
38
|
require "chupa-text/extractor"
|
25
39
|
require "chupa-text/formatters"
|
26
|
-
require "chupa-text/mime-type"
|
27
|
-
require "chupa-text/mime-type-registry"
|
28
40
|
|
29
41
|
require "chupa-text/file-content"
|
30
42
|
require "chupa-text/virtual-content"
|
@@ -74,21 +74,62 @@ module ChupaText
|
|
74
74
|
parser = OptionParser.new
|
75
75
|
parser.banner += " [FILE_OR_URI]"
|
76
76
|
parser.version = VERSION
|
77
|
+
|
78
|
+
parser.separator("")
|
79
|
+
parser.separator("Generic options")
|
77
80
|
parser.on("--configuration=FILE",
|
78
|
-
"
|
81
|
+
"Reads configuration from FILE.") do |path|
|
79
82
|
load_configuration(path)
|
80
83
|
end
|
81
84
|
parser.on("--disable-gems",
|
82
|
-
"
|
85
|
+
"Disables decomposers installed by RubyGems.") do
|
83
86
|
@enable_gems = false
|
84
87
|
end
|
85
88
|
parser.on("-I=PATH",
|
86
|
-
"
|
89
|
+
"Appends PATH to decomposer load path.") do |path|
|
87
90
|
$LOAD_PATH << path
|
88
91
|
end
|
92
|
+
|
93
|
+
parser.separator("")
|
94
|
+
parser.separator("Log related options:")
|
95
|
+
parser.on("--log-output=OUTPUT",
|
96
|
+
"Sets log output.",
|
97
|
+
"[-(stdout), +(stderr), PATH]",
|
98
|
+
"(default: +(stderr))") do |output|
|
99
|
+
ENV["CHUPA_TEXT_LOG_OUTPUT"] = output
|
100
|
+
::ChupaText.logger = nil
|
101
|
+
end
|
102
|
+
parser.on("--log-level=LEVEL", available_log_levels,
|
103
|
+
"Sets log level.",
|
104
|
+
"[#{available_log_levels.join(', ')}]",
|
105
|
+
"(default: #{current_log_level_name})") do |level|
|
106
|
+
ENV["CHUPA_TEXT_LOG_LEVEL"] = level
|
107
|
+
::ChupaText.logger = nil
|
108
|
+
end
|
109
|
+
|
89
110
|
parser
|
90
111
|
end
|
91
112
|
|
113
|
+
def available_log_levels
|
114
|
+
[
|
115
|
+
"debug",
|
116
|
+
"info",
|
117
|
+
"warn",
|
118
|
+
"error",
|
119
|
+
"fatal",
|
120
|
+
"unknown",
|
121
|
+
]
|
122
|
+
end
|
123
|
+
|
124
|
+
def current_log_level_name
|
125
|
+
level = ::ChupaText.logger.level
|
126
|
+
Logger::Severity.constants.each do |name|
|
127
|
+
next if Logger::Severity.const_get(name) != level
|
128
|
+
return name.to_s.downcase
|
129
|
+
end
|
130
|
+
"info"
|
131
|
+
end
|
132
|
+
|
92
133
|
def load_decomposers
|
93
134
|
Decomposers.enable_all_gems if @enable_gems
|
94
135
|
Decomposers.load
|
@@ -0,0 +1,150 @@
|
|
1
|
+
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
require "logger"
|
18
|
+
|
19
|
+
module ChupaText
|
20
|
+
# The default logger for ChupaText. Logger options are retrieved from
|
21
|
+
# environment variables.
|
22
|
+
#
|
23
|
+
# Here are environment variables to be used:
|
24
|
+
#
|
25
|
+
# ## `CHUPA_TEXT_LOG_OUTPUT`
|
26
|
+
#
|
27
|
+
# It specifies log output.
|
28
|
+
#
|
29
|
+
# * `-`: ChupaText outputs to the standard output.
|
30
|
+
# * `+`: ChupaText outputs to the standard error output.
|
31
|
+
# * Others: It is used as file name. ChupaText outputs to the file.
|
32
|
+
#
|
33
|
+
# The default is `+` (the standard error).
|
34
|
+
#
|
35
|
+
# ## `CHUPA_TEXT_LOG_ROTATION_PERIOD`
|
36
|
+
#
|
37
|
+
# It specifies log rotation period.
|
38
|
+
#
|
39
|
+
# It is ignored when `CHUPA_TEXT_LOG_OUTPUT` is `-` (the standard
|
40
|
+
# output) or `+` (the standard error output).
|
41
|
+
#
|
42
|
+
# * `daily`: Log file is rotated daily.
|
43
|
+
# * `weekly`: Log file is rotated weekly.
|
44
|
+
# * `monthly`: Log file is rotated monthly.
|
45
|
+
# * Others: Invalid value. It is ignored.
|
46
|
+
#
|
47
|
+
# ## `CHUPA_TEXT_LOG_N_GENERATIONS`
|
48
|
+
#
|
49
|
+
# It specifies how many old log files are kept.
|
50
|
+
#
|
51
|
+
# It is ignored when (a) `CHUPA_TEXT_LOG_OUTPUT` is `-` (the
|
52
|
+
# standard output) or `+` (the standard error output) or (b)
|
53
|
+
# `CHUPA_TEXT_LOG_RATATION_PERIOD` is valid value.
|
54
|
+
#
|
55
|
+
# The default value is `7`.
|
56
|
+
#
|
57
|
+
# ## `CHUPA_TEXT_LOG_LEVEL`
|
58
|
+
#
|
59
|
+
# It specifies log verbosity.
|
60
|
+
#
|
61
|
+
# The default value is `info`.
|
62
|
+
#
|
63
|
+
# * `unknown`: ChupaText outputs only unknown messages.
|
64
|
+
# * `fatal`: ChupaText outputs `unknown` level messages and
|
65
|
+
# unhandleable error messages.
|
66
|
+
# * `error`: ChupaText outputs `fatal` level messages and
|
67
|
+
# handleable error messages.
|
68
|
+
# * `warn`: ChupaText outputs `error` level messages and warning
|
69
|
+
# level messages.
|
70
|
+
# * `info`: ChupaText outputs `warn` level messages and generic useful
|
71
|
+
# information messages.
|
72
|
+
# * `debug`: ChupaText outputs all messages.
|
73
|
+
class DefaultLogger < Logger
|
74
|
+
def initialize
|
75
|
+
super(output_device, default_shift_age, default_shift_size)
|
76
|
+
self.level = default_level
|
77
|
+
self.formatter = Formatter.new
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
def output_device
|
82
|
+
output = ENV["CHUPA_TEXT_LOG_OUTPUT"] || "+"
|
83
|
+
case output
|
84
|
+
when "-"
|
85
|
+
STDOUT
|
86
|
+
when "+"
|
87
|
+
STDERR
|
88
|
+
else
|
89
|
+
output
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def default_shift_age
|
94
|
+
rotation_period = ENV["CHUPA_TEXT_LOG_ROTATION_PERIOD"]
|
95
|
+
case rotation_period
|
96
|
+
when "daily", "weekly", "monthly"
|
97
|
+
return rotation_period
|
98
|
+
end
|
99
|
+
|
100
|
+
n_generations = ENV["CHUPA_TEXT_LOG_N_GENERATIONS"] || "7"
|
101
|
+
begin
|
102
|
+
Integer(n_generations)
|
103
|
+
rescue ArgumentError
|
104
|
+
nil
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def default_shift_size
|
109
|
+
max_size = ENV["CHUPA_TEXT_LOG_MAX_SIZE"] || "1MB"
|
110
|
+
begin
|
111
|
+
SizeParser.parse(max_size)
|
112
|
+
rescue SizeParser::InvalidSizeError
|
113
|
+
nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def default_level
|
118
|
+
level_name = (ENV["CHUPA_TEXT_LOG_LEVEL"] || "info").upcase
|
119
|
+
if Logger::Severity.const_defined?(level_name)
|
120
|
+
Logger::Severity.const_get(level_name)
|
121
|
+
else
|
122
|
+
Logger::Severity::INFO
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
class Formatter
|
127
|
+
def call(severity, time, program_name, message)
|
128
|
+
"%s: [%d] %s: %s" % [
|
129
|
+
time.iso8601(6),
|
130
|
+
Process.pid,
|
131
|
+
severity[0, 1],
|
132
|
+
format_message(message),
|
133
|
+
]
|
134
|
+
end
|
135
|
+
|
136
|
+
private
|
137
|
+
def format_message(message)
|
138
|
+
case message
|
139
|
+
when String
|
140
|
+
message
|
141
|
+
when Exception
|
142
|
+
"#{message.message}(#{message.class})\n" +
|
143
|
+
(message.backtrace || []).join("\n")
|
144
|
+
else
|
145
|
+
message.inpsect
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
module ChupaText
|
18
|
+
class Error < StandardError
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# Copyright (C) 2014 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
# Copyright (C) 2010 Yuto HAYAMIZU <y.hayamizu@gmail.com>
|
3
|
+
#
|
4
|
+
# This library is free software; you can redistribute it and/or
|
5
|
+
# modify it under the terms of the GNU Lesser General Public
|
6
|
+
# License as published by the Free Software Foundation; either
|
7
|
+
# version 2.1 of the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12
|
+
# Lesser General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
15
|
+
# License along with this library; if not, write to the Free Software
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
17
|
+
|
18
|
+
require "English"
|
19
|
+
require "pathname"
|
20
|
+
|
21
|
+
module ChupaText
|
22
|
+
class ExternalCommand
|
23
|
+
def initialize(command)
|
24
|
+
@command = Pathname.new(command)
|
25
|
+
end
|
26
|
+
|
27
|
+
def run(*arguments)
|
28
|
+
if arguments.last.is_a?(Hash)
|
29
|
+
options = arguments.pop
|
30
|
+
else
|
31
|
+
options = {}
|
32
|
+
end
|
33
|
+
spawn_options = options[:spawn_options] || {}
|
34
|
+
pid = spawn(options[:env] || {},
|
35
|
+
@command.to_s,
|
36
|
+
*arguments,
|
37
|
+
spawn_options.merge(default_spawn_options))
|
38
|
+
pid, status = Process.waitpid2(pid)
|
39
|
+
status.success?
|
40
|
+
end
|
41
|
+
|
42
|
+
def exist?
|
43
|
+
if @command.absolute?
|
44
|
+
@command.file? and @command.executable?
|
45
|
+
else
|
46
|
+
(ENV['PATH'] || "").split(File::PATH_SEPARATOR).any? do |path|
|
47
|
+
(Pathname.new(path) + @command).expand_path.exist?
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def default_spawn_options
|
54
|
+
SpawnLimitOptions.new.options
|
55
|
+
end
|
56
|
+
|
57
|
+
class SpawnLimitOptions
|
58
|
+
attr_reader :options
|
59
|
+
def initialize
|
60
|
+
@options = {}
|
61
|
+
set_default_options
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
def set_default_options
|
66
|
+
set_option(:cpu, :int)
|
67
|
+
set_option(:rss, :size)
|
68
|
+
set_option(:as, :size)
|
69
|
+
end
|
70
|
+
|
71
|
+
def set_option(key, type)
|
72
|
+
value = ENV["CHUPA_EXTERNAL_COMMAND_LIMIT_#{key.to_s.upcase}"]
|
73
|
+
return if value.nil?
|
74
|
+
value = send("parse_#{type}", key, value)
|
75
|
+
return if value.nil?
|
76
|
+
rlimit_number = Process.const_get("RLIMIT_#{key.to_s.upcase}")
|
77
|
+
soft_limit, hard_limit = Process.getrlimit(rlimit_number)
|
78
|
+
if hard_limit < value
|
79
|
+
log_hard_limit_over_value(key, value, hard_limit)
|
80
|
+
return nil
|
81
|
+
end
|
82
|
+
limit_info = "soft-limit:#{soft_limit}, hard-limit:#{hard_limit}"
|
83
|
+
log(:info, "[#{key}][set] <#{value}>(#{limit_info})")
|
84
|
+
@options[:"rlimit_#{key}"] = value
|
85
|
+
end
|
86
|
+
|
87
|
+
def parse_int(key, value)
|
88
|
+
begin
|
89
|
+
Integer(value)
|
90
|
+
rescue ArgumentError
|
91
|
+
log_invalid_value(key, value, type, "int")
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def parse_size(key, value)
|
97
|
+
return nil if value.nil?
|
98
|
+
scale = 1
|
99
|
+
case value
|
100
|
+
when /GB?\z/i
|
101
|
+
scale = 1024 ** 3
|
102
|
+
number = $PREMATCH
|
103
|
+
when /MB?\z/i
|
104
|
+
scale = 1024 ** 2
|
105
|
+
number = $PREMATCH
|
106
|
+
when /KB?\z/i
|
107
|
+
scale = 1024 ** 1
|
108
|
+
number = $PREMATCH
|
109
|
+
when /B?\z/i
|
110
|
+
number = $PREMATCH
|
111
|
+
else
|
112
|
+
number = value
|
113
|
+
end
|
114
|
+
begin
|
115
|
+
number = Float(number)
|
116
|
+
rescue ArgumentError
|
117
|
+
log_invalid_value(key, value, "size")
|
118
|
+
return nil
|
119
|
+
end
|
120
|
+
(number * scale).to_i
|
121
|
+
end
|
122
|
+
|
123
|
+
def log_hard_limit_over_value(key, value, hard_limit)
|
124
|
+
log(:warning, "[#{key}][large] <#{value}>(hard-limit:#{hard_limit})")
|
125
|
+
end
|
126
|
+
|
127
|
+
def log_invalid_value(key, value, type)
|
128
|
+
log(:warning, "[#{key}][invalid] <#{value}>(#{type})")
|
129
|
+
end
|
130
|
+
|
131
|
+
def log(level, message)
|
132
|
+
ChupaText.logger.send(level, "[external-command][limit]#{message}")
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
data/lib/chupa-text/extractor.rb
CHANGED
@@ -19,6 +19,8 @@ require "uri"
|
|
19
19
|
|
20
20
|
module ChupaText
|
21
21
|
class Extractor
|
22
|
+
include Loggable
|
23
|
+
|
22
24
|
def initialize
|
23
25
|
@decomposers = []
|
24
26
|
end
|
@@ -59,16 +61,27 @@ module ChupaText
|
|
59
61
|
targets = [ensure_data(input)]
|
60
62
|
until targets.empty?
|
61
63
|
target = targets.pop
|
64
|
+
debug do
|
65
|
+
"#{log_tag}[extract][target] <#{target.path}>:<#{target.mime_type}>"
|
66
|
+
end
|
62
67
|
if target.text_plain?
|
63
68
|
yield(target)
|
64
69
|
next
|
65
70
|
end
|
66
71
|
decomposer = find_decomposer(target)
|
67
72
|
if decomposer.nil?
|
73
|
+
debug {"#{log_tag}[extract][decomposer] not found"}
|
68
74
|
yield(target) if target.text?
|
69
75
|
next
|
70
76
|
end
|
77
|
+
debug {"#{log_tag}[extract][decomposer] #{decomposer.class}"}
|
71
78
|
decomposer.decompose(target) do |decomposed|
|
79
|
+
debug do
|
80
|
+
"#{log_tag}[extract][decomposed] " +
|
81
|
+
"#{decomposer.class}: " +
|
82
|
+
"<#{target.path}>:<#{target.mime_type}> -> " +
|
83
|
+
"<#{decomposed.mime_type}>"
|
84
|
+
end
|
72
85
|
targets.push(decomposed)
|
73
86
|
end
|
74
87
|
end
|
@@ -88,5 +101,9 @@ module ChupaText
|
|
88
101
|
decomposer.target?(data)
|
89
102
|
end
|
90
103
|
end
|
104
|
+
|
105
|
+
def log_tag
|
106
|
+
"[extractor]"
|
107
|
+
end
|
91
108
|
end
|
92
109
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
module ChupaText
|
18
|
+
# Adds shortcut methods for easy to log.
|
19
|
+
module Loggable
|
20
|
+
private
|
21
|
+
def logger
|
22
|
+
ChupaText.logger
|
23
|
+
end
|
24
|
+
|
25
|
+
def debug(*arguments, &block)
|
26
|
+
logger.debug(*arguments, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def info(*arguments, &block)
|
30
|
+
logger.info(*arguments, &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def warn(*arguments, &block)
|
34
|
+
logger.warn(*arguments, &block)
|
35
|
+
end
|
36
|
+
|
37
|
+
def error(*arguments, &block)
|
38
|
+
logger.error(*arguments, &block)
|
39
|
+
end
|
40
|
+
|
41
|
+
def fatal(*arguments, &block)
|
42
|
+
logger.fatal(*arguments, &block)
|
43
|
+
end
|
44
|
+
|
45
|
+
def unknown(*arguments, &block)
|
46
|
+
logger.unknown(*arguments, &block)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
module ChupaText
|
18
|
+
class << self
|
19
|
+
# @return [Logger] The logger of ChupaText.
|
20
|
+
# {ChupaText::DefaultLogger} is used by default.
|
21
|
+
def logger
|
22
|
+
@@logger ||= DefaultLogger.new
|
23
|
+
end
|
24
|
+
|
25
|
+
# @param [Logger] logger The logger of ChupaText.
|
26
|
+
def logger=(logger)
|
27
|
+
@@logger = logger
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
require "English"
|
18
|
+
|
19
|
+
module ChupaText
|
20
|
+
class SizeParser
|
21
|
+
class InvalidSizeError < Error
|
22
|
+
attr_reader :size
|
23
|
+
def initialize(size)
|
24
|
+
@size = size
|
25
|
+
super("invalid size: <#{@size.inspect}>")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self
|
30
|
+
def parse(size)
|
31
|
+
new.parse(size)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def parse(size)
|
36
|
+
case size
|
37
|
+
when /TB?\z/i
|
38
|
+
scale = 1024 ** 4
|
39
|
+
number_part = $PREMATCH
|
40
|
+
when /GB?\z/i
|
41
|
+
scale = 1024 ** 3
|
42
|
+
number_part = $PREMATCH
|
43
|
+
when /MB?\z/i
|
44
|
+
scale = 1024 ** 2
|
45
|
+
number_part = $PREMATCH
|
46
|
+
when /KB?\z/i
|
47
|
+
scale = 1024 ** 1
|
48
|
+
number_part = $PREMATCH
|
49
|
+
when /B?\z/i
|
50
|
+
scale = 1
|
51
|
+
number_part = $PREMATCH
|
52
|
+
else
|
53
|
+
scale = 1
|
54
|
+
number_part = size
|
55
|
+
end
|
56
|
+
|
57
|
+
begin
|
58
|
+
number = Float(number_part)
|
59
|
+
rescue ArgumentError
|
60
|
+
raise InvalidSizeError.new(size)
|
61
|
+
end
|
62
|
+
(number * scale).round
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/chupa-text/version.rb
CHANGED
@@ -0,0 +1,184 @@
|
|
1
|
+
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
class TestDefaultLogger < Test::Unit::TestCase
|
18
|
+
def setup
|
19
|
+
@env = {}
|
20
|
+
ENV.each do |key, value|
|
21
|
+
@env[key] = value
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def teardown
|
26
|
+
ENV.replace(@env)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def default_n_generations
|
31
|
+
7
|
32
|
+
end
|
33
|
+
|
34
|
+
def default_max_size
|
35
|
+
1024 * 1024
|
36
|
+
end
|
37
|
+
|
38
|
+
sub_test_case("output") do
|
39
|
+
def output(value)
|
40
|
+
ENV["CHUPA_TEXT_LOG_OUTPUT"] = value
|
41
|
+
logger = ChupaText::DefaultLogger.new
|
42
|
+
device = logger.instance_variable_get(:@logdev)
|
43
|
+
device.dev
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_minus
|
47
|
+
assert_equal(STDOUT, output("-"))
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_plus
|
51
|
+
assert_equal(STDERR, output("+"))
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_string
|
55
|
+
file = Tempfile.new("chupa-text-default-logger-output")
|
56
|
+
assert_equal(file.path, output(file.path).path)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_default
|
60
|
+
assert_equal(STDERR, output(nil))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
sub_test_case("rotation period") do
|
65
|
+
def rotation_period(value)
|
66
|
+
file = Tempfile.new("chupa-text-default-logger-output")
|
67
|
+
ENV["CHUPA_TEXT_LOG_OUTPUT"] = file.path
|
68
|
+
ENV["CHUPA_TEXT_LOG_ROTATION_PERIOD"] = value
|
69
|
+
logger = ChupaText::DefaultLogger.new
|
70
|
+
device = logger.instance_variable_get(:@logdev)
|
71
|
+
device.instance_variable_get(:@shift_age)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_daily
|
75
|
+
assert_equal("daily", rotation_period("daily"))
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_weekly
|
79
|
+
assert_equal("weekly", rotation_period("weekly"))
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_monthly
|
83
|
+
assert_equal("monthly", rotation_period("monthly"))
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_default
|
87
|
+
assert_equal(default_n_generations, rotation_period(nil))
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_invalid
|
91
|
+
assert_equal(default_n_generations, rotation_period(nil))
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
sub_test_case("N generation") do
|
96
|
+
def n_generations(value)
|
97
|
+
file = Tempfile.new("chupa-text-default-logger-output")
|
98
|
+
ENV["CHUPA_TEXT_LOG_OUTPUT"] = file.path
|
99
|
+
ENV["CHUPA_TEXT_LOG_N_GENERATIONS"] = value
|
100
|
+
logger = ChupaText::DefaultLogger.new
|
101
|
+
device = logger.instance_variable_get(:@logdev)
|
102
|
+
device.instance_variable_get(:@shift_age)
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_integer
|
106
|
+
assert_equal(29, n_generations("29"))
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_default
|
110
|
+
assert_equal(default_n_generations, n_generations(nil))
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_invalid
|
114
|
+
assert_equal(default_n_generations, n_generations("2.9"))
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
sub_test_case("max size") do
|
119
|
+
def max_size(value)
|
120
|
+
file = Tempfile.new("chupa-text-default-logger-output")
|
121
|
+
ENV["CHUPA_TEXT_LOG_OUTPUT"] = file.path
|
122
|
+
ENV["CHUPA_TEXT_LOG_MAX_SIZE"] = value
|
123
|
+
logger = ChupaText::DefaultLogger.new
|
124
|
+
device = logger.instance_variable_get(:@logdev)
|
125
|
+
device.instance_variable_get(:@shift_size)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_unit
|
129
|
+
assert_equal(1024, max_size("1KB"))
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_value_only
|
133
|
+
assert_equal(1024, max_size("1024"))
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_default
|
137
|
+
assert_equal(default_max_size, max_size(nil))
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_invalid
|
141
|
+
assert_equal(default_max_size, max_size("max-size"))
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
sub_test_case("level") do
|
146
|
+
def level(value)
|
147
|
+
ENV["CHUPA_TEXT_LOG_LEVEL"] = value
|
148
|
+
logger = ChupaText::DefaultLogger.new
|
149
|
+
logger.level
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_debug
|
153
|
+
assert_equal(Logger::DEBUG, level("debug"))
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_info
|
157
|
+
assert_equal(Logger::INFO, level("info"))
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_warn
|
161
|
+
assert_equal(Logger::WARN, level("warn"))
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_error
|
165
|
+
assert_equal(Logger::ERROR, level("error"))
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_fatal
|
169
|
+
assert_equal(Logger::FATAL, level("fatal"))
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_unknown
|
173
|
+
assert_equal(Logger::UNKNOWN, level("unknown"))
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_default
|
177
|
+
assert_equal(Logger::INFO, level(nil))
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_invalid
|
181
|
+
assert_equal(Logger::INFO, level("invalid"))
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# Copyright (C) 2014 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
require "rbconfig"
|
18
|
+
|
19
|
+
class TestExternalCommand < Test::Unit::TestCase
|
20
|
+
def ruby
|
21
|
+
RbConfig.ruby
|
22
|
+
end
|
23
|
+
|
24
|
+
def create_command(command)
|
25
|
+
ChupaText::ExternalCommand.new(command)
|
26
|
+
end
|
27
|
+
|
28
|
+
class TestRun < self
|
29
|
+
def run_command(command, *arguments)
|
30
|
+
create_command(command).run(*arguments)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_success
|
34
|
+
assert_true(run_command(ruby, "-e", "true"))
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_failure
|
38
|
+
error = Tempfile.new("error")
|
39
|
+
spawn_options = {
|
40
|
+
:err => error.path,
|
41
|
+
}
|
42
|
+
assert_false(run_command(ruby,
|
43
|
+
"-e", "raise 'XXX'",
|
44
|
+
:spawn_options => spawn_options))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class TestExist < self
|
49
|
+
def setup
|
50
|
+
@original_path = ENV["PATH"]
|
51
|
+
end
|
52
|
+
|
53
|
+
def teardown
|
54
|
+
ENV["PATH"] = @original_path
|
55
|
+
end
|
56
|
+
|
57
|
+
def exist?(command)
|
58
|
+
create_command(command).exist?
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_exist_absolete_path
|
62
|
+
assert_true(exist?(ruby))
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_exist_in_path
|
66
|
+
ruby_dir, ruby_base_name = File.split(ruby)
|
67
|
+
ENV["PATH"] += "#{File::PATH_SEPARATOR}#{ruby_dir}"
|
68
|
+
assert_true(exist?(ruby_base_name))
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_not_executable
|
72
|
+
assert_false(exist?(__FILE__))
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_not_exist
|
76
|
+
assert_false(exist?("nonexistent"))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
class TestSizeParser < Test::Unit::TestCase
|
18
|
+
private
|
19
|
+
def parse(value)
|
20
|
+
ChupaText::SizeParser.parse(value)
|
21
|
+
end
|
22
|
+
|
23
|
+
sub_test_case("unit") do
|
24
|
+
def test_terabyte
|
25
|
+
assert_equal(1024 ** 4, parse("1TB"))
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_tera
|
29
|
+
assert_equal(1024 ** 4, parse("1T"))
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_gigabyte
|
33
|
+
assert_equal(1024 ** 3, parse("1GB"))
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_giga
|
37
|
+
assert_equal(1024 ** 3, parse("1G"))
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_megabyte
|
41
|
+
assert_equal(1024 ** 2, parse("1MB"))
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_mega
|
45
|
+
assert_equal(1024 ** 2, parse("1M"))
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_kilobyte
|
49
|
+
assert_equal(1024 ** 1, parse("1KB"))
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_kilo
|
53
|
+
assert_equal(1024 ** 1, parse("1K"))
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_byte
|
57
|
+
assert_equal(1, parse("1B"))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
sub_test_case("float") do
|
62
|
+
def test_with_unit
|
63
|
+
assert_equal(1024 + 512, parse("1.5KB"))
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_without_unit
|
67
|
+
assert_equal(2, parse("1.5"))
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
sub_test_case("invalid") do
|
72
|
+
def test_unknwon_unit
|
73
|
+
size = "1.5PB"
|
74
|
+
assert_raise(ChupaText::SizeParser::InvalidSizeError.new(size)) do
|
75
|
+
parse(size)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chupa-text
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -99,6 +99,7 @@ files:
|
|
99
99
|
- data/mime-types.conf
|
100
100
|
- lib/chupa-text/data.rb
|
101
101
|
- lib/chupa-text/version.rb
|
102
|
+
- lib/chupa-text/logger.rb
|
102
103
|
- lib/chupa-text/extractor.rb
|
103
104
|
- lib/chupa-text/command/chupa-text.rb
|
104
105
|
- lib/chupa-text/command/chupa-text-generate-decomposer.rb
|
@@ -107,26 +108,32 @@ files:
|
|
107
108
|
- lib/chupa-text/text-data.rb
|
108
109
|
- lib/chupa-text/configuration-loader.rb
|
109
110
|
- lib/chupa-text/virtual-file-data.rb
|
111
|
+
- lib/chupa-text/size-parser.rb
|
110
112
|
- lib/chupa-text/formatters/json.rb
|
111
113
|
- lib/chupa-text/virtual-content.rb
|
112
114
|
- lib/chupa-text/decomposers/csv.rb
|
113
115
|
- lib/chupa-text/decomposers/tar.rb
|
114
116
|
- lib/chupa-text/decomposers/xml.rb
|
115
117
|
- lib/chupa-text/decomposers/gzip.rb
|
118
|
+
- lib/chupa-text/error.rb
|
116
119
|
- lib/chupa-text/formatters.rb
|
117
120
|
- lib/chupa-text/decomposers.rb
|
118
121
|
- lib/chupa-text/command.rb
|
119
122
|
- lib/chupa-text/file-content.rb
|
120
123
|
- lib/chupa-text/decomposer.rb
|
124
|
+
- lib/chupa-text/external-command.rb
|
121
125
|
- lib/chupa-text/mime-type.rb
|
126
|
+
- lib/chupa-text/loggable.rb
|
122
127
|
- lib/chupa-text/input-data.rb
|
123
128
|
- lib/chupa-text/mime-type-registry.rb
|
129
|
+
- lib/chupa-text/default-logger.rb
|
124
130
|
- lib/chupa-text.rb
|
125
131
|
- doc/text/decomposer.md
|
126
132
|
- doc/text/command-line.md
|
127
133
|
- doc/text/news.md
|
128
134
|
- doc/text/library.md
|
129
135
|
- test/test-decomposers.rb
|
136
|
+
- test/test-default-logger.rb
|
130
137
|
- test/test-decomposer.rb
|
131
138
|
- test/test-virtual-content.rb
|
132
139
|
- test/command/test-chupa-text.rb
|
@@ -143,6 +150,8 @@ files:
|
|
143
150
|
- test/fixture/command/chupa-text/no-decomposer.conf
|
144
151
|
- test/fixture/command/chupa-text/hello.txt
|
145
152
|
- test/fixture/extractor/hello.txt
|
153
|
+
- test/test-external-command.rb
|
154
|
+
- test/test-size-parser.rb
|
146
155
|
- test/decomposers/test-csv.rb
|
147
156
|
- test/decomposers/test-gzip.rb
|
148
157
|
- test/decomposers/test-tar.rb
|