ginjo-rfm 2.1.0.pre02 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## Ginjo-Rfm 2.1.0
4
+
5
+ * Removed `:include_portals` query option in favor of `:ignore_portals`.
6
+
7
+ * Added `:max_portal_rows` query option.
8
+
9
+ * Added field-remapping framework to allow model fields with different names than Filemaker fields.
10
+
11
+ * Fix date/time/timestamp translations when writing data to Filemaker.
12
+
13
+ * Detached new Server objects from Factory.servers hash, so wont reuse or stack-up servers.
14
+
15
+ * Added grammar translation layer between xml parser and Rfm, allowing all supported xml grammars to be used with Rfm.
16
+ This will also streamline changes/additions to Filemaker's xml grammar(s).
17
+
18
+ * Added ability to manually import fmprestulset and fmpxmlresult data (from file, variable, etc.).
19
+
20
+ * Fixed case statement for ruby 1.9
21
+
22
+ * Configuration `:use` option is now works for all Rfm objects that respond to `config`.
23
+
3
24
  ## Ginjo-Rfm 2.0.2
4
25
 
5
26
  * Added configuration parameter ignore_bad_data to silence data mismatch errors when loading resultset into records.
data/README.md CHANGED
@@ -13,6 +13,28 @@ Rfm is a Ruby-Filemaker adapter, a Ruby gem that allows scripts and applications
13
13
  * Lardawge at github <https://github.com/lardawge/rfm>
14
14
 
15
15
 
16
+ ## New in version 2.1
17
+
18
+ ginjo-rfm 2.1 is a combination of new features, bug fixes, and a lot of code refactoring.
19
+ Most api calls remain the same, but a good deal of underlying code has been transformed
20
+ to support, and take advantage of, the progress of technologies surrounding Ruby.
21
+
22
+ * Portals are now included by default.
23
+ Removed `:include_portals` query option in favor of `:ignore_portals`.
24
+ Added `:max_portal_rows` query option.
25
+ * Added field-remapping framework to allow model fields with different names than Filemaker fields.
26
+ * Fixed date/time/timestamp translations when writing data to Filemaker.
27
+ * Detached new Server objects from Factory.servers hash, so wont reuse or stack-up servers.
28
+ * Added grammar translation layer between xml parser and Rfm, allowing all supported xml grammars to be used with Rfm.
29
+ This will also streamline changes/additions to Filemaker's xml grammar(s).
30
+ * Added ability to manually import fmpresultset and fmpxmlresult data (from file, variable, etc.).
31
+ * Compatibility fixes for ruby 1.9.
32
+ * Configuration `:use` option now works for all Rfm objects that respond to `config`.
33
+
34
+ Some issues still to be addressed (some longstanding and some more recent) are repeating field writes, some of the
35
+ object management & introspection calls, pull requests, more coverage of Filemaker's query syntax, more error classes, more specs, and more documentation.
36
+
37
+
16
38
  ## New in version 2.0
17
39
 
18
40
  Ginjo-rfm 2.0 brings new features to Rfm, making it easier than ever to work with Filemaker data from your Ruby scripts.
@@ -1 +1,2 @@
1
- 2.1.0.pre02
1
+ 2.1.0
2
+
@@ -36,9 +36,7 @@ module Rfm
36
36
  require 'rfm/layout'
37
37
  require 'rfm/record'
38
38
  require 'rfm/utilities/factory'
39
- require 'delegate'
40
-
41
-
39
+ require 'delegate'
42
40
 
43
41
  class Layout
44
42
 
@@ -196,6 +194,19 @@ module Rfm
196
194
  end
197
195
  end
198
196
 
197
+ def to_partial_path(object = self) #@object)
198
+ return 'some/partial/path'
199
+ ##### DISABLED HERE - ActiveModel Lint only needs a string #####
200
+ ##### TODO: implement to_partial_path to return meaningful string.
201
+ @partial_names[object.class.name] ||= begin
202
+ object = object.to_model if object.respond_to?(:to_model)
203
+
204
+ object.class.model_name.partial_path.dup.tap do |partial|
205
+ path = @view.controller_path
206
+ partial.insert(0, "#{File.dirname(path)}/") if partial.include?(?/) && path.include?(?/)
207
+ end
208
+ end
209
+ end
199
210
 
200
211
  class << self
201
212
 
@@ -225,7 +236,7 @@ module Rfm
225
236
  def layout
226
237
  return @layout if @layout
227
238
  cnf = get_config
228
- return unless cnf[:layout]
239
+ raise "Could not get :layout from get_config in Base.layout method" unless cnf[:layout] #return unless cnf[:layout]
229
240
  @layout = Rfm::Factory.layout(cnf).sublayout
230
241
 
231
242
  # Added by wbr to give config heirarchy: layout -> model -> sublayout
@@ -243,6 +254,7 @@ module Rfm
243
254
 
244
255
  # Just like Layout#find, but searching by record_id will return a record, not a resultset.
245
256
  def find(find_criteria, options={})
257
+ #puts "base.find-#{layout}"
246
258
  r = layout.find(find_criteria, options)
247
259
  if ![Hash,Array].include?(find_criteria.class) and r.size == 1
248
260
  r[0]
@@ -154,7 +154,7 @@ module Rfm
154
154
  end
155
155
 
156
156
  meta_attr_reader :db
157
- #attr_reader :name #, :db
157
+ attr_reader :field_mapping
158
158
  attr_writer :field_names, :portal_meta, :table
159
159
  def_delegator :db, :server
160
160
  alias_method :database, :db
@@ -209,6 +209,8 @@ module Rfm
209
209
  # myLayout.find 54321
210
210
  #
211
211
  def find(find_criteria, options = {})
212
+ #puts "layout.find-#{self}"
213
+ options.merge!({:field_mapping => field_mapping}) if field_mapping
212
214
  get_records(*Rfm::CompoundQuery.new(find_criteria, options))
213
215
  end
214
216
 
@@ -264,12 +266,21 @@ module Rfm
264
266
  end
265
267
 
266
268
  def get_records(action, extra_params = {}, options = {})
267
- # The grammar stuff here won't work properly until you handle config between models/sublayouts/layout/server.
269
+ # TODO: The grammar stuff here won't work properly until you handle config between
270
+ # models/sublayouts/layout/server (Is this done now?).
268
271
  grammar_option = state(options)[:grammar]
269
272
  options.merge!(:grammar=>grammar_option) if grammar_option
270
- include_portals = options[:include_portals] ? options.delete(:include_portals) : nil
271
- xml_response = server.connect(state[:account_name], state[:password], action, params.merge(extra_params), options).body
272
- #Rfm::Resultset.new(db.server, xml_response, self, include_portals)
273
+ #include_portals = options[:include_portals] ? options.delete(:include_portals) : nil
274
+ include_portals = !options[:ignore_portals]
275
+
276
+ # Apply mapping from :field_mapping, to send correct params in URL.
277
+ prms = params.merge(extra_params)
278
+ map = field_mapping.invert
279
+ # TODO: Make this part handle string AND symbol keys.
280
+ #map.each{|k,v| prms[k]=prms.delete(v) if prms[v]}
281
+ prms.dup.each_key{|k| prms[map[k.to_s]]=prms.delete(k) if map[k.to_s]}
282
+
283
+ xml_response = server.connect(state[:account_name], state[:password], action, prms, options).body
273
284
  Rfm::Resultset.new(xml_response, self, include_portals)
274
285
  end
275
286
 
@@ -399,7 +410,7 @@ module Rfm
399
410
 
400
411
  # process field controls
401
412
  doc['FMPXMLLAYOUT']['LAYOUT']['FIELD'].each {|field|
402
- name = field['NAME']
413
+ name = field_mapping[field['NAME']] || field['NAME']
403
414
  style = field['STYLE']
404
415
  type = style['TYPE']
405
416
  value_list_name = style['VALUELIST']
@@ -420,6 +431,18 @@ module Rfm
420
431
  @field_controls.freeze
421
432
  end
422
433
 
434
+ def field_mapping
435
+ @field_mapping ||= load_field_mapping(get_config[:field_mapping])
436
+ end
437
+
438
+ def load_field_mapping(mapping={})
439
+ mapping = (mapping || {}).to_cih
440
+ def mapping.invert
441
+ super.to_cih
442
+ end
443
+ mapping
444
+ end
445
+
423
446
  private :load, :get_records, :params
424
447
 
425
448
 
@@ -63,8 +63,8 @@ module Rfm
63
63
 
64
64
  # Initializes a field object. You'll never need to do this. Instead, get your Field objects from
65
65
  # ResultSet::fields
66
- def initialize(field)
67
- @name = field.name #['name']
66
+ def initialize(field, options={})
67
+ @name = options[:field_mapping][field.name] || field.name rescue field.name #['name']
68
68
  @result = field.result #['result']
69
69
  @type = field.type #['type']
70
70
  @max_repeats = field.max_repeats #['max-repeats']
@@ -78,7 +78,7 @@ module Rfm
78
78
  return nil if (value.nil? or value.empty?)
79
79
  case self.result.downcase
80
80
  when "text" then value
81
- when "number" then BigDecimal.new(value)
81
+ when "number" then BigDecimal.new(value.to_s)
82
82
  when "date" then Date.strptime(value, resultset.date_format)
83
83
  when "time" then DateTime.strptime("1/1/-4712 #{value}", "%m/%d/%Y #{resultset.time_format}")
84
84
  when "timestamp" then DateTime.strptime(value, resultset.timestamp_format)
@@ -126,7 +126,7 @@ module Rfm
126
126
 
127
127
  record.columns.each do |field|
128
128
  next unless field
129
- field_name = field.name
129
+ field_name = @layout.field_mapping[field.name] || field.name rescue field.name
130
130
  field_name.gsub!(Regexp.new(portal + '::'), '') if portal
131
131
  datum = []
132
132
  data = field.data #['data']; data = data.is_a?(Hash) ? [data] : data
@@ -225,7 +225,7 @@ module Rfm
225
225
  def []=(key, value)
226
226
  key_string = key.to_s.downcase
227
227
  return super unless @loaded # is this needed?
228
- raise Rfm::ParameterError, "You attempted to modify a field that does not exist in the current Filemaker layout." unless self.key?(key_string)
228
+ raise Rfm::ParameterError, "You attempted to modify a field (#{key_string}) that does not exist in the current Filemaker layout." unless self.key?(key_string)
229
229
  # @mods[key_string] = value
230
230
  # TODO: This needs cleaning up.
231
231
  # TODO: can we get field_type from record instead?
@@ -155,7 +155,8 @@ module Rfm
155
155
  return if doc.fields.blank?
156
156
 
157
157
  doc.fields.each do |field|
158
- @field_meta[field.name] = Rfm::Metadata::Field.new(field)
158
+ name = layout.field_mapping[field.name] || field.name rescue field.name
159
+ @field_meta[name] = Rfm::Metadata::Field.new(field)
159
160
  end
160
161
  (layout.field_names = field_names) if layout and layout.field_names_no_load.blank?
161
162
  end
@@ -368,6 +368,9 @@ module Rfm
368
368
  result = {}
369
369
  options.each do |key,value|
370
370
  case key
371
+ when :max_portal_rows
372
+ result['-relatedsets.max'] = value
373
+ result['-relatedsets.filter'] = 'layout'
371
374
  when :max_records
372
375
  result['-max'] = value
373
376
  when :skip_records
@@ -8,7 +8,7 @@ module Rfm
8
8
  # Also allow find requests to be :omit.
9
9
  class CompoundQuery < Array
10
10
 
11
- attr_accessor :original_input, :query_type, :key_values, :key_arrays, :key_map, :key_map_string, :key_counter
11
+ attr_accessor :original_input, :query_type, :key_values, :key_arrays, :key_map, :key_map_string, :key_counter, :field_mapping
12
12
 
13
13
  def self.build_test
14
14
  new([{:field1=>['val1a','val1b','val1c'], :field2=>'val2'},{:omit=>true, :field3=>'val3', :field4=>'val4'}, {:omit=>true, :field5=>['val5a','val5b'], :field6=>['val6a','val6b']}], {})
@@ -22,6 +22,7 @@ module Rfm
22
22
  # Returns self as ['-fmpaction', {:hash=>'of', :key=>'values'}, {:options=>'hash'}]
23
23
  def initialize(query, options={})
24
24
  @options = options
25
+ @field_mapping = options.delete(:field_mapping)
25
26
  @original_input = query
26
27
  @key_values = {}
27
28
  @key_arrays = []
@@ -76,7 +77,7 @@ module Rfm
76
77
  query_tag = []
77
78
  val = val.rfm_force_array
78
79
  val.each do |v|
79
- @key_values["-q#{key_counter}"] = key
80
+ @key_values["-q#{key_counter}"] = field_mapping.invert[key] || key
80
81
  @key_values["-q#{key_counter}.value"] = v
81
82
  query_tag << "q#{key_counter}"
82
83
  @key_counter += 1
@@ -25,6 +25,7 @@ module Rfm
25
25
  use
26
26
  parent
27
27
  grammar
28
+ field_mapping
28
29
  )
29
30
 
30
31
  CONFIG_DONT_STORE = %w(strings using parents symbols objects)
@@ -118,16 +118,23 @@ end # Array
118
118
  class Hash
119
119
  # TODO: Possibly deprecated, delete if not used.
120
120
  def rfm_only(*keepers)
121
- self.each_key {|k| self.delete(k) if !keepers.include?(k)}
121
+ self.dup.each_key {|k| self.delete(k) if !keepers.include?(k)}
122
122
  end
123
123
 
124
124
  def rfm_filter(*args)
125
125
  options = args.rfm_extract_options!
126
126
  delete = options[:delete]
127
- self.each_key do |k|
127
+ self.dup.each_key do |k|
128
128
  self.delete(k) if (delete ? args.include?(k) : !args.include?(k))
129
129
  end
130
130
  end
131
+
132
+ # Convert hash to Rfm::CaseInsensitiveHash
133
+ def to_cih
134
+ new = Rfm::CaseInsensitiveHash.new
135
+ self.each{|k,v| new[k] = v}
136
+ new
137
+ end
131
138
  end # Hash
132
139
 
133
140
  # Allows access to superclass object
metadata CHANGED
@@ -1,17 +1,10 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ginjo-rfm
3
- version: !ruby/object:Gem::Version
4
- hash: 1923832061
5
- prerelease: 6
6
- segments:
7
- - 2
8
- - 1
9
- - 0
10
- - pre
11
- - 2
12
- version: 2.1.0.pre02
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.1.0
5
+ prerelease:
13
6
  platform: ruby
14
- authors:
7
+ authors:
15
8
  - Geoff Coffey
16
9
  - Mufaddal Khumri
17
10
  - Atsushi Matsuo
@@ -20,179 +13,212 @@ authors:
20
13
  autorequire:
21
14
  bindir: bin
22
15
  cert_chain: []
23
-
24
- date: 2013-02-16 00:00:00 Z
25
- dependencies:
26
- - !ruby/object:Gem::Dependency
27
- prerelease: false
28
- version_requirements: &id001 !ruby/object:Gem::Requirement
16
+ date: 2013-03-06 00:00:00.000000000 Z
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: activesupport
20
+ requirement: !ruby/object:Gem::Requirement
29
21
  none: false
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- hash: 9
34
- segments:
35
- - 2
36
- - 3
37
- - 5
22
+ requirements:
23
+ - - ! '>='
24
+ - !ruby/object:Gem::Version
38
25
  version: 2.3.5
39
- requirement: *id001
40
- name: activesupport
41
26
  type: :runtime
42
- - !ruby/object:Gem::Dependency
43
27
  prerelease: false
44
- version_requirements: &id002 !ruby/object:Gem::Requirement
28
+ version_requirements: !ruby/object:Gem::Requirement
45
29
  none: false
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- hash: 3
50
- segments:
51
- - 0
52
- version: "0"
53
- requirement: *id002
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 2.3.5
34
+ - !ruby/object:Gem::Dependency
54
35
  name: activemodel
36
+ requirement: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
55
42
  type: :development
56
- - !ruby/object:Gem::Dependency
57
43
  prerelease: false
58
- version_requirements: &id003 !ruby/object:Gem::Requirement
44
+ version_requirements: !ruby/object:Gem::Requirement
59
45
  none: false
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- hash: 3
64
- segments:
65
- - 0
66
- version: "0"
67
- requirement: *id003
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ - !ruby/object:Gem::Dependency
68
51
  name: rake
52
+ requirement: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
69
58
  type: :development
70
- - !ruby/object:Gem::Dependency
71
59
  prerelease: false
72
- version_requirements: &id004 !ruby/object:Gem::Requirement
60
+ version_requirements: !ruby/object:Gem::Requirement
73
61
  none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 3
78
- segments:
79
- - 0
80
- version: "0"
81
- requirement: *id004
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ - !ruby/object:Gem::Dependency
82
67
  name: rdoc
68
+ requirement: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
83
74
  type: :development
84
- - !ruby/object:Gem::Dependency
85
75
  prerelease: false
86
- version_requirements: &id005 !ruby/object:Gem::Requirement
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec
84
+ requirement: !ruby/object:Gem::Requirement
87
85
  none: false
88
- requirements:
86
+ requirements:
89
87
  - - ~>
90
- - !ruby/object:Gem::Version
91
- hash: 27
92
- segments:
93
- - 1
94
- - 3
95
- - 0
88
+ - !ruby/object:Gem::Version
96
89
  version: 1.3.0
97
- requirement: *id005
98
- name: rspec
99
90
  type: :development
100
- - !ruby/object:Gem::Dependency
101
91
  prerelease: false
102
- version_requirements: &id006 !ruby/object:Gem::Requirement
92
+ version_requirements: !ruby/object:Gem::Requirement
103
93
  none: false
104
- requirements:
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- hash: 3
108
- segments:
109
- - 0
110
- version: "0"
111
- requirement: *id006
94
+ requirements:
95
+ - - ~>
96
+ - !ruby/object:Gem::Version
97
+ version: 1.3.0
98
+ - !ruby/object:Gem::Dependency
112
99
  name: diff-lcs
100
+ requirement: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
113
106
  type: :development
114
- - !ruby/object:Gem::Dependency
115
107
  prerelease: false
116
- version_requirements: &id007 !ruby/object:Gem::Requirement
108
+ version_requirements: !ruby/object:Gem::Requirement
117
109
  none: false
118
- requirements:
119
- - - ">="
120
- - !ruby/object:Gem::Version
121
- hash: 3
122
- segments:
123
- - 0
124
- version: "0"
125
- requirement: *id007
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ - !ruby/object:Gem::Dependency
126
115
  name: yard
116
+ requirement: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ! '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ - !ruby/object:Gem::Dependency
131
+ name: redcarpet
132
+ requirement: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ! '>='
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
127
138
  type: :development
128
- - !ruby/object:Gem::Dependency
129
139
  prerelease: false
130
- version_requirements: &id008 !ruby/object:Gem::Requirement
140
+ version_requirements: !ruby/object:Gem::Requirement
131
141
  none: false
132
- requirements:
133
- - - ">="
134
- - !ruby/object:Gem::Version
135
- hash: 3
136
- segments:
137
- - 0
138
- version: "0"
139
- requirement: *id008
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ - !ruby/object:Gem::Dependency
140
147
  name: libxml-ruby
148
+ requirement: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
141
154
  type: :development
142
- - !ruby/object:Gem::Dependency
143
155
  prerelease: false
144
- version_requirements: &id009 !ruby/object:Gem::Requirement
156
+ version_requirements: !ruby/object:Gem::Requirement
145
157
  none: false
146
- requirements:
147
- - - ">="
148
- - !ruby/object:Gem::Version
149
- hash: 3
150
- segments:
151
- - 0
152
- version: "0"
153
- requirement: *id009
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ - !ruby/object:Gem::Dependency
154
163
  name: nokogiri
164
+ requirement: !ruby/object:Gem::Requirement
165
+ none: false
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
155
170
  type: :development
156
- - !ruby/object:Gem::Dependency
157
171
  prerelease: false
158
- version_requirements: &id010 !ruby/object:Gem::Requirement
172
+ version_requirements: !ruby/object:Gem::Requirement
159
173
  none: false
160
- requirements:
161
- - - ">="
162
- - !ruby/object:Gem::Version
163
- hash: 3
164
- segments:
165
- - 0
166
- version: "0"
167
- requirement: *id010
174
+ requirements:
175
+ - - ! '>='
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ - !ruby/object:Gem::Dependency
168
179
  name: hpricot
180
+ requirement: !ruby/object:Gem::Requirement
181
+ none: false
182
+ requirements:
183
+ - - ! '>='
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
169
186
  type: :development
170
- - !ruby/object:Gem::Dependency
171
187
  prerelease: false
172
- version_requirements: &id011 !ruby/object:Gem::Requirement
188
+ version_requirements: !ruby/object:Gem::Requirement
173
189
  none: false
174
- requirements:
175
- - - ">="
176
- - !ruby/object:Gem::Version
177
- hash: 3
178
- segments:
179
- - 0
180
- version: "0"
181
- requirement: *id011
190
+ requirements:
191
+ - - ! '>='
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ - !ruby/object:Gem::Dependency
182
195
  name: ox
196
+ requirement: !ruby/object:Gem::Requirement
197
+ none: false
198
+ requirements:
199
+ - - ! '>='
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
183
202
  type: :development
184
- description: Rfm lets your Ruby scripts and Rails applications talk directly to your Filemaker server. Ginjo-rfm includes ActiveModel compatibility, multiple XML parsers, compound Filemaker find requests, and a configuration API.
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ none: false
206
+ requirements:
207
+ - - ! '>='
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ description: Rfm lets your Ruby scripts and Rails applications talk directly to your
211
+ Filemaker server. Ginjo-rfm includes ActiveModel compatibility, multiple XML parsers,
212
+ compound Filemaker find requests, and a configuration API.
185
213
  email: http://groups.google.com/group/rfmcommunity
186
214
  executables: []
187
-
188
215
  extensions: []
189
-
190
- extra_rdoc_files:
216
+ extra_rdoc_files:
191
217
  - LICENSE
192
218
  - README.md
193
219
  - CHANGELOG.md
194
220
  - lib/rfm/VERSION
195
- files:
221
+ files:
196
222
  - lib/rfm/base.rb
197
223
  - lib/rfm/database.rb
198
224
  - lib/rfm/error.rb
@@ -224,41 +250,33 @@ files:
224
250
  - CHANGELOG.md
225
251
  homepage: https://rubygems.org/gems/ginjo-rfm
226
252
  licenses: []
227
-
228
253
  post_install_message:
229
- rdoc_options:
254
+ rdoc_options:
230
255
  - --line-numbers
231
256
  - --main
232
257
  - README.md
233
- require_paths:
258
+ require_paths:
234
259
  - lib
235
- required_ruby_version: !ruby/object:Gem::Requirement
260
+ required_ruby_version: !ruby/object:Gem::Requirement
236
261
  none: false
237
- requirements:
238
- - - ">="
239
- - !ruby/object:Gem::Version
240
- hash: 3
241
- segments:
262
+ requirements:
263
+ - - ! '>='
264
+ - !ruby/object:Gem::Version
265
+ version: '0'
266
+ segments:
242
267
  - 0
243
- version: "0"
244
- required_rubygems_version: !ruby/object:Gem::Requirement
268
+ hash: 1763595399021498150
269
+ required_rubygems_version: !ruby/object:Gem::Requirement
245
270
  none: false
246
- requirements:
247
- - - ">"
248
- - !ruby/object:Gem::Version
249
- hash: 25
250
- segments:
251
- - 1
252
- - 3
253
- - 1
271
+ requirements:
272
+ - - ! '>'
273
+ - !ruby/object:Gem::Version
254
274
  version: 1.3.1
255
275
  requirements: []
256
-
257
276
  rubyforge_project:
258
- rubygems_version: 1.8.10
277
+ rubygems_version: 1.8.25
259
278
  signing_key:
260
279
  specification_version: 3
261
280
  summary: Ruby to Filemaker adapter
262
281
  test_files: []
263
-
264
282
  has_rdoc: