ginjo-rfm 2.0.1 → 2.0.2
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/CHANGELOG.md +14 -6
- data/README.md +29 -6
- data/lib/rfm.rb +1 -0
- data/lib/rfm/VERSION +1 -1
- data/lib/rfm/base.rb +1 -1
- data/lib/rfm/layout.rb +6 -0
- data/lib/rfm/record.rb +6 -1
- data/lib/rfm/resultset.rb +23 -8
- data/lib/rfm/server.rb +2 -1
- data/lib/rfm/utilities/config.rb +1 -0
- data/lib/rfm/utilities/xml_parser.rb +1 -1
- metadata +4 -4
data/CHANGELOG.md
CHANGED
@@ -1,22 +1,30 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## Ginjo-Rfm 2.0.2
|
4
|
+
|
5
|
+
* Added configuration parameter ignore_bad_data to silence data mismatch errors when loading resultset into records.
|
6
|
+
|
7
|
+
* Added method to load a resultset from file or string. Rfm::Resultset.load_data(file_or_string).
|
8
|
+
|
9
|
+
* Added more specs for the above features and for the XmlParser module.
|
10
|
+
|
3
11
|
## Ginjo-Rfm 2.0.1
|
4
12
|
|
5
|
-
* Fixed bug in Base.find where options weren't being passed to Layout#find correctly
|
13
|
+
* Fixed bug in Base.find where options weren't being passed to Layout#find correctly.
|
6
14
|
|
7
15
|
* Fixed bug in rfm.rb when calling #models or #modelize.
|
8
16
|
|
9
17
|
## Ginjo-Rfm 2.0.0
|
10
18
|
|
11
|
-
* ActiveModel compatibility allows Rails ActiveRecord-style models
|
19
|
+
* ActiveModel compatibility allows Rails ActiveRecord-style models.
|
12
20
|
|
13
|
-
* Alternative XML parsers using ActiveSupport::XmlMini interface
|
21
|
+
* Alternative XML parsers using ActiveSupport::XmlMini interface.
|
14
22
|
|
15
|
-
* Compound queries with multiple omitable find-requests
|
23
|
+
* Compound queries with multiple omitable find-requests.
|
16
24
|
|
17
|
-
* Configuration API manages settings of multiple server/db/layout/etc setups
|
25
|
+
* Configuration API manages settings of multiple server/db/layout/etc setups.
|
18
26
|
|
19
|
-
* Full Filemaker metadata support
|
27
|
+
* Full Filemaker metadata support.
|
20
28
|
|
21
29
|
## Ginjo-Rfm 1.4.4
|
22
30
|
|
data/README.md
CHANGED
@@ -372,6 +372,7 @@ Following are all of the recognized configuration options, including defaults if
|
|
372
372
|
:file_name => 'rfm.yml # name of configuration file to load yaml from
|
373
373
|
:file_path => ['', 'config/'] # array of additional file paths to look for configuration file
|
374
374
|
:parser => ActiveSupport::XmlMini_REXML # XmlParser to use if no other is specified or can be found
|
375
|
+
:ignore_bad_data => nil # Instruct Rfm to ignore data mismatch errors when loading a resultset
|
375
376
|
|
376
377
|
|
377
378
|
### Using Models
|
@@ -515,26 +516,31 @@ See the API documentation for the lowdown on new methods in Rfm Server, Database
|
|
515
516
|
|
516
517
|
All Rfm methods that take a configuration hash have two possible shortcuts.
|
517
518
|
|
518
|
-
If you pass a symbol before the hash, it is interpreted as subgroup specification or subgroup filter
|
519
|
+
(1) If you pass a symbol before the hash, it is interpreted as subgroup specification or subgroup filter
|
519
520
|
|
520
521
|
config :mygroup, :layout => 'mylayout'
|
522
|
+
# This will add the following configuration options to the object you called 'config' on.
|
521
523
|
# :use => :mygroup, :layout => 'mylayout'
|
522
524
|
|
523
525
|
get_config :othergroup
|
526
|
+
# This will return global configuration options merged with configuration options from :othergroup.
|
524
527
|
# :use => [:mygroup, :othergroup], :layout => 'mylayout'
|
525
528
|
|
526
|
-
If you pass a string before any symbols or hashes, it is
|
529
|
+
(2) If you pass a string before any symbols or hashes, it is interpreted as one of several possible configuration settings - usually a layout name, a database name, or a server hostname. The interpretation is dependent on the method being called. Not all methods will make use of a string parameter.
|
527
530
|
|
528
531
|
class MyModel < Rfm::Base
|
529
532
|
config 'MyLayoutName'
|
530
|
-
#
|
533
|
+
# In this context, this is the same as
|
534
|
+
# config :layout => 'MyLayoutName'
|
531
535
|
end
|
532
536
|
|
533
537
|
Rfm.database 'MyDatabaseName'
|
534
|
-
#
|
538
|
+
# In this context, this is the same as
|
539
|
+
# Rfm.database :database => 'MyDatabaseName'
|
535
540
|
|
536
541
|
Rfm.modelize 'MyDatabaseName', :group1
|
537
|
-
#
|
542
|
+
# In this context, this is the same as
|
543
|
+
# Rfm.modelize :database => 'MyDatabaseName', :use => :group1
|
538
544
|
|
539
545
|
Just about anything you can do with a Rfm layout, you can also do with a Rfm model.
|
540
546
|
|
@@ -544,11 +550,28 @@ Just about anything you can do with a Rfm layout, you can also do with a Rfm mod
|
|
544
550
|
|
545
551
|
There are a number of methods within Rfm that have been made accessible from the top-level Rfm module. Note that the server/database/layout methods are new to Rfm and are not the same as Rfm::Server, Rfm::Database, and Rfm::Layout. See the above section on "Getting Rfm Server, Database, and Layout Objects Manually" for an overview of how to use the new server/database/layout methods.
|
546
552
|
|
547
|
-
# Any of these methods can be
|
553
|
+
# Any of these methods can be accessed via Rfm.<method_name>
|
548
554
|
|
549
555
|
Rfm::Factory :servers, :server, :db, :database, :layout, :models, :modelize
|
550
556
|
Rfm::XmlParser :backend, :backend=
|
551
557
|
Rfm::Config :config, :get_config, :config_clear
|
558
|
+
Rfm::Resultset :ignore_bad_data
|
559
|
+
|
560
|
+
If you are working with a Filemaker database that returns codes like '?' for a missing value in a date field, Rfm will throw an error. Set your main configuration, your server, or your layout to `ignore_bad_data true`, if you want Rfm to silently ignore data mismatch errors when loading resultset data. If ActiveRecord is loaded, and your resultset is loaded into a Rfm model, your model records will log these errors in the @errors attribute.
|
561
|
+
|
562
|
+
Rfm.config :ignore_bad_data => true
|
563
|
+
|
564
|
+
class MyModel < Rfm::Base
|
565
|
+
config 'my_layout'
|
566
|
+
end
|
567
|
+
|
568
|
+
result = MyModel.find(:name => 'mike')
|
569
|
+
# Assuming the Filemaker field 'some_date_field' contains a bad date value '?'
|
570
|
+
result[0].errors.full_messages
|
571
|
+
# ['some_date_field invalid date']
|
572
|
+
|
573
|
+
# To be more specific about what objects you want to ignore data errors
|
574
|
+
MyModel.layout.ignore_bad_data true
|
552
575
|
|
553
576
|
## Working with "Classic" Rfm Features
|
554
577
|
|
data/lib/rfm.rb
CHANGED
@@ -61,6 +61,7 @@ module Rfm
|
|
61
61
|
def_delegators 'Rfm::Factory', :servers, :server, :db, :database, :layout
|
62
62
|
def_delegators 'Rfm::XmlParser', :backend, :backend=
|
63
63
|
def_delegators 'Rfm::Config', :config, :get_config, :config_clear
|
64
|
+
def_delegators 'Rfm::Resultset', :load_data
|
64
65
|
|
65
66
|
def models(*args)
|
66
67
|
Rfm::Base
|
data/lib/rfm/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.2
|
data/lib/rfm/base.rb
CHANGED
@@ -194,7 +194,7 @@ module Rfm
|
|
194
194
|
|
195
195
|
# Access layout functions from base model
|
196
196
|
def_delegators :layout, :db, :server, :field_controls, :field_names, :value_lists, :total_count,
|
197
|
-
:query, :all, :delete, :portal_meta, :portal_names, :database, :table, :count
|
197
|
+
:query, :all, :delete, :portal_meta, :portal_names, :database, :table, :count, :ignore_bad_data
|
198
198
|
|
199
199
|
def inherited(model)
|
200
200
|
(Rfm::Factory.models << model).uniq unless Rfm::Factory.models.include? model
|
data/lib/rfm/layout.rb
CHANGED
@@ -143,6 +143,7 @@ module Rfm
|
|
143
143
|
@value_lists = Rfm::CaseInsensitiveHash.new
|
144
144
|
# @portal_meta = nil
|
145
145
|
# @field_names = nil
|
146
|
+
@ignore_bad_data = (db_obj.server.state[:ignore_bad_data] rescue nil)
|
146
147
|
end
|
147
148
|
|
148
149
|
meta_attr_reader :db
|
@@ -376,6 +377,11 @@ module Rfm
|
|
376
377
|
@field_controls.freeze
|
377
378
|
end
|
378
379
|
|
380
|
+
def ignore_bad_data(val = nil)
|
381
|
+
(@ignore_bad_data = val) unless val.nil?
|
382
|
+
@ignore_bad_data
|
383
|
+
end
|
384
|
+
|
379
385
|
private :load, :get_records, :params
|
380
386
|
|
381
387
|
|
data/lib/rfm/record.rb
CHANGED
@@ -133,7 +133,12 @@ module Rfm
|
|
133
133
|
data = field['data']; data = data.is_a?(Hash) ? [data] : data
|
134
134
|
data.each do |x|
|
135
135
|
next unless field_meta[field_name]
|
136
|
-
|
136
|
+
begin
|
137
|
+
datum.push(field_meta[field_name].coerce(x['__content__'], resultset_obj))
|
138
|
+
rescue StandardError => error
|
139
|
+
self.errors.add(field_name, error) if self.respond_to? :errors
|
140
|
+
raise error unless @layout.ignore_bad_data
|
141
|
+
end
|
137
142
|
end if data
|
138
143
|
|
139
144
|
if datum.length == 1
|
data/lib/rfm/resultset.rb
CHANGED
@@ -72,22 +72,22 @@ module Rfm
|
|
72
72
|
@portal_meta ||= Rfm::CaseInsensitiveHash.new
|
73
73
|
@include_portals = portals
|
74
74
|
|
75
|
-
doc = XmlParser.new(xml_response, :namespace=>false, :parser=>server.state[:parser])
|
75
|
+
doc = XmlParser.new(xml_response, :namespace=>false, :parser=>(server.state[:parser] rescue nil))
|
76
76
|
|
77
77
|
error = doc['fmresultset']['error']['code'].to_i
|
78
|
-
check_for_errors(error, server.state[:raise_on_401])
|
78
|
+
check_for_errors(error, (server.state[:raise_on_401] rescue nil))
|
79
79
|
|
80
|
-
datasource
|
80
|
+
@datasource = doc['fmresultset']['datasource']
|
81
81
|
meta = doc['fmresultset']['metadata']
|
82
82
|
resultset = doc['fmresultset']['resultset']
|
83
83
|
|
84
|
-
@date_format = convert_date_time_format(datasource['date-format'].to_s)
|
85
|
-
@time_format = convert_date_time_format(datasource['time-format'].to_s)
|
86
|
-
@timestamp_format = convert_date_time_format(datasource['timestamp-format'].to_s)
|
84
|
+
@date_format = convert_date_time_format(@datasource['date-format'].to_s)
|
85
|
+
@time_format = convert_date_time_format(@datasource['time-format'].to_s)
|
86
|
+
@timestamp_format = convert_date_time_format(@datasource['timestamp-format'].to_s)
|
87
87
|
|
88
88
|
@foundset_count = resultset['count'].to_s.to_i
|
89
|
-
@total_count = datasource['total-count'].to_s.to_i
|
90
|
-
@table = datasource['table']
|
89
|
+
@total_count = @datasource['total-count'].to_s.to_i
|
90
|
+
@table = @datasource['table']
|
91
91
|
|
92
92
|
(layout.table = @table) if layout and layout.table_no_load.blank?
|
93
93
|
|
@@ -97,6 +97,17 @@ module Rfm
|
|
97
97
|
# See Record for control of portal data loading.
|
98
98
|
parse_portals(meta)
|
99
99
|
|
100
|
+
# These were added for loading resultset from file
|
101
|
+
unless @layout
|
102
|
+
@layout = @datasource['layout']
|
103
|
+
@layout.instance_variable_set '@database', @datasource['database']
|
104
|
+
@layout.instance_eval do
|
105
|
+
def database
|
106
|
+
@database
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
100
111
|
return if resultset['record'].nil?
|
101
112
|
Rfm::Record.build_records(resultset['record'].rfm_force_array, self, @field_meta, @layout)
|
102
113
|
end
|
@@ -109,6 +120,10 @@ module Rfm
|
|
109
120
|
portal_meta.keys
|
110
121
|
end
|
111
122
|
|
123
|
+
# Load Resultset data from file-spec or string
|
124
|
+
def self.load_data(file_or_string)
|
125
|
+
self.new(nil, file_or_string, nil)
|
126
|
+
end
|
112
127
|
|
113
128
|
private
|
114
129
|
|
data/lib/rfm/server.rb
CHANGED
data/lib/rfm/utilities/config.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ginjo-rfm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 2.0.
|
9
|
+
- 2
|
10
|
+
version: 2.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Geoff Coffey
|
@@ -19,7 +19,7 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2012-04-
|
22
|
+
date: 2012-04-24 00:00:00 Z
|
23
23
|
dependencies:
|
24
24
|
- !ruby/object:Gem::Dependency
|
25
25
|
name: activesupport
|