docbook_files 0.2.0 → 0.3.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.
- data/About.org +77 -0
- data/Gemfile +7 -1
- data/Gemfile.lock +27 -0
- data/Guardfile +6 -0
- data/History.txt +7 -0
- data/README.md +7 -7
- data/Rakefile +6 -4
- data/bin/docbook_files +6 -88
- data/lib/docbook_files/app.rb +212 -0
- data/lib/docbook_files/docbook.rb +2 -1
- data/lib/docbook_files/file_data.rb +19 -25
- data/spec/docbook_files/app_spec.rb +51 -0
- data/spec/docbook_files/docbook_spec.rb +72 -0
- data/spec/docbook_files/file_data_spec.rb +78 -0
- data/{.DS_Store → spec/fixtures/.DS_Store} +0 -0
- data/{test → spec}/fixtures/book-nonexisting.xml +0 -0
- data/{test → spec}/fixtures/bookxi.xml +0 -0
- data/{test → spec}/fixtures/c4/chapter4xi.xml +0 -0
- data/{test → spec}/fixtures/chapter2xi.xml +0 -0
- data/{test → spec}/fixtures/chapter3xi.xml +0 -0
- data/{test → spec}/fixtures/no-ns.xml +0 -0
- data/{test → spec}/fixtures/no-xml.xml +0 -0
- data/{test → spec/fixtures/refs}/.DS_Store +0 -0
- data/{test → spec}/fixtures/refs/book-simple-err.xml +0 -0
- data/{test → spec}/fixtures/refs/book-simple.xml +0 -0
- data/{test → spec}/fixtures/refs/bookxi.xml +0 -0
- data/{test → spec}/fixtures/refs/c4/chapter4xi.xml +0 -0
- data/{test → spec}/fixtures/refs/chapter2xi.xml +3 -0
- data/{test → spec}/fixtures/refs/chapter3xi.xml +0 -0
- data/{test → spec}/fixtures/refs/img/orange.jpeg +0 -0
- data/{test → spec}/fixtures/refs/img/orange.png +0 -0
- data/spec/fixtures/refs/img/ship.svg +3 -0
- data/{test → spec}/fixtures/refs/section1xi.xml +0 -0
- data/{test → spec}/fixtures/section1xi.xml +0 -0
- data/spec/spec_helper.rb +2 -1
- data/version.txt +1 -1
- metadata +38 -38
- data/.gitignore +0 -7
- data/test/docbook_files/test_docbook.rb +0 -76
- data/test/docbook_files/test_file_data.rb +0 -83
- data/test/test_docbook_files.rb +0 -6
data/About.org
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#+title: Notizen
|
|
2
|
+
#+description: Notizen und Aufgaben für docbook_files
|
|
3
|
+
|
|
4
|
+
* Eigenschaften
|
|
5
|
+
|
|
6
|
+
** Grafische Ausgabe der Dateistruktur
|
|
7
|
+
|
|
8
|
+
*** Graphviz?
|
|
9
|
+
Für Ruby gibt es das viele Module, siehe zum Beispiel graph.
|
|
10
|
+
|
|
11
|
+
graph version 2.3.0 has been released!
|
|
12
|
+
|
|
13
|
+
* <https://github.com/seattlerb/graph>
|
|
14
|
+
|
|
15
|
+
Graph is a type of hash that outputs in graphviz's dot format. It
|
|
16
|
+
comes with a command-line interface that is easily pluggable.
|
|
17
|
+
|
|
18
|
+
It ships with plugins to graph dependencies and status of installed
|
|
19
|
+
rubygems, rake tasks, homebrew ports, mac ports, and freebsd ports,
|
|
20
|
+
coloring leaf nodes blue, outdated nodes red, and outdated leaf nodes
|
|
21
|
+
purple (red+blue).
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
** Detailausgabe gegenüber Hierarchie
|
|
25
|
+
|
|
26
|
+
Die Hierarchie ist die Hauptausgabe. Allerdings kann man sich über
|
|
27
|
+
'--details' auch die Detailangaben zu allen beteiligten Dateien
|
|
28
|
+
ausgeben lassen. Hier werden alle Angaben ausgegeben, die oben
|
|
29
|
+
optional sind.
|
|
30
|
+
|
|
31
|
+
Besonders wichtig ist die Zusammenfassung, also Dateien, die an
|
|
32
|
+
mehreren Stellen eingebunden werden, also mehrere Eltern haben!
|
|
33
|
+
|
|
34
|
+
Die Detailausgabe führt dann über zum Releasedokument.
|
|
35
|
+
|
|
36
|
+
** Releasedokument
|
|
37
|
+
|
|
38
|
+
Die Ausgabe kann in einer Datei gespeichert werden, die dann als
|
|
39
|
+
Manifest für ein Archiv dienen kann. Anhand des Dokuments kann man
|
|
40
|
+
schauen, ob die vorliegenden Dateien dem gespeicherten Stand
|
|
41
|
+
entsprechen.
|
|
42
|
+
|
|
43
|
+
** Ausgabeformate
|
|
44
|
+
*** Graphviz & HTML
|
|
45
|
+
*** TODO YAML, JSON
|
|
46
|
+
*** DocBook
|
|
47
|
+
*** RDF?
|
|
48
|
+
|
|
49
|
+
** Zusammenhang mit SCM
|
|
50
|
+
|
|
51
|
+
Wie bei Bones?
|
|
52
|
+
|
|
53
|
+
** DONE Änderung Anzeige
|
|
54
|
+
*** Hierarchie
|
|
55
|
+
|
|
56
|
+
Nur der Hierarchiebaum, aber mit längeren Namen. Das heißt, die
|
|
57
|
+
Dateien werden mit Pfad angezeigt, mit relativem zum Masterdokument.
|
|
58
|
+
|
|
59
|
+
Falls zu lang am Anfang kürzen mit Ellipse.
|
|
60
|
+
|
|
61
|
+
URIs oder nicht relative Dateien werden mit dem Anfang angezeigt,
|
|
62
|
+
ggf. in der Mitte gekürzt.
|
|
63
|
+
|
|
64
|
+
*** Zusammenfassung
|
|
65
|
+
|
|
66
|
+
* X Dateien
|
|
67
|
+
* Y inkludierte DocBooks
|
|
68
|
+
* Z referenzierte
|
|
69
|
+
|
|
70
|
+
YAML/JSON übernehmen und seinen eigenen machen.
|
|
71
|
+
*** Details
|
|
72
|
+
|
|
73
|
+
Die restlichen Angaben werden in die optionalen Details
|
|
74
|
+
verschoben. Die Optionen sind dann nicht mehr notwendig.
|
|
75
|
+
|
|
76
|
+
Wenn jemand den Bericht nicht mag, kann er gern die Daten über
|
|
77
|
+
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,17 +1,38 @@
|
|
|
1
1
|
GEM
|
|
2
2
|
remote: http://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
+
ansi (1.3.0)
|
|
4
5
|
bones (3.7.1)
|
|
5
6
|
little-plugger (>= 1.1.2)
|
|
6
7
|
loquacious (>= 1.8.1)
|
|
7
8
|
rake (>= 0.8.7)
|
|
9
|
+
diff-lcs (1.1.3)
|
|
10
|
+
growl_notify (0.0.3)
|
|
11
|
+
rb-appscript
|
|
12
|
+
guard (0.8.4)
|
|
13
|
+
thor (~> 0.14.6)
|
|
14
|
+
guard-rspec (0.5.0)
|
|
15
|
+
guard (>= 0.8.4)
|
|
8
16
|
libxml-ruby (2.2.2)
|
|
9
17
|
little-plugger (1.1.2)
|
|
10
18
|
loquacious (1.9.0)
|
|
11
19
|
mime-types (1.16)
|
|
12
20
|
rake (0.9.2)
|
|
21
|
+
rb-appscript (0.6.1)
|
|
22
|
+
rb-fsevent (0.4.3.1)
|
|
23
|
+
rspec (2.6.0)
|
|
24
|
+
rspec-core (~> 2.6.0)
|
|
25
|
+
rspec-expectations (~> 2.6.0)
|
|
26
|
+
rspec-mocks (~> 2.6.0)
|
|
27
|
+
rspec-core (2.6.4)
|
|
28
|
+
rspec-expectations (2.6.0)
|
|
29
|
+
diff-lcs (~> 1.1.2)
|
|
30
|
+
rspec-mocks (2.6.0)
|
|
13
31
|
safe_shell (1.0.1)
|
|
14
32
|
term-ansicolor (1.0.6)
|
|
33
|
+
thor (0.14.6)
|
|
34
|
+
turn (0.8.3)
|
|
35
|
+
ansi
|
|
15
36
|
wand (0.4)
|
|
16
37
|
mime-types
|
|
17
38
|
safe_shell (~> 1.0.0)
|
|
@@ -21,6 +42,12 @@ PLATFORMS
|
|
|
21
42
|
|
|
22
43
|
DEPENDENCIES
|
|
23
44
|
bones
|
|
45
|
+
growl_notify
|
|
46
|
+
guard
|
|
47
|
+
guard-rspec
|
|
24
48
|
libxml-ruby
|
|
49
|
+
rb-fsevent
|
|
50
|
+
rspec
|
|
25
51
|
term-ansicolor
|
|
52
|
+
turn
|
|
26
53
|
wand
|
data/Guardfile
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# -*- encoding:utf-8; mode:ruby -*-
|
|
2
|
+
guard 'rspec', :version => 2, :cli => '--color --format nested' do
|
|
3
|
+
watch(%r{^spec/(.+)_spec\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
|
4
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
|
5
|
+
watch('spec/spec_helper.rb') { "spec" }
|
|
6
|
+
end
|
data/History.txt
CHANGED
data/README.md
CHANGED
|
@@ -8,21 +8,21 @@ Features
|
|
|
8
8
|
|
|
9
9
|
* lists and checks included files (XInclude)
|
|
10
10
|
* lists and checks referenced files (media files and others, specidifed by _fileref_)
|
|
11
|
+
* shows errors, e.g. not existing files
|
|
12
|
+
* provides a detail listing
|
|
11
13
|
|
|
12
14
|
Synopsis
|
|
13
15
|
--------
|
|
14
16
|
|
|
15
|
-
docbook_files is a command line application, bin/docbook_files, which checks the files that are included or referenced in a DocBook 5 project.
|
|
17
|
+
docbook_files is a command line application, bin/docbook_files, which checks the files that are included or referenced in a DocBook 5 project.
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
docbook_files myproject.xml
|
|
18
20
|
|
|
19
|
-
This will result in a
|
|
21
|
+
This will result in a overview listing of the file names, starting from file _myproject.xml_ and following every XInclude link or _fileref_ reference. _fileref_ attributes are used in _mediaobject_ tags to specify external image, video, and audio files. Files that could not be found are shown in red.
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
docbook_files --details myproject.xml
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
would result in a list with the added information of the last modified timestamp and the XML namespace of each XML file.
|
|
25
|
+
The --details option adds, well yes, details to the overview: Size, type information, timestamp and checksum.
|
|
26
26
|
|
|
27
27
|
Requirements
|
|
28
28
|
------------
|
data/Rakefile
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
#-*-
|
|
1
|
+
#-*- mode:ruby -*-
|
|
2
2
|
begin
|
|
3
3
|
require 'bones'
|
|
4
4
|
rescue LoadError
|
|
5
5
|
abort '### Please install the "bones" gem ###'
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
require 'rspec/core/rake_task'
|
|
9
|
+
RSpec::Core::RakeTask.new
|
|
10
|
+
|
|
11
|
+
task :default => 'spec'
|
|
12
|
+
task 'gem:release' => 'spec'
|
|
10
13
|
|
|
11
14
|
Bones {
|
|
12
15
|
name 'docbook_files'
|
|
@@ -14,7 +17,6 @@ Bones {
|
|
|
14
17
|
email 'dev@textmulch.de'
|
|
15
18
|
url 'http://github.com/rvolz/docbook_files/'
|
|
16
19
|
ignore_file '.gitignore'
|
|
17
|
-
ignore_file 'About.org'
|
|
18
20
|
depend_on 'libxml-ruby'
|
|
19
21
|
depend_on 'term-ansicolor'
|
|
20
22
|
depend_on 'wand'
|
data/bin/docbook_files
CHANGED
|
@@ -4,95 +4,13 @@
|
|
|
4
4
|
#
|
|
5
5
|
|
|
6
6
|
require 'rubygems'
|
|
7
|
-
|
|
8
|
-
require
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
require 'term/ansicolor'
|
|
12
|
-
|
|
13
|
-
class String
|
|
14
|
-
include Term::ANSIColor
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
require File.expand_path(File.join(File.dirname(__FILE__), %w[.. lib docbook_files]))
|
|
19
|
-
|
|
20
|
-
banner = <<EOB
|
|
21
|
-
docbook_files, Version #{DocbookFiles::VERSION}
|
|
22
|
-
|
|
23
|
-
Displays the include hierarchy of a DocBook 5 project.
|
|
24
|
-
Use the options to see additional information about each file.
|
|
25
|
-
Files that could not be found are shown in red.
|
|
26
|
-
|
|
27
|
-
Usage: docbook_files [options] <DOCBOOK-FILE>
|
|
28
|
-
EOB
|
|
29
|
-
|
|
30
|
-
@output_format = :screen
|
|
31
|
-
|
|
32
|
-
props = []
|
|
33
|
-
opts = OptionParser.new
|
|
34
|
-
ivs = DocbookFiles::FileData.init_vars
|
|
35
|
-
ivs.each do |k,v|
|
|
36
|
-
opts.on("--#{k.to_s}","#{v}") {|val| props << k}
|
|
37
|
-
end
|
|
38
|
-
opts.banner = banner
|
|
39
|
-
rest = opts.parse(ARGV)
|
|
40
|
-
|
|
41
|
-
# Print banner if called without arguments
|
|
42
|
-
if rest.length < 1
|
|
43
|
-
puts opts.to_s
|
|
44
|
-
exit 1
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
unless File.exists?(rest[0])
|
|
48
|
-
STDERR.puts "Error: File #{rest[0]} not found."
|
|
49
|
-
exit 1
|
|
7
|
+
begin
|
|
8
|
+
require File.expand_path(File.join(File.dirname(__FILE__), %w[.. lib docbook_files]))
|
|
9
|
+
rescue LoadError
|
|
10
|
+
require 'docbook_files'
|
|
50
11
|
end
|
|
51
12
|
|
|
52
|
-
|
|
53
|
-
puts("docbook_status, Version #{DocbookFiles::VERSION}") if @output_format == :screen
|
|
54
|
-
dbf = DocbookFiles::Docbook.new(rest[0])
|
|
55
|
-
table = dbf.list_as_table([:name,:exists]+props)
|
|
56
|
-
puts
|
|
57
|
-
puts 'File Hierarchy'
|
|
58
|
-
puts '-'*80
|
|
59
|
-
|
|
60
|
-
output_string = "%s %s" + props.map{|p| " %s"}.join
|
|
61
|
-
|
|
62
|
-
def emptyval?(val)
|
|
63
|
-
if val.nil?
|
|
64
|
-
true
|
|
65
|
-
else
|
|
66
|
-
if (val.class == String)
|
|
67
|
-
val.empty?
|
|
68
|
-
else
|
|
69
|
-
false
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
13
|
+
DocbookFiles.run
|
|
73
14
|
|
|
74
|
-
|
|
75
|
-
vals = ['-'*t[:level]+'>',t[:name]] + props.map {|p|
|
|
76
|
-
if (emptyval?(t[p]))
|
|
77
|
-
'<>'
|
|
78
|
-
else
|
|
79
|
-
t[p]
|
|
80
|
-
end
|
|
81
|
-
}
|
|
82
|
-
output = output_string % vals
|
|
83
|
-
if (index == 0)
|
|
84
|
-
output = "+" + output
|
|
85
|
-
elsif (index == table.length-1)
|
|
86
|
-
output = "+" + output
|
|
87
|
-
else
|
|
88
|
-
output = "|" + output
|
|
89
|
-
end
|
|
90
|
-
if t[:exists] == false
|
|
91
|
-
puts output.red
|
|
92
|
-
else
|
|
93
|
-
puts output
|
|
94
|
-
end
|
|
95
|
-
end
|
|
15
|
+
#EOF
|
|
96
16
|
|
|
97
|
-
puts
|
|
98
|
-
exit 0
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# -*-encoding:utf-8-*-
|
|
2
|
+
|
|
3
|
+
require 'optparse'
|
|
4
|
+
require 'yaml'
|
|
5
|
+
require 'json'
|
|
6
|
+
require 'term/ansicolor'
|
|
7
|
+
|
|
8
|
+
class String
|
|
9
|
+
include Term::ANSIColor
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module DocbookFiles
|
|
13
|
+
|
|
14
|
+
# Create a new instance of App, and run the +docbook_files+ application given
|
|
15
|
+
# the command line _args_.
|
|
16
|
+
#
|
|
17
|
+
def self.run( args = nil )
|
|
18
|
+
args ||= ARGV.dup.map! { |v| v.dup }
|
|
19
|
+
::DocbookFiles::App.new.run args
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class App
|
|
23
|
+
@@banner = <<EOB
|
|
24
|
+
docbook_files, Version #{DocbookFiles::VERSION}
|
|
25
|
+
|
|
26
|
+
Displays the include hierarchy of a DocBook 5 project.
|
|
27
|
+
Use the options to see additional information about each file.
|
|
28
|
+
Files that could not be found are shown in red.
|
|
29
|
+
|
|
30
|
+
Usage: docbook_files [options] <DOCBOOK-FILE>
|
|
31
|
+
EOB
|
|
32
|
+
|
|
33
|
+
def initialize(opts = {})
|
|
34
|
+
opts[:stdout] ||= $stdout
|
|
35
|
+
opts[:stderr] ||= $stderr
|
|
36
|
+
@opts = opts
|
|
37
|
+
@stdout = opts[:stdout]
|
|
38
|
+
@stderr = opts[:stderr]
|
|
39
|
+
@opts[:output_format] ||= :screen
|
|
40
|
+
@opts[:details] ||= false
|
|
41
|
+
@props = [:name, :full_name, :namespace, :docbook,
|
|
42
|
+
:version, :tag, :parent, :exists, :ts, :size, :checksum, :mime]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def run(args)
|
|
46
|
+
opts = OptionParser.new
|
|
47
|
+
opts.on('--details','List file details') {|val| @opts[:details] = true}
|
|
48
|
+
# opts.on('--outputformat=yaml|json',['json','yaml'],
|
|
49
|
+
# 'Return the result in YAML or JSON format instead of printing it') {|format|
|
|
50
|
+
# case
|
|
51
|
+
# when format == 'yaml'
|
|
52
|
+
# @opts[:output_format] = :yaml
|
|
53
|
+
# when format == 'json'
|
|
54
|
+
# @opts[:output_format] = :json
|
|
55
|
+
# else
|
|
56
|
+
# STDERR.puts "Unknown output format #{format}. Using screen output.".orange
|
|
57
|
+
# end
|
|
58
|
+
# }
|
|
59
|
+
|
|
60
|
+
opts.banner = @@banner
|
|
61
|
+
rest = opts.parse(args)
|
|
62
|
+
|
|
63
|
+
# Print banner if called without arguments
|
|
64
|
+
if rest.length < 1
|
|
65
|
+
@stdout.puts opts.to_s
|
|
66
|
+
exit 1
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# The main routine
|
|
70
|
+
@stdout.puts("docbook_files, Version #{DocbookFiles::VERSION}") if @opts[:output_format] == :screen
|
|
71
|
+
unless File.exists?(rest[0])
|
|
72
|
+
@stderr.puts "Error: File #{rest[0]} not found.".red
|
|
73
|
+
exit 1
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
begin
|
|
77
|
+
dbf = DocbookFiles::Docbook.new(rest[0])
|
|
78
|
+
table = dbf.list_as_table(@props)
|
|
79
|
+
rescue => exc
|
|
80
|
+
@stderr.puts exc.inspect.red
|
|
81
|
+
end
|
|
82
|
+
output(table)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Terminal output to @stdout
|
|
86
|
+
def output(table)
|
|
87
|
+
output_string = "%3d %-60s %4s %10s"
|
|
88
|
+
@stdout.puts
|
|
89
|
+
@stdout.puts 'File Hierarchy'.bold
|
|
90
|
+
@stdout.puts "%3s %-60s %4s %10s" % ['Lvl', 'File','Type','Size']
|
|
91
|
+
@stdout.puts '-'*80
|
|
92
|
+
sum_size = 0
|
|
93
|
+
sum_not_existing = 0
|
|
94
|
+
table.each do |t|
|
|
95
|
+
output = output_string % [t[:level],
|
|
96
|
+
format_name(t[:level],t[:full_name],table[0][:full_name]),
|
|
97
|
+
t[:type].to_s,
|
|
98
|
+
format_size(t[:size])]
|
|
99
|
+
sum_size += t[:size]
|
|
100
|
+
if t[:exists] == false
|
|
101
|
+
@stdout.puts output.red
|
|
102
|
+
sum_not_existing += 1
|
|
103
|
+
else
|
|
104
|
+
@stdout.puts output
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
@stdout.puts '-'*80
|
|
108
|
+
summary = "#{table.length} file(s) with approx. #{format_size(sum_size)}."
|
|
109
|
+
if sum_not_existing > 0
|
|
110
|
+
summary += " #{sum_not_existing} file(s) not found.".red
|
|
111
|
+
end
|
|
112
|
+
@stdout.puts summary
|
|
113
|
+
if @opts[:details]
|
|
114
|
+
@stdout.puts
|
|
115
|
+
@stdout.puts "Details".bold
|
|
116
|
+
table.each do |t|
|
|
117
|
+
fname = format_name(0,t[:full_name],table[0][:full_name])
|
|
118
|
+
@stdout.puts "File: %s" % [(t[:exists] ? fname : fname.red)]
|
|
119
|
+
if (t[:type] == FileData::TYPE_MAIN)
|
|
120
|
+
@stdout.puts "Main file"
|
|
121
|
+
elsif (t[:type] == FileData::TYPE_INCLUDE)
|
|
122
|
+
@stdout.puts "Included by: %s" % [t[:parent]]
|
|
123
|
+
else
|
|
124
|
+
@stdout.puts "Referenced by: %s" % [t[:parent]]
|
|
125
|
+
end
|
|
126
|
+
next unless t[:exists]
|
|
127
|
+
@stdout.puts "Size: %s (%d)" % [format_size(t[:size]),t[:size]]
|
|
128
|
+
if t[:docbook]
|
|
129
|
+
@stdout.puts "Type: DocBook, Version #{t[:version]}, Tag: #{t[:tag]}"
|
|
130
|
+
else
|
|
131
|
+
@stdout.puts "MIME: #{val_s(t[:mime])}"
|
|
132
|
+
end
|
|
133
|
+
@stdout.puts "Timestamp: %s" % [t[:ts]]
|
|
134
|
+
@stdout.puts "Checksum: %s" % [t[:checksum]]
|
|
135
|
+
@stdout.puts
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
# Format the filename to indicate the level in the hierarchy.
|
|
142
|
+
# Indentation = two spaces per level.
|
|
143
|
+
#
|
|
144
|
+
# If the file is located somewhere below the main file, only the
|
|
145
|
+
# relative part of the path is shown, else the full path.
|
|
146
|
+
# If the resulting string is too long for display it is shortened.
|
|
147
|
+
#
|
|
148
|
+
def format_name(level, full_name, main_name)
|
|
149
|
+
main_dir = File.dirname(main_name)
|
|
150
|
+
md = full_name.match("^#{main_dir}/")
|
|
151
|
+
if md.nil?
|
|
152
|
+
nname = full_name
|
|
153
|
+
else
|
|
154
|
+
nname = md.post_match
|
|
155
|
+
end
|
|
156
|
+
lnname = ' '*level+nname
|
|
157
|
+
if (lnname.length > 60)
|
|
158
|
+
lnname[0..3]+'...'+lnname[-54,lnname.length-1]
|
|
159
|
+
else
|
|
160
|
+
lnname
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# :stopdoc:
|
|
165
|
+
KB = 1024
|
|
166
|
+
MB = 1048576
|
|
167
|
+
GB = 1073741824
|
|
168
|
+
TB = 1099511627776
|
|
169
|
+
PB = 1125899906842624
|
|
170
|
+
# :startdoc:
|
|
171
|
+
|
|
172
|
+
# Format a file size for human consumption.
|
|
173
|
+
# Sizes >= 1PB will return 'XXL'
|
|
174
|
+
def format_size(sz)
|
|
175
|
+
if (emptyval?(sz))
|
|
176
|
+
'-'
|
|
177
|
+
else
|
|
178
|
+
case
|
|
179
|
+
when sz < KB then "#{sz}B"
|
|
180
|
+
when sz >= KB && sz < MB then "#{sz/KB}KB"
|
|
181
|
+
when sz >= MB && sz < GB then "#{sz/MB}MB"
|
|
182
|
+
when sz >= GB && sz < TB then "#{sz/GB}GB"
|
|
183
|
+
when sz >= TB && sz < PB then "#{sz/TB}TB"
|
|
184
|
+
else
|
|
185
|
+
"XXL"
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# Return a string for the value, '<>' if there is none.
|
|
191
|
+
def val_s(val)
|
|
192
|
+
if emptyval?(val)
|
|
193
|
+
'-'
|
|
194
|
+
else
|
|
195
|
+
val.to_s
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# Check whether the value is nil or empty.
|
|
200
|
+
def emptyval?(val)
|
|
201
|
+
if val.nil?
|
|
202
|
+
true
|
|
203
|
+
else
|
|
204
|
+
if (val.class == String)
|
|
205
|
+
val.empty?
|
|
206
|
+
else
|
|
207
|
+
false
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
@@ -23,7 +23,7 @@ module DocbookFiles
|
|
|
23
23
|
|
|
24
24
|
# Return the FileData tree representing the include
|
|
25
25
|
# hierarchy.
|
|
26
|
-
#
|
|
26
|
+
#
|
|
27
27
|
def list
|
|
28
28
|
@fd_tree ||= analyze_file(@main_name,File.dirname(@main_name))
|
|
29
29
|
@fd_tree
|
|
@@ -128,5 +128,6 @@ private
|
|
|
128
128
|
fl.includes = files.map {|f| analyze_file(f,parent_dir,fl)}
|
|
129
129
|
fl
|
|
130
130
|
end
|
|
131
|
+
|
|
131
132
|
end
|
|
132
133
|
end
|
|
@@ -7,13 +7,13 @@ module DocbookFiles
|
|
|
7
7
|
# Data about a member file of a DocBook project
|
|
8
8
|
class FileData
|
|
9
9
|
|
|
10
|
-
#
|
|
11
|
-
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
#
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
# Type for the main/master file
|
|
11
|
+
TYPE_MAIN = :main
|
|
12
|
+
# Type for referenced files
|
|
13
|
+
TYPE_REFERENCE = :ref
|
|
14
|
+
# Type for included files
|
|
15
|
+
TYPE_INCLUDE = :inc
|
|
16
|
+
|
|
17
17
|
attr_accessor :name, :exists, :includes, :refs
|
|
18
18
|
|
|
19
19
|
def FileData.init_vars()
|
|
@@ -79,36 +79,30 @@ module DocbookFiles
|
|
|
79
79
|
self.traverse([:name])
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
# Return a hash with the values for the passed symbols.
|
|
83
|
-
#
|
|
84
|
-
# are used, except the include.
|
|
82
|
+
# Return a hash with the values for the passed symbols.
|
|
83
|
+
# The type is added.
|
|
85
84
|
#
|
|
86
85
|
# Example: to_hash([:name, :mime]) would return
|
|
87
86
|
# {:name => "name", :mime => "application/xml"}.
|
|
88
87
|
#
|
|
89
|
-
def to_hash(props
|
|
90
|
-
me_hash = {}
|
|
91
|
-
if (props.empty?)
|
|
92
|
-
ivs = self.instance_variables
|
|
93
|
-
ivs.delete(:@includes)
|
|
94
|
-
props = ivs.map {|iv| ivs = iv.to_s; ivs[1,ivs.length].to_sym}
|
|
95
|
-
end
|
|
88
|
+
def to_hash(props,type)
|
|
89
|
+
me_hash = {:type => type}
|
|
96
90
|
props.each {|p| me_hash[p] = self.send(p)}
|
|
97
91
|
me_hash
|
|
98
92
|
end
|
|
99
93
|
|
|
100
94
|
# Return a tree-like array of maps with the
|
|
101
95
|
# requested properties (symbols)
|
|
102
|
-
def traverse(props=[])
|
|
103
|
-
me = self.to_hash(props)
|
|
96
|
+
def traverse(props=[],type=TYPE_MAIN)
|
|
97
|
+
me = self.to_hash(props,type)
|
|
104
98
|
me2 = [me]
|
|
105
99
|
unless @refs.empty?()
|
|
106
|
-
me2 += @refs.map {|r| r.to_hash(props)}
|
|
100
|
+
me2 += @refs.map {|r| r.to_hash(props,TYPE_REFERENCE)}
|
|
107
101
|
end
|
|
108
102
|
if @includes.empty?()
|
|
109
103
|
me2
|
|
110
104
|
else
|
|
111
|
-
me2 + @includes.map {|i| i.traverse(props)}
|
|
105
|
+
me2 + @includes.map {|i| i.traverse(props,TYPE_INCLUDE)}
|
|
112
106
|
end
|
|
113
107
|
end
|
|
114
108
|
|
|
@@ -116,15 +110,15 @@ module DocbookFiles
|
|
|
116
110
|
# requested properties (symbols). Each entry gets a level
|
|
117
111
|
# indicator (:level) to show the tree-level.
|
|
118
112
|
#
|
|
119
|
-
def traverse_as_table(props
|
|
120
|
-
me = self.to_hash(props)
|
|
113
|
+
def traverse_as_table(props,level=0,type=TYPE_MAIN)
|
|
114
|
+
me = self.to_hash(props,type)
|
|
121
115
|
me[:level] = level
|
|
122
116
|
me2 = [me]
|
|
123
117
|
unless @refs.empty?()
|
|
124
|
-
me2 += @refs.map {|r| x = r.to_hash(props); x[:level] = level+1; x}
|
|
118
|
+
me2 += @refs.map {|r| x = r.to_hash(props,TYPE_REFERENCE); x[:level] = level+1; x}
|
|
125
119
|
end
|
|
126
120
|
unless @includes.empty?()
|
|
127
|
-
me2 += @includes.map {|i| i.traverse_as_table(props,level+1)}
|
|
121
|
+
me2 += @includes.map {|i| i.traverse_as_table(props,level+1,TYPE_INCLUDE)}
|
|
128
122
|
end
|
|
129
123
|
me2.flatten
|
|
130
124
|
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
require_relative '../spec_helper'
|
|
3
|
+
|
|
4
|
+
module DocbookFiles
|
|
5
|
+
describe App do
|
|
6
|
+
|
|
7
|
+
describe "displays file names" do
|
|
8
|
+
it "according to level" do
|
|
9
|
+
a = App.new
|
|
10
|
+
main_n = '/dir1/dir2/dir3/book.xml'
|
|
11
|
+
main_d = '/dir1/dir2/dir3/'
|
|
12
|
+
a.format_name(0,main_n,main_n).should == 'book.xml'
|
|
13
|
+
a.format_name(2,main_d+'chapter.xml',main_n).should == ' chapter.xml'
|
|
14
|
+
a.format_name(3,main_d+'dir4/chapter.xml',main_n).should == ' dir4/chapter.xml'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "in full when not below main file" do
|
|
18
|
+
a = App.new
|
|
19
|
+
main_n = '/dir1/dir2/dir3/book.xml'
|
|
20
|
+
main_d = '/dir1/dir2/dir3/'
|
|
21
|
+
a.format_name(2,'/dir1/dir2/chapter4.xml',main_n).should == ' /dir1/dir2/chapter4.xml'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "shortened when too long" do
|
|
25
|
+
a = App.new
|
|
26
|
+
main_d = '/dir1/dir2'*5
|
|
27
|
+
main_d2 = '/dir0/dir1/dir2'*5
|
|
28
|
+
main_n = main_d+'/book.xml'
|
|
29
|
+
a.format_name(2,main_d+'/chapter.xml',main_n).should == ' chapter.xml'
|
|
30
|
+
expected = " ...r0/dir1/dir2/dir0/dir1/dir2/dir0/dir1/dir2/chapter.xml"
|
|
31
|
+
a.format_name(2,main_d2+'/chapter.xml',main_n).should == expected
|
|
32
|
+
a.format_name(2,main_d2+'/chapter.xml',main_n).length.should == 61
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "formats file sizes for humans" do
|
|
38
|
+
a = App.new
|
|
39
|
+
a.format_size(1023).should == "1023B"
|
|
40
|
+
a.format_size(1024).should == "1KB"
|
|
41
|
+
a.format_size(1025).should == "1KB"
|
|
42
|
+
a.format_size(999*App::KB).should == "999KB"
|
|
43
|
+
a.format_size(1024*App::KB).should == "1MB"
|
|
44
|
+
a.format_size(3200*App::KB).should == "3MB"
|
|
45
|
+
a.format_size(9999*App::MB).should == "9GB"
|
|
46
|
+
a.format_size(1023*App::GB).should == "1023GB"
|
|
47
|
+
a.format_size(1024 + App::TB).should == "1TB"
|
|
48
|
+
a.format_size(1024 + App::PB).should == "XXL"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
require_relative '../spec_helper'
|
|
3
|
+
|
|
4
|
+
module DocbookFiles
|
|
5
|
+
describe Docbook do
|
|
6
|
+
|
|
7
|
+
it "can cope with invalid xml files" do
|
|
8
|
+
dbf = DocbookFiles::Docbook.new("spec/fixtures/no-xml.xml")
|
|
9
|
+
actual = dbf.list()
|
|
10
|
+
actual.class.should == DocbookFiles::FileData
|
|
11
|
+
actual.name.should == "no-xml.xml"
|
|
12
|
+
actual.size.should == 15
|
|
13
|
+
actual.docbook.should be_false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "finds namespace, DocBookness, version" do
|
|
17
|
+
dbf = DocbookFiles::Docbook.new("spec/fixtures/bookxi.xml")
|
|
18
|
+
actual = dbf.list()
|
|
19
|
+
actual.namespace.should == "http://docbook.org/ns/docbook"
|
|
20
|
+
actual.docbook.should be_true
|
|
21
|
+
actual.version.should == "5.0"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "finds no namespace, DocBookness, version" do
|
|
25
|
+
dbf = DocbookFiles::Docbook.new("spec/fixtures/no-ns.xml")
|
|
26
|
+
actual = dbf.list()
|
|
27
|
+
actual.namespace.should be_empty
|
|
28
|
+
actual.docbook.should be_false
|
|
29
|
+
actual.version.should be_empty
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "finds a tag" do
|
|
33
|
+
dbf = DocbookFiles::Docbook.new("spec/fixtures/bookxi.xml")
|
|
34
|
+
actual = dbf.list()
|
|
35
|
+
actual.tag.should == "book"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "lists" do
|
|
39
|
+
dbf = DocbookFiles::Docbook.new("spec/fixtures/bookxi.xml")
|
|
40
|
+
actual = dbf.list()
|
|
41
|
+
expected = [{:type => :main, :name=>"bookxi.xml"},
|
|
42
|
+
[{:type => :inc, :name=>"chapter2xi.xml"}, [{:type => :inc, :name=>"section1xi.xml"}]],
|
|
43
|
+
[{:type => :inc, :name=>"chapter3xi.xml"}], [{:type => :inc, :name=>"chapter4xi.xml"}]]
|
|
44
|
+
actual.names.should == expected
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "lists as a table" do
|
|
48
|
+
dbf = DocbookFiles::Docbook.new("spec/fixtures/bookxi.xml")
|
|
49
|
+
actual = dbf.list_as_table([:name])
|
|
50
|
+
expected = [{:type => :main, :name=>"bookxi.xml", :level=>0},
|
|
51
|
+
{:type => :inc, :name=>"chapter2xi.xml", :level=>1},
|
|
52
|
+
{:type => :inc, :name=>"section1xi.xml", :level=>2},
|
|
53
|
+
{:type => :inc, :name=>"chapter3xi.xml", :level=>1},
|
|
54
|
+
{:type => :inc, :name=>"chapter4xi.xml", :level=>1}]
|
|
55
|
+
actual.should == expected
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "finds referenced files" do
|
|
59
|
+
dbf = DocbookFiles::Docbook.new("spec/fixtures/refs/book-simple.xml")
|
|
60
|
+
actual = dbf.list()
|
|
61
|
+
actual.refs.map{|r|r.name}.should == ["orange.png","orange.jpeg"]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "marks non-existing references" do
|
|
65
|
+
dbf = DocbookFiles::Docbook.new("spec/fixtures/refs/book-simple-err.xml")
|
|
66
|
+
actual = dbf.list()
|
|
67
|
+
actual.refs.map{|r|r.name}.should == ["orange.png","orange.jpeg"]
|
|
68
|
+
actual.refs.map{|r|r.exists}.should == [true,false]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
require_relative '../spec_helper'
|
|
3
|
+
require 'time'
|
|
4
|
+
|
|
5
|
+
module DocbookFiles
|
|
6
|
+
describe FileData do
|
|
7
|
+
|
|
8
|
+
it "calculates a checksum" do
|
|
9
|
+
f = FileData.new("spec/fixtures/bookxi.xml")
|
|
10
|
+
f.checksum.should == "7d240e7a084c16665ac59e5b927acd6a06953897"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "finds a XML MIME type" do
|
|
14
|
+
f = FileData.new("spec/fixtures/bookxi.xml")
|
|
15
|
+
f.mime.should == "application/xml"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "finds a plain text MIME type" do
|
|
19
|
+
pending("different MIME lib?") do
|
|
20
|
+
f = FileData.new("spec/fixtures/no-xml.xml")
|
|
21
|
+
f.mime.should_not == "application/xml"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "converts a single FileData instance to a hash" do
|
|
26
|
+
f = FileData.new("spec/fixtures/bookxi.xml")
|
|
27
|
+
actual = f.to_hash([:name,:mime,:size],FileData::TYPE_MAIN)
|
|
28
|
+
actual.should == {:type => :main, :name=>"bookxi.xml", :mime=>"application/xml", :size=>481}
|
|
29
|
+
actual = f.to_hash([:name, :full_name, :namespace, :docbook, :version, :tag, :parent, :exists, :ts, :size, :checksum, :mime],FileData::TYPE_MAIN)
|
|
30
|
+
expected = {:type => :main, :name=>"bookxi.xml",
|
|
31
|
+
:full_name=>File.expand_path(".")+"/spec/fixtures/bookxi.xml",
|
|
32
|
+
:namespace=>"", :docbook=>false, :version=>"", :tag=>"", :parent=>nil, :exists=>true,
|
|
33
|
+
:ts=>Time.parse("2011-10-06 20:45:01 +0200"), :size=>481,
|
|
34
|
+
:checksum=>"7d240e7a084c16665ac59e5b927acd6a06953897", :mime=>"application/xml"}
|
|
35
|
+
actual.should == expected
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "converts a FileData tree to an array of hashes" do
|
|
39
|
+
f1 = FileData.new("spec/fixtures/bookxi.xml")
|
|
40
|
+
f2 = FileData.new("spec/fixtures/chapter2xi.xml")
|
|
41
|
+
f3 = FileData.new("spec/fixtures/chapter3xi.xml")
|
|
42
|
+
f1.includes = [f2]
|
|
43
|
+
f2.includes = [f3]
|
|
44
|
+
expected = [{:type => :main, :name=>"bookxi.xml", :mime=>"application/xml", :size=>481},
|
|
45
|
+
[{:type => :inc, :name=>"chapter2xi.xml", :mime=>"application/xml", :size=>366},
|
|
46
|
+
[{:type => :inc, :name=>"chapter3xi.xml", :mime=>"application/xml", :size=>286}]]]
|
|
47
|
+
actual = f1.traverse([:name,:mime,:size],FileData::TYPE_MAIN)
|
|
48
|
+
actual.should == expected
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "converts a FileData tree to a table of hashes" do
|
|
52
|
+
f1 = FileData.new("spec/fixtures/bookxi.xml")
|
|
53
|
+
f2 = FileData.new("spec/fixtures/chapter2xi.xml")
|
|
54
|
+
f3 = FileData.new("spec/fixtures/chapter3xi.xml")
|
|
55
|
+
f1.includes = [f2]
|
|
56
|
+
f2.includes = [f3]
|
|
57
|
+
expected = [{:type => :main, :name=>"bookxi.xml", :mime=>"application/xml", :size=>481, :level=>0},
|
|
58
|
+
{:type => :inc, :name=>"chapter2xi.xml", :mime=>"application/xml", :size=>366, :level=>1},
|
|
59
|
+
{:type => :inc, :name=>"chapter3xi.xml", :mime=>"application/xml", :size=>286, :level=>2}]
|
|
60
|
+
actual = f1.traverse_as_table([:name,:mime,:size])
|
|
61
|
+
actual.should == expected
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "finds non-existing files" do
|
|
65
|
+
f1 = FileData.new("spec/fixtures/bookxi.xml")
|
|
66
|
+
f2 = FileData.new("spec/fixtures/chapter2xi.xml",".",f1)
|
|
67
|
+
f3 = FileData.new("spec/fixtures/chapter3xi.xml",".",f2)
|
|
68
|
+
f5 = FileData.new("spec/fixtures/non-existing.xml",".",f2)
|
|
69
|
+
f1.includes = [f2]
|
|
70
|
+
f2.includes = [f3,f5]
|
|
71
|
+
expected = [{:type => :inc, :name=>"non-existing.xml", :parent=>"chapter2xi.xml"}]
|
|
72
|
+
actual = f1.find_non_existing_files()
|
|
73
|
+
actual.should == expected
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -20,6 +20,9 @@
|
|
|
20
20
|
<imageobject>
|
|
21
21
|
<imagedata align="right" width="6cm" format="JPEG" fileref="img/orange.jpeg"/>
|
|
22
22
|
</imageobject>
|
|
23
|
+
<imageobject>
|
|
24
|
+
<imagedata align="right" width="6cm" format="SVG" fileref="img/ship.svg"/>
|
|
25
|
+
</imageobject>
|
|
23
26
|
<textobject>
|
|
24
27
|
<para>
|
|
25
28
|
Textobject inside a mediaboject.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<?xml version="1.0"?>
|
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
3
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="21 19 416 350" width="416pt" height="350pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2011-10-11 18:52Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.2 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Arbeitsfläche 1</title><g><title>Ebene 1</title><g><use xl:href="#id1_Graphic" filter="url(#Shadow)"/></g><g id="id1_Graphic"><rect x="32.96875" y="26" width="392.7461" height="327.3711" fill="white"/><rect x="32.96875" y="26" width="392.7461" height="327.3711" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g></g></g></svg>
|
|
File without changes
|
|
File without changes
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
1
2
|
|
|
2
3
|
require File.expand_path(
|
|
3
4
|
File.join(File.dirname(__FILE__), %w[.. lib docbook_files]))
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
RSpec.configure do |config|
|
|
6
7
|
# == Mock Framework
|
|
7
8
|
#
|
|
8
9
|
# RSpec uses it's own mocking framework by default. If you prefer to
|
data/version.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.3.0
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: docbook_files
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,11 +9,11 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2011-10-
|
|
12
|
+
date: 2011-10-11 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: libxml-ruby
|
|
16
|
-
requirement: &
|
|
16
|
+
requirement: &2167031960 !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ! '>='
|
|
@@ -21,10 +21,10 @@ dependencies:
|
|
|
21
21
|
version: 2.2.2
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements: *
|
|
24
|
+
version_requirements: *2167031960
|
|
25
25
|
- !ruby/object:Gem::Dependency
|
|
26
26
|
name: term-ansicolor
|
|
27
|
-
requirement: &
|
|
27
|
+
requirement: &2167031020 !ruby/object:Gem::Requirement
|
|
28
28
|
none: false
|
|
29
29
|
requirements:
|
|
30
30
|
- - ! '>='
|
|
@@ -32,10 +32,10 @@ dependencies:
|
|
|
32
32
|
version: 1.0.6
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
|
-
version_requirements: *
|
|
35
|
+
version_requirements: *2167031020
|
|
36
36
|
- !ruby/object:Gem::Dependency
|
|
37
37
|
name: wand
|
|
38
|
-
requirement: &
|
|
38
|
+
requirement: &2167030100 !ruby/object:Gem::Requirement
|
|
39
39
|
none: false
|
|
40
40
|
requirements:
|
|
41
41
|
- - ! '>='
|
|
@@ -43,10 +43,10 @@ dependencies:
|
|
|
43
43
|
version: '0.4'
|
|
44
44
|
type: :runtime
|
|
45
45
|
prerelease: false
|
|
46
|
-
version_requirements: *
|
|
46
|
+
version_requirements: *2167030100
|
|
47
47
|
- !ruby/object:Gem::Dependency
|
|
48
48
|
name: bones
|
|
49
|
-
requirement: &
|
|
49
|
+
requirement: &2167029100 !ruby/object:Gem::Requirement
|
|
50
50
|
none: false
|
|
51
51
|
requirements:
|
|
52
52
|
- - ! '>='
|
|
@@ -54,7 +54,7 @@ dependencies:
|
|
|
54
54
|
version: 3.7.1
|
|
55
55
|
type: :development
|
|
56
56
|
prerelease: false
|
|
57
|
-
version_requirements: *
|
|
57
|
+
version_requirements: *2167029100
|
|
58
58
|
description: docbook_files lists and checks all files related to a DocBook writing
|
|
59
59
|
project.
|
|
60
60
|
email: dev@textmulch.de
|
|
@@ -65,40 +65,43 @@ extra_rdoc_files:
|
|
|
65
65
|
- History.txt
|
|
66
66
|
- bin/docbook_files
|
|
67
67
|
files:
|
|
68
|
-
- .
|
|
69
|
-
- .gitignore
|
|
68
|
+
- About.org
|
|
70
69
|
- Gemfile
|
|
71
70
|
- Gemfile.lock
|
|
71
|
+
- Guardfile
|
|
72
72
|
- History.txt
|
|
73
73
|
- README.md
|
|
74
74
|
- Rakefile
|
|
75
75
|
- bin/docbook_files
|
|
76
76
|
- lib/docbook_files.rb
|
|
77
|
+
- lib/docbook_files/app.rb
|
|
77
78
|
- lib/docbook_files/docbook.rb
|
|
78
79
|
- lib/docbook_files/file_data.rb
|
|
80
|
+
- spec/docbook_files/app_spec.rb
|
|
81
|
+
- spec/docbook_files/docbook_spec.rb
|
|
82
|
+
- spec/docbook_files/file_data_spec.rb
|
|
79
83
|
- spec/docbook_files_spec.rb
|
|
84
|
+
- spec/fixtures/.DS_Store
|
|
85
|
+
- spec/fixtures/book-nonexisting.xml
|
|
86
|
+
- spec/fixtures/bookxi.xml
|
|
87
|
+
- spec/fixtures/c4/chapter4xi.xml
|
|
88
|
+
- spec/fixtures/chapter2xi.xml
|
|
89
|
+
- spec/fixtures/chapter3xi.xml
|
|
90
|
+
- spec/fixtures/no-ns.xml
|
|
91
|
+
- spec/fixtures/no-xml.xml
|
|
92
|
+
- spec/fixtures/refs/.DS_Store
|
|
93
|
+
- spec/fixtures/refs/book-simple-err.xml
|
|
94
|
+
- spec/fixtures/refs/book-simple.xml
|
|
95
|
+
- spec/fixtures/refs/bookxi.xml
|
|
96
|
+
- spec/fixtures/refs/c4/chapter4xi.xml
|
|
97
|
+
- spec/fixtures/refs/chapter2xi.xml
|
|
98
|
+
- spec/fixtures/refs/chapter3xi.xml
|
|
99
|
+
- spec/fixtures/refs/img/orange.jpeg
|
|
100
|
+
- spec/fixtures/refs/img/orange.png
|
|
101
|
+
- spec/fixtures/refs/img/ship.svg
|
|
102
|
+
- spec/fixtures/refs/section1xi.xml
|
|
103
|
+
- spec/fixtures/section1xi.xml
|
|
80
104
|
- spec/spec_helper.rb
|
|
81
|
-
- test/.DS_Store
|
|
82
|
-
- test/docbook_files/test_docbook.rb
|
|
83
|
-
- test/docbook_files/test_file_data.rb
|
|
84
|
-
- test/fixtures/book-nonexisting.xml
|
|
85
|
-
- test/fixtures/bookxi.xml
|
|
86
|
-
- test/fixtures/c4/chapter4xi.xml
|
|
87
|
-
- test/fixtures/chapter2xi.xml
|
|
88
|
-
- test/fixtures/chapter3xi.xml
|
|
89
|
-
- test/fixtures/no-ns.xml
|
|
90
|
-
- test/fixtures/no-xml.xml
|
|
91
|
-
- test/fixtures/refs/book-simple-err.xml
|
|
92
|
-
- test/fixtures/refs/book-simple.xml
|
|
93
|
-
- test/fixtures/refs/bookxi.xml
|
|
94
|
-
- test/fixtures/refs/c4/chapter4xi.xml
|
|
95
|
-
- test/fixtures/refs/chapter2xi.xml
|
|
96
|
-
- test/fixtures/refs/chapter3xi.xml
|
|
97
|
-
- test/fixtures/refs/img/orange.jpeg
|
|
98
|
-
- test/fixtures/refs/img/orange.png
|
|
99
|
-
- test/fixtures/refs/section1xi.xml
|
|
100
|
-
- test/fixtures/section1xi.xml
|
|
101
|
-
- test/test_docbook_files.rb
|
|
102
105
|
- version.txt
|
|
103
106
|
homepage: http://github.com/rvolz/docbook_files/
|
|
104
107
|
licenses: []
|
|
@@ -122,11 +125,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
122
125
|
version: '0'
|
|
123
126
|
requirements: []
|
|
124
127
|
rubyforge_project: docbook_files
|
|
125
|
-
rubygems_version: 1.8.
|
|
128
|
+
rubygems_version: 1.8.11
|
|
126
129
|
signing_key:
|
|
127
130
|
specification_version: 3
|
|
128
131
|
summary: docbook_files lists and checks all files related to a DocBook writing project.
|
|
129
|
-
test_files:
|
|
130
|
-
- test/docbook_files/test_docbook.rb
|
|
131
|
-
- test/docbook_files/test_file_data.rb
|
|
132
|
-
- test/test_docbook_files.rb
|
|
132
|
+
test_files: []
|
data/.gitignore
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
require 'minitest/spec'
|
|
3
|
-
require 'turn'
|
|
4
|
-
require "docbook_files"
|
|
5
|
-
|
|
6
|
-
MiniTest::Unit.use_natural_language_case_names = true
|
|
7
|
-
|
|
8
|
-
module DocbookFiles
|
|
9
|
-
describe Docbook do
|
|
10
|
-
|
|
11
|
-
it "can cope with invalid xml files" do
|
|
12
|
-
dbf = DocbookFiles::Docbook.new("test/fixtures/no-xml.xml")
|
|
13
|
-
actual = dbf.list()
|
|
14
|
-
actual.must_be_kind_of(DocbookFiles::FileData)
|
|
15
|
-
actual.name.must_equal("no-xml.xml")
|
|
16
|
-
actual.size.must_equal(15)
|
|
17
|
-
actual.docbook.must_equal(false)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
it "finds namespace, DocBookness, version" do
|
|
21
|
-
dbf = DocbookFiles::Docbook.new("test/fixtures/bookxi.xml")
|
|
22
|
-
actual = dbf.list()
|
|
23
|
-
actual.namespace.must_equal("http://docbook.org/ns/docbook")
|
|
24
|
-
actual.docbook.must_equal(true)
|
|
25
|
-
actual.version.must_equal("5.0")
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it "finds no namespace, DocBookness, version" do
|
|
29
|
-
dbf = DocbookFiles::Docbook.new("test/fixtures/no-ns.xml")
|
|
30
|
-
actual = dbf.list()
|
|
31
|
-
actual.namespace.must_equal("")
|
|
32
|
-
actual.docbook.must_equal(false)
|
|
33
|
-
actual.version.must_equal("")
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "finds a tag" do
|
|
37
|
-
dbf = DocbookFiles::Docbook.new("test/fixtures/bookxi.xml")
|
|
38
|
-
actual = dbf.list()
|
|
39
|
-
actual.tag.must_equal("book")
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
it "lists" do
|
|
43
|
-
dbf = DocbookFiles::Docbook.new("test/fixtures/bookxi.xml")
|
|
44
|
-
actual = dbf.list()
|
|
45
|
-
expected = [{:name=>"bookxi.xml"},
|
|
46
|
-
[{:name=>"chapter2xi.xml"}, [{:name=>"section1xi.xml"}]],
|
|
47
|
-
[{:name=>"chapter3xi.xml"}], [{:name=>"chapter4xi.xml"}]]
|
|
48
|
-
actual.names.must_equal(expected)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it "lists as a table" do
|
|
52
|
-
dbf = DocbookFiles::Docbook.new("test/fixtures/bookxi.xml")
|
|
53
|
-
actual = dbf.list_as_table([:name])
|
|
54
|
-
expected = [{:name=>"bookxi.xml", :level=>0},
|
|
55
|
-
{:name=>"chapter2xi.xml", :level=>1},
|
|
56
|
-
{:name=>"section1xi.xml", :level=>2},
|
|
57
|
-
{:name=>"chapter3xi.xml", :level=>1},
|
|
58
|
-
{:name=>"chapter4xi.xml", :level=>1}]
|
|
59
|
-
actual.must_equal(expected)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "finds referenced files" do
|
|
63
|
-
dbf = DocbookFiles::Docbook.new("test/fixtures/refs/book-simple.xml")
|
|
64
|
-
actual = dbf.list()
|
|
65
|
-
actual.refs.map{|r|r.name}.must_equal(["orange.png","orange.jpeg"])
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it "marks non-existing references" do
|
|
69
|
-
dbf = DocbookFiles::Docbook.new("test/fixtures/refs/book-simple-err.xml")
|
|
70
|
-
actual = dbf.list()
|
|
71
|
-
actual.refs.map{|r|r.name}.must_equal(["orange.png","orange.jpeg"])
|
|
72
|
-
actual.refs.map{|r|r.exists}.must_equal([true,false])
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
end
|
|
76
|
-
end
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
require 'minitest/spec'
|
|
3
|
-
require 'turn'
|
|
4
|
-
require "docbook_files"
|
|
5
|
-
require 'date'
|
|
6
|
-
|
|
7
|
-
MiniTest::Unit.use_natural_language_case_names = true
|
|
8
|
-
|
|
9
|
-
module DocbookFiles
|
|
10
|
-
describe FileData do
|
|
11
|
-
it "initializes" do
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
it "calculates a checksum" do
|
|
15
|
-
f = FileData.new("test/fixtures/bookxi.xml")
|
|
16
|
-
f.checksum.must_equal("7d240e7a084c16665ac59e5b927acd6a06953897")
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it "finds a XML MIME type" do
|
|
20
|
-
f = FileData.new("test/fixtures/bookxi.xml")
|
|
21
|
-
f.mime.must_equal("application/xml")
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
it "finds a plain text MIME type" do
|
|
25
|
-
skip "Different MIME lib?"
|
|
26
|
-
f = FileData.new("test/fixtures/no-xml.xml")
|
|
27
|
-
f.mime.wont_equal("application/xml")
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it "converts a single FileData instance to a hash" do
|
|
31
|
-
f = FileData.new("test/fixtures/bookxi.xml")
|
|
32
|
-
actual = f.to_hash([:name,:mime,:size])
|
|
33
|
-
actual.must_equal({:name=>"bookxi.xml", :mime=>"application/xml", :size=>481})
|
|
34
|
-
actual = f.to_hash()
|
|
35
|
-
expected = {:name=>"bookxi.xml",
|
|
36
|
-
:full_name=>"/Users/rv/Documents/Projekte/docbook_files/test/fixtures/bookxi.xml",
|
|
37
|
-
:namespace=>"", :docbook=>false, :version=>"", :tag=>"", :parent=>nil, :exists=>true,
|
|
38
|
-
:ts=>Time.parse("2011-10-06 20:45:01 +0200"), :size=>481,
|
|
39
|
-
:checksum=>"7d240e7a084c16665ac59e5b927acd6a06953897", :mime=>"application/xml", :refs => []}
|
|
40
|
-
actual.must_equal(expected)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it "converts a FileData tree to an array of hashes" do
|
|
44
|
-
f1 = FileData.new("test/fixtures/bookxi.xml")
|
|
45
|
-
f2 = FileData.new("test/fixtures/chapter2xi.xml")
|
|
46
|
-
f3 = FileData.new("test/fixtures/chapter3xi.xml")
|
|
47
|
-
f1.includes = [f2]
|
|
48
|
-
f2.includes = [f3]
|
|
49
|
-
expected = [{:name=>"bookxi.xml", :mime=>"application/xml", :size=>481},
|
|
50
|
-
[{:name=>"chapter2xi.xml", :mime=>"application/xml", :size=>366},
|
|
51
|
-
[{:name=>"chapter3xi.xml", :mime=>"application/xml", :size=>286}]]]
|
|
52
|
-
actual = f1.traverse([:name,:mime,:size])
|
|
53
|
-
actual.must_equal(expected)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it "converts a FileData tree to a table of hashes" do
|
|
57
|
-
f1 = FileData.new("test/fixtures/bookxi.xml")
|
|
58
|
-
f2 = FileData.new("test/fixtures/chapter2xi.xml")
|
|
59
|
-
f3 = FileData.new("test/fixtures/chapter3xi.xml")
|
|
60
|
-
f1.includes = [f2]
|
|
61
|
-
f2.includes = [f3]
|
|
62
|
-
expected = [{:name=>"bookxi.xml", :mime=>"application/xml", :size=>481, :level=>0},
|
|
63
|
-
{:name=>"chapter2xi.xml", :mime=>"application/xml", :size=>366, :level=>1},
|
|
64
|
-
{:name=>"chapter3xi.xml", :mime=>"application/xml", :size=>286, :level=>2}]
|
|
65
|
-
actual = f1.traverse_as_table([:name,:mime,:size])
|
|
66
|
-
actual.must_equal(expected)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it "finds non-existing files" do
|
|
70
|
-
f1 = FileData.new("test/fixtures/bookxi.xml")
|
|
71
|
-
f2 = FileData.new("test/fixtures/chapter2xi.xml",".",f1)
|
|
72
|
-
f3 = FileData.new("test/fixtures/chapter3xi.xml",".",f2)
|
|
73
|
-
f5 = FileData.new("test/fixtures/non-existing.xml",".",f2)
|
|
74
|
-
f1.includes = [f2]
|
|
75
|
-
f2.includes = [f3,f5]
|
|
76
|
-
expected = [{:name=>"non-existing.xml", :parent=>"chapter2xi.xml"}]
|
|
77
|
-
actual = f1.find_non_existing_files()
|
|
78
|
-
actual.must_equal(expected)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|