storable 0.8.7 → 0.8.8
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/CHANGES.txt +9 -1
- data/lib/proc_source.rb +1 -1
- data/lib/storable.rb +56 -32
- data/storable.gemspec +1 -1
- metadata +2 -2
data/CHANGES.txt
CHANGED
@@ -2,7 +2,15 @@ STORABLE, CHANGES
|
|
2
2
|
|
3
3
|
* TODO: https://github.com/delano/storable/pull/2
|
4
4
|
* TODO: Handle nested hashes and arrays.
|
5
|
-
|
5
|
+
|
6
|
+
|
7
|
+
#### 0.8.8 (2011-05-20) #############################
|
8
|
+
|
9
|
+
* ADDED: Storable.field can now take and store Hash options (:default, :meth)
|
10
|
+
|
11
|
+
#### 0.8.7 (2011-??-??) #############################
|
12
|
+
|
13
|
+
* ?
|
6
14
|
|
7
15
|
#### 0.8.6 (2010-12-31) #############################
|
8
16
|
|
data/lib/proc_source.rb
CHANGED
@@ -41,7 +41,7 @@ end
|
|
41
41
|
class RubyToken::Token
|
42
42
|
|
43
43
|
# These EXPR_BEG tokens don't have associated end tags
|
44
|
-
FAKIES = [RubyToken::TkWHEN, RubyToken::TkELSIF, RubyToken::TkTHEN]
|
44
|
+
FAKIES = [RubyToken::TkWHEN, RubyToken::TkELSIF, RubyToken::TkELSE, RubyToken::TkTHEN]
|
45
45
|
|
46
46
|
def name
|
47
47
|
@name ||= nil
|
data/lib/storable.rb
CHANGED
@@ -35,14 +35,14 @@ class Storable
|
|
35
35
|
require 'proc_source'
|
36
36
|
require 'storable/orderedhash' if USE_ORDERED_HASH
|
37
37
|
unless defined?(SUPPORTED_FORMATS) # We can assume all are defined
|
38
|
-
VERSION = "0.8.
|
38
|
+
VERSION = "0.8.8"
|
39
39
|
NICE_TIME_FORMAT = "%Y-%m-%d@%H:%M:%S".freeze
|
40
40
|
SUPPORTED_FORMATS = [:tsv, :csv, :yaml, :json, :s, :string].freeze
|
41
41
|
end
|
42
42
|
|
43
43
|
@debug = false
|
44
44
|
class << self
|
45
|
-
attr_accessor :sensitive_fields, :field_names, :field_types, :debug
|
45
|
+
attr_accessor :sensitive_fields, :field_names, :field_types, :field_opts, :debug
|
46
46
|
end
|
47
47
|
|
48
48
|
# Passes along fields to inherited classes
|
@@ -66,37 +66,61 @@ class Storable
|
|
66
66
|
# data is available by the standard accessors, class.product and class.product= etc...
|
67
67
|
# The value of the field will be cast to the type (if provided) when read from a file.
|
68
68
|
# The value is not touched when the type is not provided.
|
69
|
-
def self.field(args
|
69
|
+
def self.field(*args, &processor)
|
70
70
|
# TODO: Examine casting from: http://codeforpeople.com/lib/ruby/fattr/fattr-1.0.3/
|
71
|
-
|
72
|
-
|
71
|
+
field_definitions = {}
|
72
|
+
if args.first.kind_of?(Hash)
|
73
|
+
args.first.each_pair do |fname,klass|
|
74
|
+
field_definitions[fname] = { :class => klass }
|
75
|
+
end
|
76
|
+
else
|
77
|
+
fname, opts = *args
|
78
|
+
if opts.nil?
|
79
|
+
field_definitions[fname] = {}
|
80
|
+
elsif Hash === opts
|
81
|
+
field_definitions[fname] = opts
|
82
|
+
else
|
83
|
+
raise ArgumentError, "Second argument must be a hash"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
73
87
|
self.field_names ||= []
|
74
88
|
self.field_types ||= {}
|
75
|
-
|
76
|
-
|
77
|
-
self.
|
89
|
+
self.field_opts ||= {}
|
90
|
+
field_definitions.each_pair do |fname,opts|
|
91
|
+
self.field_names << fname
|
92
|
+
self.field_opts[fname] = opts
|
93
|
+
self.field_types[fname] = opts[:class] unless opts[:class].nil?
|
78
94
|
|
79
95
|
# This processor automatically converts a Proc object
|
80
96
|
# to a String of its source.
|
81
|
-
processor = proc_processor if
|
97
|
+
processor = proc_processor if opts[:class] == Proc && processor.nil?
|
82
98
|
|
83
99
|
unless processor.nil?
|
84
|
-
define_method("_storable_processor_#{
|
100
|
+
define_method("_storable_processor_#{fname}", &processor)
|
85
101
|
end
|
86
102
|
|
87
|
-
if method_defined?(
|
88
|
-
STDERR.puts "method exists: #{self}##{
|
103
|
+
if method_defined?(fname) # don't redefine the getter method
|
104
|
+
STDERR.puts "method exists: #{self}##{fname}" if Storable.debug
|
89
105
|
else
|
90
|
-
define_method(
|
91
|
-
instance_variable_get("@#{
|
106
|
+
define_method(fname) do
|
107
|
+
ret = instance_variable_get("@#{fname}") || opts[:default]
|
108
|
+
if ret.nil?
|
109
|
+
if opts[:default]
|
110
|
+
ret = opts[:default]
|
111
|
+
elsif opts[:meth]
|
112
|
+
ret = self.send(opts[:meth])
|
113
|
+
end
|
114
|
+
end
|
115
|
+
ret
|
92
116
|
end
|
93
117
|
end
|
94
118
|
|
95
|
-
if method_defined?("#{
|
96
|
-
STDERR.puts "method exists: #{self}##{
|
119
|
+
if method_defined?("#{fname}=") # don't redefine the setter methods
|
120
|
+
STDERR.puts "method exists: #{self}##{fname}=" if Storable.debug
|
97
121
|
else
|
98
|
-
define_method("#{
|
99
|
-
instance_variable_set("@#{
|
122
|
+
define_method("#{fname}=") do |val|
|
123
|
+
instance_variable_set("@#{fname}",val)
|
100
124
|
end
|
101
125
|
end
|
102
126
|
end
|
@@ -145,15 +169,15 @@ class Storable
|
|
145
169
|
|
146
170
|
# Returns an array of field names defined by self.field
|
147
171
|
def field_names
|
148
|
-
self.class.field_names
|
172
|
+
self.class.field_names #|| self.class.ancestors.first.field_names
|
149
173
|
end
|
150
174
|
# Returns an array of field types defined by self.field. Fields that did
|
151
175
|
# not receive a type are set to nil.
|
152
176
|
def field_types
|
153
|
-
self.class.field_types
|
177
|
+
self.class.field_types #|| self.class.ancestors.first.field_types
|
154
178
|
end
|
155
179
|
def sensitive_fields
|
156
|
-
self.class.sensitive_fields
|
180
|
+
self.class.sensitive_fields #|| self.class.ancestors.first.sensitive_fields
|
157
181
|
end
|
158
182
|
|
159
183
|
# Dump the object data to the given format.
|
@@ -298,14 +322,16 @@ class Storable
|
|
298
322
|
def to_hash
|
299
323
|
preprocess if respond_to? :preprocess
|
300
324
|
tmp = USE_ORDERED_HASH ? Storable::OrderedHash.new : {}
|
301
|
-
field_names
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
325
|
+
if field_names
|
326
|
+
field_names.each do |fname|
|
327
|
+
next if sensitive? && self.class.sensitive_field?(fname)
|
328
|
+
v = self.send(fname)
|
329
|
+
v = process(fname, v) if has_processor?(fname)
|
330
|
+
if Array === v
|
331
|
+
v = v.collect { |v2| v2.kind_of?(Storable) ? v2.to_hash : v2 }
|
332
|
+
end
|
333
|
+
tmp[fname] = v.kind_of?(Storable) ? v.to_hash : v
|
307
334
|
end
|
308
|
-
tmp[fname] = v.kind_of?(Storable) ? v.to_hash : v
|
309
335
|
end
|
310
336
|
tmp
|
311
337
|
end
|
@@ -329,9 +355,6 @@ class Storable
|
|
329
355
|
hash = to_hash
|
330
356
|
if YAJL_LOADED # set by Storable
|
331
357
|
ret = Yajl::Encoder.encode(hash)
|
332
|
-
#raise "DELANO"
|
333
|
-
#ret.force_encoding("ISO-8859-1")
|
334
|
-
#p [:to, ret.encoding.name] if ret.respond_to?(:encoding)
|
335
358
|
ret
|
336
359
|
elsif JSON_LOADED
|
337
360
|
JSON.generate(hash, *from, &blk)
|
@@ -508,7 +531,8 @@ class Storable
|
|
508
531
|
end
|
509
532
|
def proc_processor
|
510
533
|
Proc.new do |val|
|
511
|
-
(Proc === val) ? val.source : val
|
534
|
+
ret = (Proc === val) ? val.source : val
|
535
|
+
ret
|
512
536
|
end
|
513
537
|
end
|
514
538
|
# If the object already has a value for +@id+
|
data/storable.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
@spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "storable"
|
3
3
|
s.rubyforge_project = "storable"
|
4
|
-
s.version = "0.8.
|
4
|
+
s.version = "0.8.8"
|
5
5
|
s.summary = "Storable: Marshal Ruby classes into and out of multiple formats (yaml, json, csv, tsv)"
|
6
6
|
s.description = s.summary
|
7
7
|
s.author = "Delano Mandelbaum"
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: storable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.8.
|
5
|
+
version: 0.8.8
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Delano Mandelbaum
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-05-20 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|