athena 0.0.9 → 0.1.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/README +1 -1
- data/bin/athena +10 -12
- data/lib/athena.rb +11 -7
- data/lib/athena/formats.rb +75 -34
- data/lib/athena/formats/dbm.rb +5 -5
- data/lib/athena/formats/ferret.rb +19 -17
- data/lib/athena/formats/lingo.rb +36 -52
- data/lib/athena/formats/sisis.rb +19 -17
- data/lib/athena/formats/xml.rb +31 -22
- data/lib/athena/parser.rb +2 -5
- data/lib/athena/record.rb +3 -3
- data/lib/athena/version.rb +2 -2
- metadata +4 -4
data/README
CHANGED
data/bin/athena
CHANGED
@@ -77,12 +77,10 @@ OptionParser.new { |opts|
|
|
77
77
|
}
|
78
78
|
|
79
79
|
opts.on('-L', '--list-specs', "List available input formats (specs) and exit") {
|
80
|
-
puts
|
80
|
+
puts 'Available input formats (specs):'
|
81
81
|
|
82
|
-
|
83
|
-
|
84
|
-
formats.each { |f, k|
|
85
|
-
puts " - %-#{max}s = %s" % [f, k]
|
82
|
+
Athena.input_formats.each { |f, k|
|
83
|
+
puts " - #{f}#{" (= #{k})" if f != k.to_s}"
|
86
84
|
}
|
87
85
|
|
88
86
|
exit 0
|
@@ -101,12 +99,10 @@ OptionParser.new { |opts|
|
|
101
99
|
}
|
102
100
|
|
103
101
|
opts.on('-l', '--list-formats', "List available output formats and exit") {
|
104
|
-
puts
|
102
|
+
puts 'Available output formats:'
|
105
103
|
|
106
|
-
|
107
|
-
|
108
|
-
formats.each { |f, k|
|
109
|
-
puts " - %-#{max}s = %s" % [f, k]
|
104
|
+
Athena.output_formats.each { |f, k|
|
105
|
+
puts " - #{f}#{" (= #{k})" if f != k.to_s}"
|
110
106
|
}
|
111
107
|
|
112
108
|
exit 0
|
@@ -173,8 +169,10 @@ if Athena.deferred_output?(format)
|
|
173
169
|
options[:output].puts line
|
174
170
|
}
|
175
171
|
else
|
176
|
-
res =
|
177
|
-
options[:
|
172
|
+
res = Athena.with_format(format) { |_format|
|
173
|
+
parser.parse(options[:input]) { |record|
|
174
|
+
options[:output].puts record.to(_format)
|
175
|
+
}
|
178
176
|
}
|
179
177
|
end
|
180
178
|
|
data/lib/athena.rb
CHANGED
@@ -30,9 +30,9 @@
|
|
30
30
|
# output formats. It's accompanied by a corresponding script that gives access
|
31
31
|
# to all its converting features.
|
32
32
|
#
|
33
|
-
# In order to support additional input and/or output formats, Athena::Formats
|
34
|
-
# needs to be sub-classed and, respectively, an instance method _parse_ or
|
35
|
-
#
|
33
|
+
# In order to support additional input and/or output formats, Athena::Formats::Base
|
34
|
+
# needs to be sub-classed and, respectively, an instance method _parse_ or an
|
35
|
+
# instance method _convert_ supplied. This way, a specific format can even function
|
36
36
|
# as both input and output format.
|
37
37
|
|
38
38
|
module Athena
|
@@ -53,23 +53,27 @@ module Athena
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def input_formats
|
56
|
-
Formats.formats[:in].sort
|
56
|
+
Formats::Base.formats[:in].sort
|
57
57
|
end
|
58
58
|
|
59
59
|
def valid_input_format?(format)
|
60
|
-
Formats.valid_format?(:in, format)
|
60
|
+
Formats::Base.valid_format?(:in, format)
|
61
61
|
end
|
62
62
|
|
63
63
|
def output_formats
|
64
|
-
Formats.formats[:out].sort
|
64
|
+
Formats::Base.formats[:out].sort
|
65
65
|
end
|
66
66
|
|
67
67
|
def valid_output_format?(format)
|
68
|
-
Formats.valid_format?(:out, format)
|
68
|
+
Formats::Base.valid_format?(:out, format)
|
69
69
|
end
|
70
70
|
|
71
71
|
def deferred_output?(format)
|
72
72
|
Formats[:out, format].deferred?
|
73
73
|
end
|
74
74
|
|
75
|
+
def with_format(format, &block)
|
76
|
+
Formats[:out, format].wrap(&block)
|
77
|
+
end
|
78
|
+
|
75
79
|
end
|
data/lib/athena/formats.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# #
|
4
4
|
# A component of athena, the database file converter. #
|
5
5
|
# #
|
6
|
-
# Copyright (C) 2007-
|
6
|
+
# Copyright (C) 2007-2009 University of Cologne, #
|
7
7
|
# Albertus-Magnus-Platz, #
|
8
8
|
# 50932 Cologne, Germany #
|
9
9
|
# #
|
@@ -26,56 +26,99 @@
|
|
26
26
|
###############################################################################
|
27
27
|
#++
|
28
28
|
|
29
|
-
|
29
|
+
module Athena::Formats
|
30
|
+
|
31
|
+
def self.[](direction, format)
|
32
|
+
if direction == :out
|
33
|
+
if format.class < Base
|
34
|
+
if format.class.direction != direction
|
35
|
+
raise DirectionMismatchError,
|
36
|
+
"expected #{direction}, got #{format.class.direction}"
|
37
|
+
else
|
38
|
+
format
|
39
|
+
end
|
40
|
+
else
|
41
|
+
Base.formats[direction][format].new
|
42
|
+
end
|
43
|
+
else
|
44
|
+
Base.formats[direction][format]
|
45
|
+
end
|
46
|
+
end
|
30
47
|
|
31
|
-
|
48
|
+
class Base
|
32
49
|
|
33
|
-
|
50
|
+
@formats = { :in => {}, :out => {} }
|
34
51
|
|
35
|
-
|
36
|
-
Athena::Formats.instance_variable_get(:@formats)
|
37
|
-
end
|
52
|
+
class << self
|
38
53
|
|
39
|
-
|
40
|
-
|
41
|
-
|
54
|
+
def formats
|
55
|
+
Base.instance_variable_get(:@formats)
|
56
|
+
end
|
42
57
|
|
43
|
-
|
44
|
-
|
45
|
-
|
58
|
+
def valid_format?(direction, format)
|
59
|
+
if format.class < Base
|
60
|
+
direction == format.class.direction
|
61
|
+
else
|
62
|
+
formats[direction].has_key?(format)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def register_format(direction, *aliases, &block)
|
69
|
+
format = name.split('::').last.
|
70
|
+
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
71
|
+
gsub(/([a-z\d])([A-Z])/, '\1_\2').
|
72
|
+
downcase
|
73
|
+
|
74
|
+
register_format!(direction, format, *aliases, &block)
|
75
|
+
end
|
76
|
+
|
77
|
+
def register_format!(direction, format, *aliases, &block)
|
78
|
+
raise "must be a sub-class of #{Base}" unless self < Base
|
79
|
+
|
80
|
+
klass = Class.new(self, &block)
|
81
|
+
|
82
|
+
klass.instance_eval %Q{
|
83
|
+
def direction; #{direction.inspect}; end
|
84
|
+
def name; '#{format}::#{direction}'; end
|
85
|
+
def to_s; '#{format}'; end
|
86
|
+
}
|
87
|
+
|
88
|
+
[format, *aliases].each { |name|
|
89
|
+
if existing = formats[direction][name]
|
90
|
+
raise DuplicateFormatDefinitionError,
|
91
|
+
"format already defined (#{direction}): #{name}"
|
92
|
+
else
|
93
|
+
formats[direction][name] = klass
|
94
|
+
end
|
95
|
+
}
|
96
|
+
end
|
46
97
|
|
47
|
-
def deferred?
|
48
|
-
false
|
49
98
|
end
|
50
99
|
|
51
|
-
def
|
100
|
+
def parse(*args)
|
52
101
|
raise NotImplementedError, 'must be defined by sub-class'
|
53
102
|
end
|
54
103
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
if existing = formats[direction][format]
|
59
|
-
raise DuplicateFormatDefinitionError,
|
60
|
-
"format already defined (#{direction}): #{format} = #{existing}"
|
61
|
-
end
|
104
|
+
def convert(record)
|
105
|
+
raise NotImplementedError, 'must be defined by sub-class'
|
106
|
+
end
|
62
107
|
|
63
|
-
|
108
|
+
def wrap
|
109
|
+
yield self
|
64
110
|
end
|
65
111
|
|
66
|
-
def
|
67
|
-
|
68
|
-
register_format(direction, format)
|
69
|
-
}
|
112
|
+
def deferred?
|
113
|
+
false
|
70
114
|
end
|
71
115
|
|
72
116
|
end
|
73
117
|
|
74
|
-
|
75
|
-
raise NotImplementedError, 'must be defined by sub-class'
|
118
|
+
class DuplicateFormatDefinitionError < StandardError
|
76
119
|
end
|
77
120
|
|
78
|
-
class
|
121
|
+
class DirectionMismatchError < ArgumentError
|
79
122
|
end
|
80
123
|
|
81
124
|
class FormatArgumentError < ArgumentError
|
@@ -83,6 +126,4 @@ class Athena::Formats
|
|
83
126
|
|
84
127
|
end
|
85
128
|
|
86
|
-
Dir[__FILE__.sub(/\.rb
|
87
|
-
require rb
|
88
|
-
}
|
129
|
+
Dir[__FILE__.sub(/\.rb\z/, '/**/*.rb')].sort.each { |rb| require rb }
|
data/lib/athena/formats/dbm.rb
CHANGED
@@ -28,11 +28,9 @@
|
|
28
28
|
|
29
29
|
require 'iconv'
|
30
30
|
|
31
|
-
|
31
|
+
module Athena::Formats
|
32
32
|
|
33
|
-
class DBM <
|
34
|
-
|
35
|
-
register_formats :out, 'dbm', 'midos'
|
33
|
+
class DBM < Base
|
36
34
|
|
37
35
|
CRLF = "\015\012"
|
38
36
|
|
@@ -41,7 +39,9 @@ class Athena::Formats
|
|
41
39
|
VALUE_SEPARATOR = '|'
|
42
40
|
RECORD_SEPARATOR = '&&&'
|
43
41
|
|
44
|
-
|
42
|
+
register_format :out, 'midos'
|
43
|
+
|
44
|
+
def convert(record)
|
45
45
|
dbm = ["ID:#{record.id}"]
|
46
46
|
|
47
47
|
record.struct.each { |field, struct|
|
@@ -31,31 +31,33 @@ require 'rubygems'
|
|
31
31
|
gem 'ferret', ENV['FERRET_VERSION'] if ENV['FERRET_VERSION']
|
32
32
|
require 'ferret'
|
33
33
|
|
34
|
-
|
34
|
+
module Athena::Formats
|
35
35
|
|
36
|
-
class Ferret <
|
36
|
+
class Ferret < Base
|
37
37
|
|
38
|
-
register_format :in
|
38
|
+
register_format :in do
|
39
39
|
|
40
|
-
|
40
|
+
attr_reader :record_element, :config, :parser, :match_all_query
|
41
41
|
|
42
|
-
|
43
|
-
|
42
|
+
def initialize(parser)
|
43
|
+
config = parser.config.dup
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
45
|
+
case @record_element = config.delete(:__record_element)
|
46
|
+
when String
|
47
|
+
# fine!
|
48
|
+
when nil
|
49
|
+
raise NoRecordElementError, 'no record element specified'
|
50
|
+
else
|
51
|
+
raise IllegalRecordElementError, "illegal record element #{@record_element.inspect}"
|
52
|
+
end
|
53
|
+
|
54
|
+
@config = config
|
55
|
+
@parser = parser
|
52
56
|
end
|
53
57
|
|
54
|
-
@config = config
|
55
|
-
@parser = parser
|
56
58
|
end
|
57
59
|
|
58
|
-
def parse(source)
|
60
|
+
def parse(source, &block)
|
59
61
|
path = source.path
|
60
62
|
|
61
63
|
# make sure the index can be opened
|
@@ -82,7 +84,7 @@ class Athena::Formats
|
|
82
84
|
unless index.deleted?(i)
|
83
85
|
doc = index[i]
|
84
86
|
|
85
|
-
Athena::Record.new(
|
87
|
+
Athena::Record.new(doc[record_element], block) { |record|
|
86
88
|
config.each { |element, field_config|
|
87
89
|
record.update(element, doc[element], field_config)
|
88
90
|
}
|
data/lib/athena/formats/lingo.rb
CHANGED
@@ -29,68 +29,56 @@
|
|
29
29
|
require 'iconv'
|
30
30
|
require 'enumerator'
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
}.reject { |v| v.empty? }
|
46
|
-
}
|
47
|
-
}
|
48
|
-
end
|
49
|
-
|
50
|
-
def deferred?
|
51
|
-
true
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
32
|
+
module Athena::Formats
|
33
|
+
|
34
|
+
class Lingo < Base
|
35
|
+
|
36
|
+
def convert(record)
|
37
|
+
record.struct.inject([]) { |terms, (field, struct)|
|
38
|
+
terms << struct[:elements].inject([]) { |array, element|
|
39
|
+
array += (struct[:values][element] || []).map { |v|
|
40
|
+
(v || '').strip.gsub(/(?:\r?\n)+/, ' ')
|
41
|
+
}.reject { |v| v.empty? }
|
42
|
+
}
|
43
|
+
}
|
44
|
+
end
|
55
45
|
|
56
|
-
|
57
|
-
|
46
|
+
def deferred?
|
47
|
+
true
|
48
|
+
end
|
58
49
|
|
59
|
-
|
50
|
+
private
|
60
51
|
|
61
|
-
|
62
|
-
|
63
|
-
else
|
64
|
-
warn msg
|
65
|
-
return false
|
66
|
-
end
|
67
|
-
end
|
52
|
+
def check_number_of_arguments(expected, actual, blow = false, &block)
|
53
|
+
return true if block ? block[actual] : expected == actual
|
68
54
|
|
69
|
-
|
70
|
-
check_number_of_arguments(expected, actual, true, &block)
|
71
|
-
end
|
55
|
+
msg = "wrong number of arguments for #{self} (#{actual} for #{expected})"
|
72
56
|
|
57
|
+
if blow
|
58
|
+
raise FormatArgumentError, msg
|
59
|
+
else
|
60
|
+
warn msg
|
61
|
+
return false
|
73
62
|
end
|
63
|
+
end
|
74
64
|
|
65
|
+
def check_number_of_arguments!(expected, actual, &block)
|
66
|
+
check_number_of_arguments(expected, actual, true, &block)
|
75
67
|
end
|
76
68
|
|
77
69
|
# "Nasenbär\n"
|
78
|
-
|
79
|
-
|
80
|
-
register_formats :out, 'lingo/single_word'
|
70
|
+
register_format! :out, 'lingo/single_word' do
|
81
71
|
|
82
|
-
def
|
72
|
+
def convert(record)
|
83
73
|
super.flatten
|
84
74
|
end
|
85
75
|
|
86
76
|
end
|
87
77
|
|
88
78
|
# "John Vorhauer*Vorhauer, John\n"
|
89
|
-
|
79
|
+
register_format! :out, 'lingo/key_value' do
|
90
80
|
|
91
|
-
|
92
|
-
|
93
|
-
def self.convert(record)
|
81
|
+
def convert(record)
|
94
82
|
super.map { |terms|
|
95
83
|
next unless check_number_of_arguments(2, terms.size)
|
96
84
|
|
@@ -101,11 +89,9 @@ class Athena::Formats
|
|
101
89
|
end
|
102
90
|
|
103
91
|
# "Essen,essen #v Essen #s Esse #s\n"
|
104
|
-
|
105
|
-
|
106
|
-
register_formats :out, 'lingo/word_class'
|
92
|
+
register_format! :out, 'lingo/word_class' do
|
107
93
|
|
108
|
-
def
|
94
|
+
def convert(record)
|
109
95
|
super.map { |terms|
|
110
96
|
next unless check_number_of_arguments('odd, > 1', terms.size) { |actual|
|
111
97
|
actual > 1 && actual % 2 == 1
|
@@ -120,11 +106,9 @@ class Athena::Formats
|
|
120
106
|
end
|
121
107
|
|
122
108
|
# "Fax;Faxkopie;Telefax\n"
|
123
|
-
|
124
|
-
|
125
|
-
register_formats :out, 'lingo/multi_value', 'lingo/multi_key'
|
109
|
+
register_format! :out, 'lingo/multi_value', 'lingo/multi_key' do
|
126
110
|
|
127
|
-
def
|
111
|
+
def convert(record)
|
128
112
|
super.map { |terms|
|
129
113
|
next unless check_number_of_arguments('> 1', terms.size) { |actual|
|
130
114
|
actual > 1
|
data/lib/athena/formats/sisis.rb
CHANGED
@@ -26,31 +26,33 @@
|
|
26
26
|
###############################################################################
|
27
27
|
#++
|
28
28
|
|
29
|
-
|
29
|
+
module Athena::Formats
|
30
30
|
|
31
|
-
class Sisis <
|
31
|
+
class Sisis < Base
|
32
32
|
|
33
|
-
register_format :in
|
33
|
+
register_format :in do
|
34
34
|
|
35
|
-
|
35
|
+
attr_reader :record_element, :config, :parser
|
36
36
|
|
37
|
-
|
38
|
-
|
37
|
+
def initialize(parser)
|
38
|
+
config = parser.config.dup
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
40
|
+
case @record_element = config.delete(:__record_element)
|
41
|
+
when String
|
42
|
+
# fine!
|
43
|
+
when nil
|
44
|
+
raise NoRecordElementError, 'no record element specified'
|
45
|
+
else
|
46
|
+
raise IllegalRecordElementError, "illegal record element #{@record_element.inspect}"
|
47
|
+
end
|
48
|
+
|
49
|
+
@config = config
|
50
|
+
@parser = parser
|
47
51
|
end
|
48
52
|
|
49
|
-
@config = config
|
50
|
-
@parser = parser
|
51
53
|
end
|
52
54
|
|
53
|
-
def parse(source)
|
55
|
+
def parse(source, &block)
|
54
56
|
record, num = nil, 0
|
55
57
|
|
56
58
|
source.each { |line|
|
@@ -59,7 +61,7 @@ class Athena::Formats
|
|
59
61
|
case element
|
60
62
|
when record_element
|
61
63
|
record.close if record
|
62
|
-
record = Athena::Record.new(
|
64
|
+
record = Athena::Record.new(value, block)
|
63
65
|
num += 1
|
64
66
|
else
|
65
67
|
record.update(element, value, config[element])
|
data/lib/athena/formats/xml.rb
CHANGED
@@ -33,40 +33,47 @@ require 'rubygems'
|
|
33
33
|
require 'xmlstreamin'
|
34
34
|
require 'nuggets/hash/insert'
|
35
35
|
|
36
|
-
|
36
|
+
module Athena::Formats
|
37
37
|
|
38
|
-
class XML <
|
38
|
+
class XML < Base
|
39
39
|
|
40
40
|
include Athena::Util
|
41
41
|
|
42
|
-
register_format :in
|
42
|
+
register_format :in do
|
43
43
|
|
44
|
-
|
44
|
+
attr_reader :specs, :record_element
|
45
|
+
|
46
|
+
def initialize(parser)
|
47
|
+
@specs = setup_specs(parser.config.dup)
|
48
|
+
end
|
45
49
|
|
46
|
-
def initialize(parser)
|
47
|
-
@spec = build_spec(parser)
|
48
|
-
@listener = XMLStreamin::XMLStreamListener.new(@spec)
|
49
50
|
end
|
50
51
|
|
51
|
-
def parse(source)
|
52
|
-
REXML::Document.parse_stream(source, listener)
|
52
|
+
def parse(source, &block)
|
53
|
+
REXML::Document.parse_stream(source, listener(&block))
|
53
54
|
end
|
54
55
|
|
55
|
-
|
56
|
+
=begin
|
57
|
+
register_format :out
|
58
|
+
|
59
|
+
def convert(record)
|
60
|
+
# ...
|
61
|
+
end
|
62
|
+
=end
|
56
63
|
|
57
|
-
|
58
|
-
config = parser.config.dup
|
64
|
+
private
|
59
65
|
|
60
|
-
|
66
|
+
def setup_specs(config)
|
67
|
+
case @record_element = config.delete(:__record_element)
|
61
68
|
when String
|
62
69
|
# fine!
|
63
70
|
when nil
|
64
71
|
raise NoRecordElementError, 'no record element specified'
|
65
72
|
else
|
66
|
-
raise IllegalRecordElementError, "illegal record element #{record_element.inspect}"
|
73
|
+
raise IllegalRecordElementError, "illegal record element #{@record_element.inspect}"
|
67
74
|
end
|
68
75
|
|
69
|
-
|
76
|
+
config.inject({}) { |specs, (element, element_spec)|
|
70
77
|
element_spec.each { |field, c|
|
71
78
|
element.split('/').reverse.inject({}) { |hash, part|
|
72
79
|
s = define_spec(element, field, c, hash.empty? ? :default : hash)
|
@@ -78,9 +85,11 @@ class Athena::Formats
|
|
78
85
|
|
79
86
|
specs
|
80
87
|
}
|
88
|
+
end
|
81
89
|
|
82
|
-
|
83
|
-
record_spec.
|
90
|
+
def listener(&block)
|
91
|
+
record_spec = RecordSpec.new(&block)
|
92
|
+
record_spec.specs!(specs)
|
84
93
|
|
85
94
|
root_spec = BaseSpec.new
|
86
95
|
root_spec.specs!(record_element => record_spec)
|
@@ -92,7 +101,7 @@ class Athena::Formats
|
|
92
101
|
spec.inspect_spec
|
93
102
|
end
|
94
103
|
|
95
|
-
spec
|
104
|
+
XMLStreamin::XMLStreamListener.new(spec)
|
96
105
|
end
|
97
106
|
|
98
107
|
def define_spec(element, field, config, arg)
|
@@ -197,19 +206,19 @@ class Athena::Formats
|
|
197
206
|
|
198
207
|
class RecordSpec < BaseSpec
|
199
208
|
|
200
|
-
attr_reader :
|
209
|
+
attr_reader :block
|
201
210
|
attr_accessor :record
|
202
211
|
|
203
|
-
def initialize(
|
212
|
+
def initialize(&block)
|
204
213
|
super()
|
205
214
|
|
206
|
-
@
|
215
|
+
@block = block
|
207
216
|
end
|
208
217
|
|
209
218
|
def start(context, name, attrs)
|
210
219
|
super
|
211
220
|
|
212
|
-
self.record = Athena::Record.new(
|
221
|
+
self.record = Athena::Record.new(nil, block, true)
|
213
222
|
end
|
214
223
|
|
215
224
|
def done(context, name)
|
data/lib/athena/parser.rb
CHANGED
@@ -33,8 +33,7 @@ class Athena::Parser
|
|
33
33
|
DEFAULT_SEPARATOR = ', '
|
34
34
|
DEFAULT_EMPTY = '<<EMPTY>>'
|
35
35
|
|
36
|
-
attr_reader
|
37
|
-
attr_accessor :block
|
36
|
+
attr_reader :config, :spec
|
38
37
|
|
39
38
|
def initialize(config, spec)
|
40
39
|
@config = build_config(config)
|
@@ -42,9 +41,7 @@ class Athena::Parser
|
|
42
41
|
end
|
43
42
|
|
44
43
|
def parse(source, &block)
|
45
|
-
|
46
|
-
|
47
|
-
res = spec.parse(source)
|
44
|
+
res = spec.parse(source, &block)
|
48
45
|
res.is_a?(Numeric) ? res : Athena::Record.records
|
49
46
|
end
|
50
47
|
|
data/lib/athena/record.rb
CHANGED
@@ -50,10 +50,10 @@ class Athena::Record
|
|
50
50
|
|
51
51
|
attr_reader :struct, :block, :id
|
52
52
|
|
53
|
-
def initialize(
|
54
|
-
@struct = {}
|
55
|
-
@block = block
|
53
|
+
def initialize(id = nil, block = nil, _add_record = !block)
|
56
54
|
@id = id || object_id.abs
|
55
|
+
@block = block
|
56
|
+
@struct = {}
|
57
57
|
|
58
58
|
add_record if _add_record
|
59
59
|
|
data/lib/athena/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: athena
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jens Wille
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-08-
|
12
|
+
date: 2009-08-24 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -68,15 +68,15 @@ licenses: []
|
|
68
68
|
|
69
69
|
post_install_message:
|
70
70
|
rdoc_options:
|
71
|
+
- --line-numbers
|
71
72
|
- --main
|
72
73
|
- README
|
73
|
-
- --line-numbers
|
74
74
|
- --inline-source
|
75
75
|
- --title
|
76
76
|
- athena Application documentation
|
77
|
-
- --all
|
78
77
|
- --charset
|
79
78
|
- UTF-8
|
79
|
+
- --all
|
80
80
|
require_paths:
|
81
81
|
- lib
|
82
82
|
required_ruby_version: !ruby/object:Gem::Requirement
|