viewworkbook 0.1.3 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ca3d55e875c623f0c5f68504fa4b9c30cb599623277cd42717babd7067234554
4
- data.tar.gz: 8199d7826f4c8edd0af5367bdabb88e41b86b998e3faa2fd828f13aa21042238
3
+ metadata.gz: 4ea17c22ed36a2ee8c245622927a8aaa61b9f3b728ad8187d1ba7b12f9ee96ce
4
+ data.tar.gz: ed2fed97be3c121166774666db444c4f5012e1c669087e22bb45e656c3d7f5dc
5
5
  SHA512:
6
- metadata.gz: 219f9555351a4e53c995f14a591241ffbaf57b23e4acaddf91e1141228662cfa9f42779c4ac175870364942d14f008ef2fbba3029f2e47b417f4573f6243cdbf
7
- data.tar.gz: 955a93762333d83165c41c6dec9826e209c65ef1e6ef62955bfafc74b02cc10b323e02b4422b2cf4b921864fd155dd1289796d6bf02d26bec68921d9e3433987
6
+ metadata.gz: a5a5120bd2585eda4981751ca381250eba81efac51e8238da37fb0c60820c3c466da5af6fc97d8d65a9f249647f64c53c1d18727cef93fa778dc50683ea496c7
7
+ data.tar.gz: ad2f49b95c35e2d05e3ee5fa1f4954de464286abcefc213ce04c59d910b333ebe66be6e1ddf6cbf518ab0fc5a58a0d6ac2fd25fe1fba35875d130b15b0a31676
data/README.md ADDED
@@ -0,0 +1,126 @@
1
+ Viewworkbook
2
+ ========================
3
+ view spreadsheet files in a terminal window
4
+ --------------------------
5
+
6
+ SYNOPSIS
7
+ ========================
8
+ viewworkbook \<spreadsheet\>
9
+
10
+ DESCRIPTION
11
+ ========================
12
+ Viewworkbook lets you read spreadsheet-files in text-mode, in a terminal
13
+ window. It reproduces the tables which are contained in a spreadsheet file and
14
+ lets you navigate through the sheets. The visible part of a sheet is limited
15
+ laterally and horizontally by the terminal-size but can be scrolled. You can
16
+ adapt the width of table-columns, to render the table more readable and
17
+ finally, if you wish, save tables to a text-file. To the author of the
18
+ program, the utility serves to take a quick glance at spreadsheets that are
19
+ received via email, in the Mutt mail-client, which is itself a terminal
20
+ application.
21
+
22
+ The supported spreadsheet formats are those which are handled by the Ruby-gem
23
+ "**roo**" (February 2017):
24
+
25
+ - Microsoft™'s **xls** and **xlsx**,
26
+
27
+ - the OpenDocument spreadsheet **ods**
28
+
29
+ - and the SoftMaker™ spreadsheet formats **pmd** and **pmdx**.
30
+
31
+ Options
32
+ ========================
33
+ Other than the path to the spreadsheet file, viewworkbook does currently not
34
+ interpret any command line arguments.
35
+
36
+ Menu commands
37
+ ========================
38
+ A list of commands and their associated hotkeys (in parenthesis) is shown
39
+ below the current table:
40
+
41
+ | | | | | | | | | |
42
+ |--|--------|--------|--------|--------|--------|--------|--------|------|
43
+ |11| 12.2 | July | 34000 | 5% | prior | 1957 | true | |
44
+ |12| 2.33 | July | 1234 | 12.2% | prior | 1966 | true | |
45
+ |13| 50.0 | August | 334566 | 12% | in | 1966 | false | |
46
+ | | A| B| C| D| E| F| G| |
47
+
48
+
49
+ **value (v) * save to file (f) * sheet (s) * column (c) * up(i) * down(k) * left(j) * right(l) * quit (q) ***
50
+
51
+ When you enter one of the hotkeys, a command can be executed directly (like "q"
52
+ to terminate the program), a sub-menu may be shown (like with "c" which shall
53
+ give you control on column properties) or you are confronted with an input
54
+ invitation (like with "v", where you have to enter a cell-reference). Read on
55
+ for an explanation of each menu command.
56
+
57
+ * **value (v)**
58
+ display the value from a cell. This is useful, when columns are not wide
59
+ nough to show complete values. After entering "**v**", you are
60
+ immediately invited to enter a cell reference. Cells are referenced in
61
+ the format "Column:Row", e.g. D:12 for the cell in column "D" and row
62
+ "12".
63
+
64
+ * **save to file (f)**
65
+ Save the current or all tables to a text file. The command does initially
66
+ show two alternative sub-commands:
67
+
68
+ * **Current sheet (c) * all sheets (a)**
69
+ Independently of your choice, in the next step you will have to enter the
70
+ path to the output file. You will be warned, if the file already exists
71
+ and may choose to either overwrite the existing file or name a different
72
+ one.
73
+
74
+ * **sheet (s)**
75
+ Navigate to a different sheet in the current workbook. You may choose
76
+ between a sheet-number and the name of a sheet. If you want to indicate
77
+ the next sheet **by name**, the list of all available names is first
78
+ shown. You just type right away the one that you want.
79
+
80
+ * **column (c)**
81
+ Alter the properties of the table-columns. At the time of this writing
82
+ (February 2017) the only property that can be changed, is the width of all
83
+ columns. When you enter "**c**" the subcommand column width (w) is shown.
84
+ After entering "**w**" you can enter the desired width in characters.
85
+
86
+ * **Arrows(i, j, k, l)**
87
+ Navigate in a sheet that is too big to be displayed entirely at once.
88
+ These hotkeys correspond to the default navigation keys in the vi editor.
89
+
90
+ * **quit (q)**
91
+ Enter "**q**" to quit the program at any moment except when an input
92
+ invitation is shown.
93
+
94
+ Hidden (menu-)commands
95
+ ------------------------
96
+ There is currently only one such command available:
97
+ The **Escape-key** will interrupt an unfinished action and refresh the display.
98
+
99
+ Other Information
100
+ ==================
101
+
102
+ Development and source code
103
+ ---------------------------
104
+ Viewworkbook has been written in Ruby. As Ruby is an interpreted programming
105
+ language, the executable file and all those that it may refer to at one
106
+ point in time, are themselves the source-files of the current
107
+ program-version. You can open them in any text-editor to scrutinize the
108
+ source-code. If you have received the program as a Ruby-gem, you can also
109
+ decompress a copy of the gem-file with **tar -x**, then **tar -xzf**.
110
+
111
+ Bugs
112
+ ----
113
+ Negative values are not always displayed, when very long (like 15 ciphers).
114
+ Enlarging the column-width further does not have an effect.
115
+
116
+ License
117
+ -------
118
+ Viewworkbook is distributed under the conditions of the WTFPL-2 or later
119
+ version; see https://wtfpl2.com for details.
120
+
121
+ Author
122
+ ------
123
+ Viewworkbook has been developed by Michael Uplawski
124
+ <michael.uplawski@uplawski.eu>
125
+
126
+ *Ω*
data/bin/viewworkbook CHANGED
@@ -2,26 +2,28 @@
2
2
  #encoding: UTF-8
3
3
  =begin
4
4
  /***************************************************************************
5
- * ©2011-2013, Michael Uplawski <michael.uplawski@uplawski.eu> *
5
+ * ©2016-2024, Michael Uplawski <michael.uplawski@uplawski.eu> *
6
6
  * *
7
7
  * This program is free software; you can redistribute it and/or modify *
8
- * it under the terms of the GNU General Public License as published by *
9
- * the Free Software Foundation; either version 3 of the License, or *
10
- * (at your option) any later version. *
8
+ * it under the terms of the WTFPL 2.0 or later, see *
9
+ * http://www.wtfpl.net/about/ *
11
10
  * *
12
11
  * This program is distributed in the hope that it will be useful, *
13
12
  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15
- * GNU General Public License for more details. *
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
16
14
  * *
17
- * You should have received a copy of the GNU General Public License *
18
- * along with this program; if not, write to the *
19
- * Free Software Foundation, Inc., *
20
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21
15
  ***************************************************************************/
22
16
  =end
23
17
 
24
18
  require_relative "../lib/viewworkbook.rb"
19
+ require_relative "../lib/basic_logging.rb"
20
+
21
+ BasicLogging::set_target STDOUT
22
+ BasicLogging::set_level BasicLogging::INFO
23
+
24
+ # comment in for verbose output
25
+ # BasicLogging::set_target "/tmp/viewworkbook.log"
26
+ # BasicLogging::set_level BasicLogging::DEBUG
25
27
 
26
28
  if(ARGV.compact.empty?)
27
29
  puts purple("\n\tYou must name a valid spreadsheet file! Aborting\n")
data/lib/action.rb CHANGED
@@ -1,32 +1,25 @@
1
1
  #encoding: UTF-8
2
-
3
2
  =begin
4
3
  /***************************************************************************
5
- * Copyright © 2014, Michael Uplawski <michael.uplawski@uplawski.eu> *
4
+ * ©2016-2024, Michael Uplawski <michael.uplawski@uplawski.eu> *
6
5
  * *
7
6
  * This program is free software; you can redistribute it and/or modify *
8
- * it under the terms of the GNU General Public License as published by *
9
- * the Free Software Foundation; either version 3 of the License, or *
10
- * (at your option) any later version. *
7
+ * it under the terms of the WTFPL 2.0 or later, see *
8
+ * http://www.wtfpl.net/about/ *
11
9
  * *
12
10
  * This program is distributed in the hope that it will be useful, *
13
11
  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15
- * GNU General Public License for more details. *
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
16
13
  * *
17
- * You should have received a copy of the GNU General Public License *
18
- * along with this program; if not, write to the *
19
- * Free Software Foundation, Inc., *
20
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21
14
  ***************************************************************************/
22
15
  =end
23
16
 
24
- require_relative 'logging'
17
+ require_relative 'basic_logging'
25
18
 
26
19
  # An Action is executed on a user's request.
27
20
  # It has a name, an associated closure and hotkey.
28
21
  class Action
29
- include Logging
22
+ include BasicLogging
30
23
 
31
24
  class ActionError < StandardError
32
25
  end
@@ -39,7 +32,6 @@ class Action
39
32
 
40
33
 
41
34
  def initialize(options = {}, &b)
42
- init_logger(STDOUT, Logger::INFO)
43
35
 
44
36
  @name = options[:name]
45
37
  @key = options[:key]
@@ -0,0 +1,178 @@
1
+ #!/bin/env ruby
2
+ #encoding: UTF-8
3
+ =begin
4
+ /***************************************************************************
5
+ * ©2023-2024, Michael Uplawski <michael.uplawski@uplawski.eu> *
6
+ * *
7
+ * This program is free software; you can redistribute it and/or modify *
8
+ * it under the terms of the WTFPL 2.0 or later, see *
9
+ * http://www.wtfpl.net/about/ *
10
+ * *
11
+ * This program is distributed in the hope that it will be useful, *
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
14
+ * *
15
+ ***************************************************************************/
16
+ =end
17
+
18
+ #
19
+ # Simplified logging.
20
+ # See example code at the bottom of this file.
21
+ # Execute this file to see the output.
22
+ #
23
+
24
+ #require 'time'
25
+
26
+ module BasicLogging
27
+
28
+ DEBUG = 0
29
+ INFO = 1
30
+ WARN = 2
31
+ ERROR = 3
32
+ FATAL = 4
33
+ UNKNOWN = nil
34
+
35
+ # this is mainly for the translation of method calls into log levels
36
+ Levels = {:debug => DEBUG, :info => INFO, :warn => WARN, :error => ERROR,
37
+ :fatal => FATAL, :unknown => UNKNOWN}
38
+
39
+ @@log_level = UNKNOWN
40
+ @@target = STDOUT
41
+ @@muted = []
42
+
43
+ # do not log, if caller is obj (class or instance)
44
+ def self.mute(obj)
45
+ name = obj.class == Class ? obj.name.dup : obj.class.name
46
+ @@muted << name
47
+ end
48
+
49
+ def self.is_muted?(obj)
50
+ name = obj.class == Class ? obj.name.dup : obj.class.name
51
+ @@muted.include?(name)
52
+ end
53
+
54
+ # set the log level
55
+ def self::set_level(lv)
56
+ if lv.respond_to?(:to_str)
57
+ lv = Levels[lv.to_sym]
58
+ end
59
+ if(!lv || (lv.respond_to?(:to_int) && lv >= DEBUG && lv <= FATAL) )
60
+ @@log_level = lv
61
+ else
62
+ STDERR.puts __FILE__.dup << ": ERROR : invalid log level \"" << lv.to_s << "\""
63
+ STDERR.puts "Keepinng old log level " << Levels.keys.detect {| k| Levels[k] == @@log_level}.to_s
64
+ end
65
+ end
66
+
67
+ def set_level(lv)
68
+ BasicLogging::set_level(lv)
69
+ end
70
+
71
+ # set the log target
72
+ def self::set_target(tg)
73
+ if tg.respond_to?(:to_io)
74
+ @@target = tg
75
+ elsif(!File::exist?(tg) || ( File.file?(tg) && File.writable?(tg) ) )
76
+ @@target = File.open(tg, 'w+')
77
+ else
78
+ STDERR.puts __FILE__.dup << ': ERROR : target ' << tg << ' cannot be set'
79
+ STDERR.puts "Keeping old target " << @@target.inspect
80
+ return
81
+ end
82
+ end
83
+
84
+ def set_target(tg)
85
+ BasicLogging::set_target(tg)
86
+ end
87
+
88
+ # Output of log messages, depending on the log level set for the calling class
89
+ # and the name of the alias method which is actually called.
90
+ def log(message)
91
+ if !BasicLogging.is_muted?(self)
92
+ # how has this method been called?
93
+ mlevel = __callee__
94
+ if Levels.has_key?(mlevel) && Levels[mlevel] <= FATAL
95
+ # output only for levels equal or above the value that corresponds to
96
+ # the calling alias.
97
+ format_log( message, mlevel) if @@log_level && Levels[mlevel] >= @@log_level
98
+ else
99
+ STDERR.puts __FILE__.dup << ": ERROR : invalid log level \"" << mlevel.to_s << "\""
100
+ end
101
+ end
102
+ end
103
+
104
+ alias :debug :log
105
+ alias :info :log
106
+ alias :warn :log
107
+ alias :error :log
108
+ alias :fatal :log
109
+
110
+ attr_reader :target, :log_level
111
+
112
+ private
113
+
114
+ # 1 format_log for all loggers.
115
+ def format_log(message, mlevel)
116
+ # indicate if a registered class or the registered object of a class is calling.
117
+ name = self.class == Class ? self.name.dup << ' [class]' : self.class.name
118
+ @@target.puts '' << name << ' ' << mlevel.to_s << ' ' << Time.now.strftime("%H:%M:%S:%6N") << ': ' << message
119
+ end
120
+ end
121
+ #---------test: execute file----------
122
+ if $0 == __FILE__
123
+ Array.extend(BasicLogging)
124
+ Array.set_level(BasicLogging::INFO)
125
+ Array.info('TEST')
126
+ ar = Array.new
127
+ ar.extend(BasicLogging)
128
+ # --- no output :
129
+ l = __LINE__
130
+ ar.debug(l.next.to_s << ': debug-test 0')
131
+ # output
132
+ ar.set_level(BasicLogging::DEBUG)
133
+ l = __LINE__
134
+ ar.debug(l.next.to_s << ': debug-test 1')
135
+
136
+ obj = Object.new
137
+ obj.extend(BasicLogging)
138
+ obj.set_level(BasicLogging::DEBUG)
139
+ puts "--------debug-----------"
140
+ obj.debug('debug')
141
+ obj.info('info')
142
+ obj.warn('warn')
143
+ obj.error('error')
144
+ obj.fatal('fatal')
145
+ puts "--------info-----------"
146
+ obj.set_level("info")
147
+ obj.debug('debug')
148
+ obj.info('info')
149
+ obj.warn('warn')
150
+ obj.error('error')
151
+ obj.fatal('fatal')
152
+ puts "--------fatal-----------"
153
+ obj.set_level("fatal")
154
+ obj.debug('debug')
155
+ obj.info('info')
156
+ obj.warn('warn')
157
+ obj.error('error')
158
+ obj.fatal('fatal')
159
+ puts "--------UNKNOWN-----------"
160
+ obj.set_level(nil)
161
+ obj.debug('debug')
162
+ obj.info('info')
163
+ obj.warn('warn')
164
+ obj.error('error')
165
+ obj.fatal('fatal')
166
+ puts " ------ Output into file ----"
167
+ obj.set_target "/tmp/test_log.log"
168
+ puts " ------ INFO -----------"
169
+ obj.set_level BasicLogging::INFO
170
+ obj.info('info output')
171
+
172
+ obj.info('info output 2')
173
+ puts "---------- invalid -------"
174
+ obj.set_target "/dev/sr0"
175
+ obj.set_level "power"
176
+ end
177
+
178
+ # EOF
data/lib/cell.rb CHANGED
@@ -1,27 +1,19 @@
1
1
  #encoding: UTF-8
2
-
3
2
  =begin
4
3
  /***************************************************************************
5
- * Copyright ©2016-2016, Michael Uplawski <michael.uplawski@uplawski.eu> *
4
+ * ©2016-2024, Michael Uplawski <michael.uplawski@uplawski.eu> *
6
5
  * *
7
6
  * This program is free software; you can redistribute it and/or modify *
8
- * it under the terms of the GNU General Public License as published by *
9
- * the Free Software Foundation; either version 3 of the License, or *
10
- * (at your option) any later version. *
7
+ * it under the terms of the WTFPL 2.0 or later, see *
8
+ * http://www.wtfpl.net/about/ *
11
9
  * *
12
10
  * This program is distributed in the hope that it will be useful, *
13
11
  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15
- * GNU General Public License for more details. *
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
16
13
  * *
17
- * You should have received a copy of the GNU General Public License *
18
- * along with this program; if not, write to the *
19
- * Free Software Foundation, Inc., *
20
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21
14
  ***************************************************************************/
22
15
  =end
23
-
24
- require_relative 'logging'
16
+ require_relative 'basic_logging'
25
17
  require_relative 'row'
26
18
  require_relative 'column'
27
19
 
@@ -32,19 +24,18 @@ class Cell
32
24
  @@DEF_TYPE=Integer
33
25
  @@split_pattern = nil
34
26
 
35
- self.extend(Logging)
36
- @@log = self.init_logger
27
+ include BasicLogging
37
28
 
38
29
  def initialize(row = nil, col = nil, value = nil)
39
- @log = @@log
40
30
  @row = row if row
41
31
  @col = col if col
32
+ @debinfo = '(' << @col.number.to_s << ':' << @row.number.to_s << ') '
42
33
  @type_class = @@DEF_TYPE
43
34
  @value = value
44
35
  split_value
45
36
  set_limits
46
37
  @row.resize
47
- @log.debug("cell.initialize, lines is #{@lines}, value is #{value}, ideal_width is #{@ideal_width}")
38
+ debug(@debinfo << "cell.initialize, lines is #{@lines}, value is #{value}, ideal_width is #{@ideal_width}")
48
39
  end
49
40
 
50
41
  def to_cell()
@@ -70,7 +61,7 @@ class Cell
70
61
  @@split_pattern = nil
71
62
  @value = value
72
63
  split_value
73
- @log.debug('after split_value, lines is ' << @lines.to_s)
64
+ debug(@debinfo << 'after split_value, lines is ' << @lines.to_s)
74
65
  end
75
66
 
76
67
  def col
data/lib/color_output.rb CHANGED
@@ -1,5 +1,21 @@
1
1
  #encoding 'UTF-8'
2
2
 
3
+ =begin
4
+ /***************************************************************************
5
+ * ©2016-2024, Michael Uplawski <michael.uplawski@uplawski.eu> *
6
+ * *
7
+ * This program is free software; you can redistribute it and/or modify *
8
+ * it under the terms of the WTFPL 2.0 or later, see *
9
+ * http://www.wtfpl.net/about/ *
10
+ * *
11
+ * This program is distributed in the hope that it will be useful, *
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
14
+ * *
15
+ ***************************************************************************/
16
+ =end
17
+
18
+
3
19
  # functions to apply colors to terminal output
4
20
 
5
21
  COLORS = {:default => 9, :black => 0, :red => 1, :green => 2, :yellow => 3, :blue => 4, :purple => 5, :cyan => 6, :white => 7 }
data/lib/column.rb CHANGED
@@ -2,38 +2,30 @@
2
2
 
3
3
  =begin
4
4
  /***************************************************************************
5
- * Copyright ©2016-2016, Michael Uplawski <michael.uplawski@uplawski.eu> *
5
+ * ©2016-2024, Michael Uplawski <michael.uplawski@uplawski.eu> *
6
6
  * *
7
7
  * This program is free software; you can redistribute it and/or modify *
8
- * it under the terms of the GNU General Public License as published by *
9
- * the Free Software Foundation; either version 3 of the License, or *
10
- * (at your option) any later version. *
8
+ * it under the terms of the WTFPL 2.0 or later, see *
9
+ * http://www.wtfpl.net/about/ *
11
10
  * *
12
11
  * This program is distributed in the hope that it will be useful, *
13
12
  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15
- * GNU General Public License for more details. *
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
16
14
  * *
17
- * You should have received a copy of the GNU General Public License *
18
- * along with this program; if not, write to the *
19
- * Free Software Foundation, Inc., *
20
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21
15
  ***************************************************************************/
22
16
  =end
23
17
 
24
18
 
25
- require_relative 'logging'
19
+ require_relative 'basic_logging'
26
20
 
27
21
  # Objects of this class represent columns in a spreadsheet table
28
22
 
29
23
  class Column
30
- self.extend(Logging)
31
- @@log = self.init_logger
24
+ include BasicLogging
32
25
  @@DEF_WIDTH=15
33
26
  @@col_width=@@DEF_WIDTH
34
27
  @@columns = Array.new
35
28
  def initialize(number = nil)
36
- @log = @@log
37
29
  @number = number
38
30
  @cells = Array.new
39
31
  @width = @@col_width
@@ -48,7 +40,7 @@ class Column
48
40
  n_cell = Cell.new( cell, @number)
49
41
  else
50
42
  msg = 'For a new cell, a row-number must be specified'
51
- @log.error(yellow(msg))
43
+ error(yellow(msg))
52
44
  raise StandardError(msg)
53
45
  end
54
46
  @cells.insert(n_cell.row, n_cell)
@@ -68,14 +60,14 @@ class Column
68
60
 
69
61
  def self::col_width=(w)
70
62
  @@col_width = w
71
- @log.debug("self::col_width=(#{w}), calling resize")
63
+ debug(@number.to_s << ' ' <<"self::col_width=(#{w}), calling resize")
72
64
 
73
65
  @@columns.each {|col| col.resize(w)}
74
66
  end
75
67
 
76
68
  def resize(width)
77
69
  @width = width
78
- @log.debug('calling resize')
70
+ debug(@number.to_s << ' ' <<'calling resize')
79
71
  @cells.each {|cell| cell.resize}
80
72
  end
81
73
 
data/lib/file_checking.rb CHANGED
@@ -1,25 +1,21 @@
1
1
  #encoding: UTF-8
2
2
  =begin
3
3
  /***************************************************************************
4
- * ©2011-2013 Michael Uplawski <michael.uplawski@uplawski.eu> *
4
+ * ©2011-2024, Michael Uplawski <michael.uplawski@uplawski.eu> *
5
5
  * *
6
6
  * This program is free software; you can redistribute it and/or modify *
7
- * it under the terms of the GNU General Public License as published by *
8
- * the Free Software Foundation; either version 3 of the License, or *
9
- * (at your option) any later version. *
7
+ * it under the terms of the WTFPL 2.0 or later, see *
8
+ * http://www.wtfpl.net/about/ *
10
9
  * *
11
10
  * This program is distributed in the hope that it will be useful, *
12
11
  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14
- * GNU General Public License for more details. *
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
15
13
  * *
16
- * You should have received a copy of the GNU General Public License *
17
- * along with this program; if not, write to the *
18
- * Free Software Foundation, Inc., *
19
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
20
14
  ***************************************************************************/
21
15
  =end
22
16
 
17
+ require 'filemagic'
18
+
23
19
  =begin
24
20
  A module to facilitate frequently occuring checks on
25
21
  file-system objects
@@ -39,6 +35,10 @@ module File_Checking
39
35
  :directory => "is not a directory!",
40
36
  :file? => "is not a file!",
41
37
  :file => "is not a file!",
38
+ :type => "is not of the sought file-type (not '%s', but '%s')!",
39
+ :type? => "is not of the sought file-type (not '%s', but '%s')!",
40
+ :mime => "does not have the sought mime-type (not '%s', but '%s')!",
41
+ :mime? => "does not have the sought mime-type (not '%s', but '%s')!",
42
42
  }
43
43
 
44
44
  # Checks if the file with the name from the first
@@ -76,12 +76,37 @@ module File_Checking
76
76
  end
77
77
  msg
78
78
  end
79
- end
79
+
80
+ def self.mime_check(file, mime_type)
81
+ fm = FileMagic.mime
82
+ fd = fm.fd(File.new(file) ).split(';')[0]
83
+ if fd != mime_type.strip
84
+ return file.dup << ' ' << (@@text_messages[:mime] %[mime_type, fd])
85
+ end
86
+ return nil
87
+ end
88
+
89
+ def self.magic_check(file, magic)
90
+ fm = FileMagic.fm
91
+ fd = fm.fd(File.new(file) ).split(';')[0]
92
+ if fd != magic.strip
93
+ return file.dup << ' ' << (@@text_messages[:type] %[magic, fd])
94
+ end
95
+ return nil
96
+ end
97
+
98
+ end # module
80
99
 
81
100
  =begin
82
101
  # example
83
102
 
84
103
  include File_Checking
85
104
  msg = file_check('some_file.txt', [:exist?, :readable?, 'writable'])
105
+ # same as
106
+ # msg = file_check('some_file.txt', [:exist, :readable, 'writable?'])
107
+
108
+ msg ||= magic_check('some_file.txt', [:type?], 'OpenDocument Text'
109
+ msg ||= mime_check('some_file.txt', [:mime?], 'application/vnd.oasis.opendocument.text'
86
110
  puts msg if msg
87
111
  =end
112
+ # E O F