ginjo-rfm 1.4.4 → 2.0.pre31
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +107 -0
- data/README.md +378 -133
- data/lib/rfm.rb +51 -19
- data/lib/rfm/VERSION +1 -1
- data/lib/rfm/base.rb +416 -0
- data/lib/rfm/database.rb +14 -9
- data/lib/rfm/layout.rb +148 -96
- data/lib/rfm/metadata/field.rb +5 -5
- data/lib/rfm/metadata/field_control.rb +52 -51
- data/lib/rfm/metadata/script.rb +7 -5
- data/lib/rfm/record.rb +71 -56
- data/lib/rfm/resultset.rb +45 -26
- data/lib/rfm/server.rb +21 -17
- data/lib/rfm/utilities/complex_query.rb +64 -0
- data/lib/rfm/utilities/config.rb +115 -0
- data/lib/rfm/utilities/core_ext.rb +90 -0
- data/lib/rfm/utilities/factory.rb +100 -17
- data/lib/rfm/utilities/xml_parser.rb +94 -0
- data/lib/rfm/version.rb +1 -1
- data/lib/rfm/xml_mini/hpricot.rb +133 -0
- metadata +87 -30
data/lib/rfm/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Rfm
|
2
2
|
VERSION_DEFAULT = 'none'
|
3
|
-
VERSION = File.read(PATH + '/rfm/VERSION').lines.first.chomp rescue VERSION_DEFAULT
|
3
|
+
VERSION = File.read(PATH + '/rfm/VERSION').lines.first.chomp rescue VERSION_DEFAULT
|
4
4
|
VERSION.instance_eval do
|
5
5
|
def components; VERSION.split('.'); end
|
6
6
|
def major; components[0]; end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'active_support/core_ext/kernel/reporting'
|
2
|
+
require 'active_support/core_ext/object/blank'
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
module ActiveSupport # @private :nodoc:
|
6
|
+
module XmlMini_Hpricot # @private :nodoc:
|
7
|
+
extend self
|
8
|
+
|
9
|
+
CONTENT_KEY = '__content__'.freeze
|
10
|
+
|
11
|
+
# Parse an XML Document string or IO into a simple hash
|
12
|
+
#
|
13
|
+
# Same as XmlSimple::xml_in but doesn't shoot itself in the foot,
|
14
|
+
# and uses the defaults from Active Support.
|
15
|
+
#
|
16
|
+
# data::
|
17
|
+
# XML Document string or IO to parse
|
18
|
+
def parse(data)
|
19
|
+
if !data.respond_to?(:read)
|
20
|
+
data = StringIO.new(data || '')
|
21
|
+
end
|
22
|
+
|
23
|
+
char = data.getc
|
24
|
+
if char.nil?
|
25
|
+
{}
|
26
|
+
else
|
27
|
+
data.ungetc(char)
|
28
|
+
silence_warnings { require 'hpricot' } unless defined?(Hpricot)
|
29
|
+
doc = Hpricot.XML(data)
|
30
|
+
|
31
|
+
if doc.root
|
32
|
+
merge_element!({}, doc.root)
|
33
|
+
else
|
34
|
+
raise Hpricot::ParseError,
|
35
|
+
"The document #{doc.to_s.inspect} does not have a valid root"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
# Convert an XML element and merge into the hash
|
42
|
+
#
|
43
|
+
# hash::
|
44
|
+
# Hash to merge the converted element into.
|
45
|
+
# element::
|
46
|
+
# XML element to merge into hash
|
47
|
+
def merge_element!(hash, element)
|
48
|
+
merge!(hash, element.name, collapse(element)) if element.respond_to? :name
|
49
|
+
end
|
50
|
+
|
51
|
+
# Actually converts an XML document element into a data structure.
|
52
|
+
#
|
53
|
+
# element::
|
54
|
+
# The document element to be collapsed.
|
55
|
+
def collapse(element)
|
56
|
+
hash = get_attributes(element)
|
57
|
+
|
58
|
+
if element.respond_to? :children
|
59
|
+
element.each_child {|child| merge_element!(hash, child) unless child.text? }
|
60
|
+
merge_texts!(hash, element) unless empty_content?(element)
|
61
|
+
hash
|
62
|
+
else
|
63
|
+
merge_texts!(hash, element)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Merge all the texts of an element into the hash
|
68
|
+
#
|
69
|
+
# hash::
|
70
|
+
# Hash to add the converted element to.
|
71
|
+
# element::
|
72
|
+
# XML element whose texts are to be merged into the hash
|
73
|
+
def merge_texts!(hash, element)
|
74
|
+
unless element.respond_to? :children and element.children[0].text?
|
75
|
+
hash
|
76
|
+
else
|
77
|
+
# must use value to prevent double-escaping
|
78
|
+
texts = ''
|
79
|
+
#element.texts.each { |t| texts << t.value }
|
80
|
+
#texts << element.children[0].to_s
|
81
|
+
element.each_child { |child| texts << child.inner_text }
|
82
|
+
merge!(hash, CONTENT_KEY, texts)
|
83
|
+
texts
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Adds a new key/value pair to an existing Hash. If the key to be added
|
88
|
+
# already exists and the existing value associated with key is not
|
89
|
+
# an Array, it will be wrapped in an Array. Then the new value is
|
90
|
+
# appended to that Array.
|
91
|
+
#
|
92
|
+
# hash::
|
93
|
+
# Hash to add key/value pair to.
|
94
|
+
# key::
|
95
|
+
# Key to be added.
|
96
|
+
# value::
|
97
|
+
# Value to be associated with key.
|
98
|
+
def merge!(hash, key, value)
|
99
|
+
if hash.has_key?(key)
|
100
|
+
if hash[key].instance_of?(Array)
|
101
|
+
hash[key] << value
|
102
|
+
else
|
103
|
+
hash[key] = [hash[key], value]
|
104
|
+
end
|
105
|
+
elsif value.instance_of?(Array)
|
106
|
+
hash[key] = [value]
|
107
|
+
else
|
108
|
+
hash[key] = value
|
109
|
+
end
|
110
|
+
hash
|
111
|
+
end
|
112
|
+
|
113
|
+
# Converts the attributes array of an XML element into a hash.
|
114
|
+
# Returns an empty Hash if node has no attributes.
|
115
|
+
#
|
116
|
+
# element::
|
117
|
+
# XML element to extract attributes from.
|
118
|
+
def get_attributes(element)
|
119
|
+
attributes = {}
|
120
|
+
element.attributes.to_hash.each { |n,v| attributes[n] = v } if element.respond_to? :attributes
|
121
|
+
attributes
|
122
|
+
end
|
123
|
+
|
124
|
+
# Determines if a document element has text content
|
125
|
+
#
|
126
|
+
# element::
|
127
|
+
# XML element to be checked.
|
128
|
+
def empty_content?(element)
|
129
|
+
#element.texts.join.blank?
|
130
|
+
element.children.nil? #or element.children[0].to_s.blank?
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ginjo-rfm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 1923831879
|
5
|
+
prerelease: 4
|
6
6
|
segments:
|
7
|
-
-
|
8
|
-
-
|
9
|
-
-
|
10
|
-
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
- pre
|
10
|
+
- 31
|
11
|
+
version: 2.0.pre31
|
11
12
|
platform: ruby
|
12
13
|
authors:
|
13
14
|
- Geoff Coffey
|
@@ -19,24 +20,26 @@ autorequire:
|
|
19
20
|
bindir: bin
|
20
21
|
cert_chain: []
|
21
22
|
|
22
|
-
date: 2011-12-
|
23
|
+
date: 2011-12-24 00:00:00 Z
|
23
24
|
dependencies:
|
24
25
|
- !ruby/object:Gem::Dependency
|
25
|
-
name:
|
26
|
+
name: activesupport
|
26
27
|
prerelease: false
|
27
28
|
requirement: &id001 !ruby/object:Gem::Requirement
|
28
29
|
none: false
|
29
30
|
requirements:
|
30
31
|
- - ">="
|
31
32
|
- !ruby/object:Gem::Version
|
32
|
-
hash:
|
33
|
+
hash: 9
|
33
34
|
segments:
|
34
|
-
-
|
35
|
-
|
35
|
+
- 2
|
36
|
+
- 3
|
37
|
+
- 5
|
38
|
+
version: 2.3.5
|
36
39
|
type: :runtime
|
37
40
|
version_requirements: *id001
|
38
41
|
- !ruby/object:Gem::Dependency
|
39
|
-
name:
|
42
|
+
name: i18n
|
40
43
|
prerelease: false
|
41
44
|
requirement: &id002 !ruby/object:Gem::Requirement
|
42
45
|
none: false
|
@@ -47,7 +50,7 @@ dependencies:
|
|
47
50
|
segments:
|
48
51
|
- 0
|
49
52
|
version: "0"
|
50
|
-
type: :
|
53
|
+
type: :runtime
|
51
54
|
version_requirements: *id002
|
52
55
|
- !ruby/object:Gem::Dependency
|
53
56
|
name: rake
|
@@ -78,35 +81,77 @@ dependencies:
|
|
78
81
|
type: :development
|
79
82
|
version_requirements: *id004
|
80
83
|
- !ruby/object:Gem::Dependency
|
81
|
-
name:
|
84
|
+
name: rspec
|
82
85
|
prerelease: false
|
83
86
|
requirement: &id005 !ruby/object:Gem::Requirement
|
84
87
|
none: false
|
85
88
|
requirements:
|
86
|
-
- -
|
89
|
+
- - ~>
|
87
90
|
- !ruby/object:Gem::Version
|
88
|
-
hash:
|
91
|
+
hash: 27
|
89
92
|
segments:
|
93
|
+
- 1
|
94
|
+
- 3
|
90
95
|
- 0
|
91
|
-
version:
|
96
|
+
version: 1.3.0
|
92
97
|
type: :development
|
93
98
|
version_requirements: *id005
|
94
99
|
- !ruby/object:Gem::Dependency
|
95
|
-
name:
|
100
|
+
name: yard
|
96
101
|
prerelease: false
|
97
102
|
requirement: &id006 !ruby/object:Gem::Requirement
|
98
103
|
none: false
|
99
104
|
requirements:
|
100
|
-
- -
|
105
|
+
- - ">="
|
101
106
|
- !ruby/object:Gem::Version
|
102
|
-
hash:
|
107
|
+
hash: 3
|
103
108
|
segments:
|
104
|
-
- 1
|
105
|
-
- 3
|
106
109
|
- 0
|
107
|
-
version:
|
110
|
+
version: "0"
|
108
111
|
type: :development
|
109
112
|
version_requirements: *id006
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: libxml-ruby
|
115
|
+
prerelease: false
|
116
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
hash: 3
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
version: "0"
|
125
|
+
type: :development
|
126
|
+
version_requirements: *id007
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: nokogiri
|
129
|
+
prerelease: false
|
130
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
hash: 3
|
136
|
+
segments:
|
137
|
+
- 0
|
138
|
+
version: "0"
|
139
|
+
type: :development
|
140
|
+
version_requirements: *id008
|
141
|
+
- !ruby/object:Gem::Dependency
|
142
|
+
name: hpricot
|
143
|
+
prerelease: false
|
144
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
hash: 3
|
150
|
+
segments:
|
151
|
+
- 0
|
152
|
+
version: "0"
|
153
|
+
type: :development
|
154
|
+
version_requirements: *id009
|
110
155
|
description: Rfm brings your FileMaker data to Ruby. Now your Ruby scripts and Rails applications can talk directly to your FileMaker server.
|
111
156
|
email: http://groups.google.com/group/rfmcommunity
|
112
157
|
executables: []
|
@@ -116,9 +161,10 @@ extensions: []
|
|
116
161
|
extra_rdoc_files:
|
117
162
|
- LICENSE
|
118
163
|
- README.md
|
119
|
-
|
120
|
-
- lib/rfm.rb
|
164
|
+
- CHANGELOG.md
|
121
165
|
- lib/rfm/VERSION
|
166
|
+
files:
|
167
|
+
- lib/rfm/base.rb
|
122
168
|
- lib/rfm/database.rb
|
123
169
|
- lib/rfm/error.rb
|
124
170
|
- lib/rfm/layout.rb
|
@@ -130,11 +176,19 @@ files:
|
|
130
176
|
- lib/rfm/resultset.rb
|
131
177
|
- lib/rfm/server.rb
|
132
178
|
- lib/rfm/utilities/case_insensitive_hash.rb
|
179
|
+
- lib/rfm/utilities/complex_query.rb
|
180
|
+
- lib/rfm/utilities/config.rb
|
181
|
+
- lib/rfm/utilities/core_ext.rb
|
133
182
|
- lib/rfm/utilities/factory.rb
|
183
|
+
- lib/rfm/utilities/xml_parser.rb
|
134
184
|
- lib/rfm/version.rb
|
185
|
+
- lib/rfm/xml_mini/hpricot.rb
|
186
|
+
- lib/rfm.rb
|
187
|
+
- lib/rfm/VERSION
|
135
188
|
- LICENSE
|
136
189
|
- README.md
|
137
|
-
|
190
|
+
- CHANGELOG.md
|
191
|
+
homepage: https://rubygems.org/gems/ginjo-rfm
|
138
192
|
licenses: []
|
139
193
|
|
140
194
|
post_install_message:
|
@@ -156,12 +210,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
156
210
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
211
|
none: false
|
158
212
|
requirements:
|
159
|
-
- - "
|
213
|
+
- - ">"
|
160
214
|
- !ruby/object:Gem::Version
|
161
|
-
hash:
|
215
|
+
hash: 25
|
162
216
|
segments:
|
163
|
-
-
|
164
|
-
|
217
|
+
- 1
|
218
|
+
- 3
|
219
|
+
- 1
|
220
|
+
version: 1.3.1
|
165
221
|
requirements: []
|
166
222
|
|
167
223
|
rubyforge_project:
|
@@ -171,3 +227,4 @@ specification_version: 3
|
|
171
227
|
summary: Ruby to Filemaker adapter
|
172
228
|
test_files: []
|
173
229
|
|
230
|
+
has_rdoc:
|