ginjo-rfm 2.1.0.pre02 → 2.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.
@@ -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: