rgovdata 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/.document +5 -0
- data/.rvmrc +2 -0
- data/CHANGELOG +7 -0
- data/Gemfile +18 -0
- data/Gemfile.lock +48 -0
- data/LICENSE +20 -0
- data/README.rdoc +114 -0
- data/Rakefile +61 -0
- data/bin/rgd +12 -0
- data/examples/all_quakes.rb +8 -0
- data/examples/arbitrary_data.rb +26 -0
- data/examples/catalog_traversal.rb +34 -0
- data/examples/earthquakes.rb +5 -0
- data/lib/rgovdata.rb +4 -0
- data/lib/rgovdata/catalog.rb +4 -0
- data/lib/rgovdata/catalog/catalog.rb +79 -0
- data/lib/rgovdata/catalog/dn.rb +63 -0
- data/lib/rgovdata/catalog/registry_strategy/internal_registry.rb +12 -0
- data/lib/rgovdata/catalog/registry_strategy/registry_strategy.rb +26 -0
- data/lib/rgovdata/config.rb +5 -0
- data/lib/rgovdata/config/common_config.rb +13 -0
- data/lib/rgovdata/config/config.rb +133 -0
- data/lib/rgovdata/data/config_template.yml +19 -0
- data/lib/rgovdata/data/sg/registry.yml +147 -0
- data/lib/rgovdata/data/template.rb +27 -0
- data/lib/rgovdata/data/us/registry.yml +12 -0
- data/lib/rgovdata/service.rb +10 -0
- data/lib/rgovdata/service/csv_service.rb +3 -0
- data/lib/rgovdata/service/dataset/csv_dataset.rb +43 -0
- data/lib/rgovdata/service/dataset/dataset.rb +91 -0
- data/lib/rgovdata/service/dataset/file_dataset.rb +46 -0
- data/lib/rgovdata/service/dataset/odata_dataset.rb +31 -0
- data/lib/rgovdata/service/file_service.rb +10 -0
- data/lib/rgovdata/service/listing.rb +47 -0
- data/lib/rgovdata/service/odata_service.rb +50 -0
- data/lib/rgovdata/service/service.rb +93 -0
- data/lib/rgovdata/shell/shell.rb +157 -0
- data/lib/rgovdata/version.rb +9 -0
- data/rgovdata.gemspec +128 -0
- data/spec/fixtures/sample.csv +821 -0
- data/spec/integration/service/sg/nlb_spec.rb +57 -0
- data/spec/integration/service/sg/places_spec.rb +73 -0
- data/spec/integration/service/us/eqs7day-M1_spec.rb +57 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/support/config_examples.rb +8 -0
- data/spec/support/mocks.rb +22 -0
- data/spec/support/utility.rb +18 -0
- data/spec/unit/catalog/base_spec.rb +93 -0
- data/spec/unit/catalog/registry_strategy_spec.rb +28 -0
- data/spec/unit/config/config_spec.rb +130 -0
- data/spec/unit/data/template_spec.rb +32 -0
- data/spec/unit/service/dataset/csv_dataset_spec.rb +42 -0
- data/spec/unit/service/dataset/dataset_spec.rb +37 -0
- data/spec/unit/service/dataset/file_dataset_spec.rb +40 -0
- data/spec/unit/service/dataset/odata_dataset_spec.rb +36 -0
- data/spec/unit/service/file_service_spec.rb +25 -0
- data/spec/unit/service/listing_spec.rb +100 -0
- data/spec/unit/service/odata_service_spec.rb +42 -0
- data/spec/unit/service/service_spec.rb +82 -0
- data/spec/unit/shell/shell_spec.rb +10 -0
- metadata +228 -0
@@ -0,0 +1,63 @@
|
|
1
|
+
# This module defines the basic naming interface for catalog objects
|
2
|
+
# Override these methods as required
|
3
|
+
module RGovData::Dn
|
4
|
+
|
5
|
+
# Returns the human-readable unique id
|
6
|
+
def id
|
7
|
+
nameparts = []
|
8
|
+
if defined? realm
|
9
|
+
nameparts.push('/')
|
10
|
+
nameparts.push(realm)
|
11
|
+
end
|
12
|
+
nameparts.push(service_key) if defined?(service_key) && service_key.present?
|
13
|
+
nameparts.push(dataset_key) if defined?(dataset_key) && dataset_key.present?
|
14
|
+
nameparts.join('/')
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns a rails-compatible ID
|
18
|
+
def to_param
|
19
|
+
id.gsub('/',':')
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns the human version of the object name/identification
|
23
|
+
def to_s
|
24
|
+
"#{id} [#{self.class.name}]"
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns array of attributes that describe the specific entity
|
28
|
+
# By default, guesses based on instance variables
|
29
|
+
def meta_attributes
|
30
|
+
a = [:id]
|
31
|
+
instance_variables.each do |v|
|
32
|
+
n = v.to_s.gsub('@','').to_sym
|
33
|
+
a << n if self.respond_to?(n)
|
34
|
+
end
|
35
|
+
a
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns a hash that fully describes this service and can be used as a parameter to +new+
|
39
|
+
# By default, returns a hash based on meta_attributes
|
40
|
+
def initialization_hash
|
41
|
+
h = {}
|
42
|
+
meta_attributes.each do |attribute|
|
43
|
+
h.merge!(attribute => self.send(attribute))
|
44
|
+
end
|
45
|
+
h
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns array of attributes that describe the records of the specific entity
|
49
|
+
# By default, it is nil (meaning indeterminate)
|
50
|
+
def attributes
|
51
|
+
@attributes
|
52
|
+
end
|
53
|
+
|
54
|
+
# Generic interface to return the currently applicable record set
|
55
|
+
def records
|
56
|
+
if defined? datasets
|
57
|
+
datasets
|
58
|
+
else
|
59
|
+
[]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class RGovData::InternalRegistry < RGovData::RegistryStrategy
|
2
|
+
|
3
|
+
# Returns the list of services for the realm
|
4
|
+
# based on internal yml file
|
5
|
+
def load_services
|
6
|
+
service_array = []
|
7
|
+
registry = RGovData::Template.get('registry.yml',realm)
|
8
|
+
YAML::load_documents( registry ) { |doc| service_array << doc }
|
9
|
+
service_array
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class RGovData::RegistryStrategy
|
2
|
+
attr_accessor :realm
|
3
|
+
|
4
|
+
class << self
|
5
|
+
# Returns the appropriate RegistryStrategy for the given realm
|
6
|
+
# +realm+ is the required realm
|
7
|
+
def instance_for_realm(realm)
|
8
|
+
# TODO: this is where we can abstract different registry schemes
|
9
|
+
# e.g by default we will look for a class called Rgovdata::<realm>Registry (Rgovdata::ZhRegistry)
|
10
|
+
# else we take the default strategy
|
11
|
+
# Currently this just defaults to internal registry:
|
12
|
+
RGovData::InternalRegistry.new(realm)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# +new+ accepts realm parameter
|
17
|
+
def initialize(default_realm=nil)
|
18
|
+
@realm = default_realm
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns the list of services for the realm
|
22
|
+
def load_services
|
23
|
+
[]
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# This module is used to include basic support to access
|
2
|
+
# the shared RGovData::Config instance
|
3
|
+
module RGovData::CommonConfig
|
4
|
+
# Returns the current config instance
|
5
|
+
def config
|
6
|
+
RGovData::Config.instance
|
7
|
+
end
|
8
|
+
# Sets the requirement to have a config file
|
9
|
+
# Must be called before config is invoked
|
10
|
+
def require_config_file
|
11
|
+
RGovData::Config.require_config_file
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'singleton'
|
3
|
+
|
4
|
+
class RGovData::Config
|
5
|
+
include Singleton
|
6
|
+
BASE_NAME = 'rgovdata.conf'
|
7
|
+
|
8
|
+
class ConfigError < StandardError
|
9
|
+
end
|
10
|
+
class ConfigurationFileNotFound < ConfigError
|
11
|
+
end
|
12
|
+
class ConfigurationFileInitialized < ConfigError
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_accessor :default_realm, :credentialsets
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
load_default_config
|
19
|
+
end
|
20
|
+
|
21
|
+
# Reloads configuraiton from default config provider
|
22
|
+
# - rails config file (if used in Rails)
|
23
|
+
# - current directory
|
24
|
+
# - environment settings
|
25
|
+
def load_default_config
|
26
|
+
clear
|
27
|
+
# load default config
|
28
|
+
if rails_root
|
29
|
+
# if rails env, load from Rails.root.join('config',BASE_NAME)
|
30
|
+
load_config(rails_root.join('config',BASE_NAME),self.class.default_loader_options)
|
31
|
+
elsif
|
32
|
+
# else load from pwd
|
33
|
+
load_config(self.class.default_config_file,self.class.default_loader_options)
|
34
|
+
else
|
35
|
+
# else just refresh_from_env
|
36
|
+
refresh_from_env
|
37
|
+
end
|
38
|
+
end
|
39
|
+
# Returns the rails root, if the Rails environment is available
|
40
|
+
def rails_root
|
41
|
+
Rails.root if defined?(Rails)
|
42
|
+
end
|
43
|
+
protected :rails_root
|
44
|
+
|
45
|
+
def load_config(configfilepath, options = {})
|
46
|
+
options.reverse_merge!(:generate_default => true,:required => true)
|
47
|
+
unless File.exists?(configfilepath)
|
48
|
+
self.class.reset_configfile(configfilepath) if options[:generate_default]
|
49
|
+
if File.exists?(configfilepath)
|
50
|
+
raise ConfigurationFileInitialized.new("\n
|
51
|
+
No configuration file found.
|
52
|
+
A new file has been initialized at: #{configfilepath}
|
53
|
+
Please review the configuration and retry..\n\n\n")
|
54
|
+
elsif options[:required]
|
55
|
+
raise ConfigurationFileNotFound.new("cannot load config file #{configfilepath}")
|
56
|
+
else
|
57
|
+
return
|
58
|
+
end
|
59
|
+
end
|
60
|
+
update_settings(OpenStruct.new(YAML::load(File.read(configfilepath))))
|
61
|
+
end
|
62
|
+
|
63
|
+
# Updates attributes from config, including env override
|
64
|
+
# +config+ OpenStruct structure
|
65
|
+
def update_settings(config)
|
66
|
+
@credentialsets.merge!(config.credentialsets||{})
|
67
|
+
@default_realm = config.default_realm.to_sym if config.default_realm
|
68
|
+
refresh_from_env
|
69
|
+
end
|
70
|
+
protected :update_settings
|
71
|
+
|
72
|
+
# Clears the current configuration
|
73
|
+
def clear
|
74
|
+
@credentialsets = {}
|
75
|
+
@default_realm = nil
|
76
|
+
end
|
77
|
+
|
78
|
+
# Prints current status
|
79
|
+
def show_status
|
80
|
+
if credentialsets
|
81
|
+
puts "credential sets available: #{credentialsets.keys.join(',')}"
|
82
|
+
puts credentialsets.inspect
|
83
|
+
else
|
84
|
+
puts "credential sets available: none"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Sets environment overrides for supported settings
|
89
|
+
def refresh_from_env
|
90
|
+
if ENV['projectnimbus_account_key'] || ENV['projectnimbus_unique_user_id']
|
91
|
+
@credentialsets['projectnimbus'] ||= {}
|
92
|
+
@credentialsets['projectnimbus'].merge!({'AccountKey'=> ENV['projectnimbus_account_key']}) if ENV['projectnimbus_account_key']
|
93
|
+
@credentialsets['projectnimbus'].merge!({'UniqueUserID'=> ENV['projectnimbus_unique_user_id']}) if ENV['projectnimbus_unique_user_id']
|
94
|
+
end
|
95
|
+
if ENV['rgovdata_username'] || ENV['rgovdata_password']
|
96
|
+
@credentialsets['basic'] ||= {}
|
97
|
+
@credentialsets['basic'].merge!({'username'=> ENV['rgovdata_username']}) if ENV['rgovdata_username']
|
98
|
+
@credentialsets['basic'].merge!({'password'=> ENV['rgovdata_password']}) if ENV['rgovdata_password']
|
99
|
+
end
|
100
|
+
end
|
101
|
+
protected :refresh_from_env
|
102
|
+
|
103
|
+
class << self
|
104
|
+
def reset_configfile(configfilepath)
|
105
|
+
file = File.new(configfilepath,'w')
|
106
|
+
template.each_line do | line|
|
107
|
+
file.puts line
|
108
|
+
end
|
109
|
+
file.close
|
110
|
+
end
|
111
|
+
|
112
|
+
def default_config_file(override = nil)
|
113
|
+
File.expand_path(override || BASE_NAME)
|
114
|
+
end
|
115
|
+
|
116
|
+
def template
|
117
|
+
RGovData::Template.get('config_template.yml')
|
118
|
+
end
|
119
|
+
|
120
|
+
def template_path
|
121
|
+
RGovData::Template.path('config_template.yml')
|
122
|
+
end
|
123
|
+
|
124
|
+
def default_loader_options
|
125
|
+
@@default_loader_options ||= {:generate_default => false,:required => false}
|
126
|
+
end
|
127
|
+
|
128
|
+
def require_config_file
|
129
|
+
@@default_loader_options = {:generate_default => true,:required => true}
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
# Defines the default realm (country)
|
3
|
+
default_realm: sg
|
4
|
+
|
5
|
+
# Define the various credential sets that may be required
|
6
|
+
credentialsets:
|
7
|
+
# Basic authentication credentials
|
8
|
+
basic:
|
9
|
+
# ENV['rgovdata_username'] will override username if present
|
10
|
+
username: "_insert_your_username_here_"
|
11
|
+
# ENV['rgovdata_password'] will override password if present
|
12
|
+
password: "your_password"
|
13
|
+
# OData credentials for http://projectnimbus.org - APIs for Singapore Government Data
|
14
|
+
projectnimbus:
|
15
|
+
# ENV['projectnimbus_account_key'] will override AccountKey if present
|
16
|
+
AccountKey: "_insert_your_key_here_"
|
17
|
+
# ENV['projectnimbus_unique_user_id'] will override UniqueUserID if present
|
18
|
+
UniqueUserID: "00000000000000000000000000000001"
|
19
|
+
|
@@ -0,0 +1,147 @@
|
|
1
|
+
--- !ruby/object:RGovData::ServiceListing
|
2
|
+
realm: :sg
|
3
|
+
key: chlkboard
|
4
|
+
name: Chlkboard
|
5
|
+
description: Information and promotion of local businesses
|
6
|
+
keywords: "F&B, retail"
|
7
|
+
publisher: Chlkboard
|
8
|
+
info_uri: http://projectnimbus.org/2010/07/17/datasets-chlkboard/
|
9
|
+
license:
|
10
|
+
uri: https://api.projectnimbus.org/chlkboardodataservice.svc
|
11
|
+
type: :odata
|
12
|
+
credentialset: projectnimbus
|
13
|
+
--- !ruby/object:RGovData::ServiceListing
|
14
|
+
realm: :sg
|
15
|
+
key: co
|
16
|
+
name: Cinema Online
|
17
|
+
description: Movie times and locations in Singapore
|
18
|
+
keywords: movie, cinema
|
19
|
+
publisher: Cinema Online
|
20
|
+
info_uri: http://projectnimbus.org/2010/04/12/datasets-cinema-online-co/
|
21
|
+
license:
|
22
|
+
uri: https://api.projectnimbus.org/coodataservice.svc
|
23
|
+
type: :odata
|
24
|
+
credentialset: projectnimbus
|
25
|
+
--- !ruby/object:RGovData::ServiceListing
|
26
|
+
realm: :sg
|
27
|
+
key: hgw
|
28
|
+
name: HungryGoWhere
|
29
|
+
description: Best food, restaurants, bars, and pubs in Singapore, Kuala Lumpur and Hong Kong
|
30
|
+
keywords: food, makan
|
31
|
+
publisher: HungryGoWhere
|
32
|
+
info_uri: http://projectnimbus.org/2010/04/11/datasets-hungrygowhere-hgw/
|
33
|
+
license:
|
34
|
+
uri: https://api.projectnimbus.org/hgwodataservice.svc
|
35
|
+
type: :odata
|
36
|
+
credentialset: projectnimbus
|
37
|
+
--- !ruby/object:RGovData::ServiceListing
|
38
|
+
realm: :sg
|
39
|
+
key: lta
|
40
|
+
name: Traffic and Road Conditions
|
41
|
+
description: Traffic and Road Conditions in Singapore
|
42
|
+
keywords: road, traffic, incidents, parking
|
43
|
+
publisher: Singapore Land Transport Authority
|
44
|
+
info_uri: http://projectnimbus.org/2010/04/05/datasets-singapore-land-transport-authority-lta/
|
45
|
+
license:
|
46
|
+
uri: https://api.projectnimbus.org/ltaodataservice.svc
|
47
|
+
type: :odata
|
48
|
+
credentialset: projectnimbus
|
49
|
+
--- !ruby/object:RGovData::ServiceListing
|
50
|
+
realm: :sg
|
51
|
+
key: nea
|
52
|
+
name: Meteorological services
|
53
|
+
description: Meteorological services in Singapore
|
54
|
+
keywords: weather
|
55
|
+
publisher: Singapore National Environment Agency
|
56
|
+
info_uri: http://projectnimbus.org/2010/04/11/datasets-singapore-national-environment-agency-nea/
|
57
|
+
license:
|
58
|
+
uri: https://api.projectnimbus.org/neaodataservice.svc
|
59
|
+
type: :odata
|
60
|
+
credentialset: projectnimbus
|
61
|
+
--- !ruby/object:RGovData::ServiceListing
|
62
|
+
realm: :sg
|
63
|
+
key: nlb
|
64
|
+
name: Libraries
|
65
|
+
description: Information about the Public Libraries in Singapore and their collections
|
66
|
+
keywords: library, book
|
67
|
+
publisher: National Library Board Singapore (NLB)
|
68
|
+
info_uri: http://projectnimbus.org/2010/04/11/datasets-national-library-board-nlb/
|
69
|
+
license:
|
70
|
+
uri: https://api.projectnimbus.org/nlbodataservice.svc
|
71
|
+
type: :odata
|
72
|
+
credentialset: projectnimbus
|
73
|
+
--- !ruby/object:RGovData::ServiceListing
|
74
|
+
realm: :sg
|
75
|
+
key: snb
|
76
|
+
name: ShowNearBy
|
77
|
+
description: locations of persons, points-of-interest, and activities
|
78
|
+
keywords: location, bus stop, ATM, clinic, shops, AED
|
79
|
+
publisher: ShowNearBy
|
80
|
+
info_uri: http://projectnimbus.org/2010/04/12/datasets-shownearby-snb/
|
81
|
+
license:
|
82
|
+
uri: https://api.projectnimbus.org/snbodataservice.svc
|
83
|
+
type: :odata
|
84
|
+
credentialset: projectnimbus
|
85
|
+
--- !ruby/object:RGovData::ServiceListing
|
86
|
+
realm: :sg
|
87
|
+
key: stb
|
88
|
+
name: Events and Places
|
89
|
+
description: Tourism related events and places
|
90
|
+
keywords: event, hotel, places of interest
|
91
|
+
publisher: Singapore Tourism Board
|
92
|
+
info_uri: http://projectnimbus.org/2010/04/12/datasets-singapore-tourism-board-stb/
|
93
|
+
license:
|
94
|
+
uri: https://api.projectnimbus.org/stbodataservice.svc
|
95
|
+
type: :odata
|
96
|
+
credentialset: projectnimbus
|
97
|
+
--- !ruby/object:RGovData::ServiceListing
|
98
|
+
realm: :sg
|
99
|
+
key: sp
|
100
|
+
name: Singapore Post
|
101
|
+
description: Post Office and SAM locations
|
102
|
+
keywords: post, location
|
103
|
+
publisher: Singapore Post
|
104
|
+
info_uri: http://projectnimbus.org/2010/04/12/datasets-singapore-post-sp/
|
105
|
+
license:
|
106
|
+
uri: https://api.projectnimbus.org/spodataservice.svc
|
107
|
+
type: :odata
|
108
|
+
credentialset: projectnimbus
|
109
|
+
--- !ruby/object:RGovData::ServiceListing
|
110
|
+
realm: :sg
|
111
|
+
key: usr
|
112
|
+
name: User Contributed Content
|
113
|
+
description: User Contributed Datasets is part of the community driven efforts to provide interesting datasets
|
114
|
+
keywords: location
|
115
|
+
publisher: ProjectNimbus
|
116
|
+
info_uri: http://projectnimbus.org/2010/10/04/datasets-user-contributed-content-usr/
|
117
|
+
license:
|
118
|
+
uri: https://api.projectnimbus.org/usrodataservice.svc
|
119
|
+
type: :odata
|
120
|
+
credentialset: projectnimbus
|
121
|
+
# --- !ruby/object:RGovData::ServiceListing
|
122
|
+
## Places currently excluded wince the metadata doesn't fully describe the mandatory parameters required
|
123
|
+
## for the Detail and Search collections. Leaving places out of the registry until this is sorted.
|
124
|
+
# realm: :sg
|
125
|
+
# key: places
|
126
|
+
# name: Places
|
127
|
+
# description: Places.sg aggregates the flow of your information to multiple web and mobile sites, so that when you upload your information and/or promotions in one place, it gets quickly syndicated to many digital properties
|
128
|
+
# keywords: location
|
129
|
+
# publisher: Places.sg
|
130
|
+
# info_uri: http://projectnimbus.org/2010/10/18/datasets-places-sg/
|
131
|
+
# license:
|
132
|
+
# uri: https://api.projectnimbus.org/placesodataservice.svc
|
133
|
+
# type: :odata
|
134
|
+
# credentialset: projectnimbus
|
135
|
+
--- !ruby/object:RGovData::ServiceListing
|
136
|
+
realm: :sg
|
137
|
+
key: caas_air_cargo_discharged
|
138
|
+
name: Air Cargo Discharged
|
139
|
+
description: Air Cargo Discharged - Total by Region and Selected Country of Origin
|
140
|
+
keywords: Transportation and Storage
|
141
|
+
publisher: Civil Aviation Authority of Singapore
|
142
|
+
info_uri:
|
143
|
+
license:
|
144
|
+
uri: http://data.gov.sg/common/download.aspx?id=13008&rid=1805010000000004396B&filetype=csv
|
145
|
+
type: :file
|
146
|
+
|
147
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
# This is a convenience class for accessing disk-based template files
|
4
|
+
# It avoids pathname processing from being required where template are used
|
5
|
+
class RGovData::Template
|
6
|
+
|
7
|
+
class << self
|
8
|
+
# Returns the template file path
|
9
|
+
# +name+ is the filename
|
10
|
+
# +realm+ if specified is the subdirectory
|
11
|
+
def path(name, realm = nil)
|
12
|
+
extra_path = [realm,name].compact.map(&:to_s)
|
13
|
+
Pathname.new(File.dirname(__FILE__)).join(*extra_path).to_s
|
14
|
+
rescue
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns the template file content
|
19
|
+
# +name+ is the filename
|
20
|
+
# +realm+ if specified is the subdirectory
|
21
|
+
def get(name, realm = nil)
|
22
|
+
IO.read(path(name, realm))
|
23
|
+
rescue
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|