storable 0.7.2 → 0.7.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +8 -0
- data/README.rdoc +28 -1
- data/lib/proc_source.rb +6 -9
- data/lib/storable.rb +49 -5
- data/storable.gemspec +1 -1
- metadata +2 -2
data/CHANGES.txt
CHANGED
@@ -3,6 +3,14 @@ STORABLE, CHANGES
|
|
3
3
|
* TODO: Handle nested hashes and arrays.
|
4
4
|
* TODO: to_xml, see: http://codeforpeople.com/lib/ruby/xx/xx-2.0.0/README
|
5
5
|
|
6
|
+
#### 0.7.3 (2010-04-10) #############################
|
7
|
+
|
8
|
+
* ADDED: Allow anonymous objects via Storable.from_json etc.
|
9
|
+
* ADDED: Enabled support for marshalling Proc objects in IRB sessions.
|
10
|
+
* ADDED: Storable#call for calling Proc fields via instance_eval
|
11
|
+
* ADDED: Support for Range field type (parse from a String when necessary)
|
12
|
+
|
13
|
+
|
6
14
|
#### 0.7.2 (2010-04-06) #############################
|
7
15
|
|
8
16
|
* FIXED: Handle empty symbols like in Storable 0.6.4. Fixes "interning empty string" error. [Diego Elio 'Flameeyes' Pettenò]
|
data/README.rdoc
CHANGED
@@ -26,6 +26,33 @@ Marshal Ruby classes into and out of multiple formats (yaml, json, csv, tsv)
|
|
26
26
|
puts mac2.position.class # => Fixnum
|
27
27
|
|
28
28
|
|
29
|
+
== Storing Procs
|
30
|
+
|
31
|
+
Storable can also marshal Proc objects to and from their actual source code.
|
32
|
+
|
33
|
+
require 'storable'
|
34
|
+
|
35
|
+
class Maths < Storable
|
36
|
+
field :x => Float
|
37
|
+
field :y => Float
|
38
|
+
field :calculate => Proc
|
39
|
+
end
|
40
|
+
|
41
|
+
mat1 = Maths.new 2.0, 3.0
|
42
|
+
mat1.calculate = Proc.new { @x * @y }
|
43
|
+
|
44
|
+
mat1.calculate.source # => "{ @x * @y }"
|
45
|
+
mat1.call :calculate # => 6.0
|
46
|
+
|
47
|
+
dump = mat1.to_json
|
48
|
+
|
49
|
+
mat2 = Maths.from_json dump
|
50
|
+
mat2.call :calculate # => 6.0
|
51
|
+
|
52
|
+
|
53
|
+
Anything is possible when you keep your mind open and you use Ruby.
|
54
|
+
|
55
|
+
|
29
56
|
== Installation
|
30
57
|
|
31
58
|
Via Rubygems, one of:
|
@@ -40,7 +67,7 @@ or via download:
|
|
40
67
|
|
41
68
|
== Prerequisites
|
42
69
|
|
43
|
-
* Ruby 1.8, Ruby 1.9, or JRuby 1.2
|
70
|
+
* Ruby 1.8, Ruby 1.9, or JRuby 1.2+
|
44
71
|
|
45
72
|
|
46
73
|
== Thanks
|
data/lib/proc_source.rb
CHANGED
@@ -48,6 +48,7 @@ module ProcSource
|
|
48
48
|
retried = 0
|
49
49
|
loop do
|
50
50
|
lines = get_lines(filename, start_line)
|
51
|
+
return nil if lines.nil?
|
51
52
|
#p [start_line, lines[0]]
|
52
53
|
if !line_has_open?(lines.join) && start_line >= 0
|
53
54
|
start_line -= 1 and retried +=1 and redo
|
@@ -135,15 +136,11 @@ module ProcSource
|
|
135
136
|
case filename
|
136
137
|
when nil
|
137
138
|
nil
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
##when /^\(eval.+\)$/
|
144
|
-
## EVAL_LINES__[filename][start_line .. -2]
|
145
|
-
# regular file
|
146
|
-
else
|
139
|
+
when "(irb)" # special "(irb)" descriptor?
|
140
|
+
IRB.conf[:MAIN_CONTEXT].io.line(start_line .. -2)
|
141
|
+
when /^\(eval.+\)$/ # special "(eval...)" descriptor?
|
142
|
+
EVAL_LINES__[filename][start_line .. -2]
|
143
|
+
else # regular file
|
147
144
|
# Ruby already parsed this file? (see disclaimer above)
|
148
145
|
if defined?(SCRIPT_LINES__) && SCRIPT_LINES__[filename]
|
149
146
|
SCRIPT_LINES__[filename][(start_line - 1) .. -1]
|
data/lib/storable.rb
CHANGED
@@ -39,7 +39,7 @@ class Storable
|
|
39
39
|
require 'proc_source'
|
40
40
|
require 'storable/orderedhash' if USE_ORDERED_HASH
|
41
41
|
unless defined?(SUPPORTED_FORMATS) # We can assume all are defined
|
42
|
-
VERSION = "0.7.
|
42
|
+
VERSION = "0.7.3"
|
43
43
|
NICE_TIME_FORMAT = "%Y-%m-%d@%H:%M:%S".freeze
|
44
44
|
SUPPORTED_FORMATS = [:tsv, :csv, :yaml, :json, :s, :string].freeze
|
45
45
|
end
|
@@ -100,7 +100,9 @@ class Storable
|
|
100
100
|
next
|
101
101
|
end
|
102
102
|
|
103
|
-
define_method(m) do
|
103
|
+
define_method(m) do
|
104
|
+
instance_variable_get("@#{m}")
|
105
|
+
end
|
104
106
|
define_method("#{m}=") do |val|
|
105
107
|
instance_variable_set("@#{m}",val)
|
106
108
|
end
|
@@ -162,16 +164,28 @@ class Storable
|
|
162
164
|
format ||= @format
|
163
165
|
Storable.write_file(file_path, dump(format, with_titles))
|
164
166
|
end
|
165
|
-
|
167
|
+
|
166
168
|
# Create a new instance of the object from a hash.
|
167
169
|
def self.from_hash(from={})
|
168
170
|
return nil if !from || from.empty?
|
169
|
-
|
170
|
-
|
171
|
+
if self == Storable
|
172
|
+
Storable::Anonymous.new from
|
173
|
+
else
|
174
|
+
new.from_hash(from)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def call(fname)
|
179
|
+
unless field_types[fname.to_sym] == Proc &&
|
180
|
+
Proc === self.send(fname)
|
181
|
+
raise "Field #{fname} is not a Proc"
|
182
|
+
end
|
183
|
+
self.instance_eval &self.send(fname)
|
171
184
|
end
|
172
185
|
|
173
186
|
def from_hash(from={})
|
174
187
|
fnames = field_names
|
188
|
+
return from if fnames.nil? || fnames.empty?
|
175
189
|
fnames.each_with_index do |fname,index|
|
176
190
|
ftype = field_types[fname]
|
177
191
|
value_orig = from[fname] || from[fname.to_s]
|
@@ -197,6 +211,23 @@ class Storable
|
|
197
211
|
value = value_orig.to_i
|
198
212
|
elsif ftype == Symbol
|
199
213
|
value = value_orig.to_s.to_sym
|
214
|
+
elsif ftype == Range
|
215
|
+
if Range === value_orig
|
216
|
+
value = value_orig
|
217
|
+
elsif Numeric === value_orig
|
218
|
+
value = value_orig..value_orig
|
219
|
+
else
|
220
|
+
value_orig = value_orig.to_s
|
221
|
+
if value_orig.match(/\.\.\./)
|
222
|
+
el = value_orig.split('...')
|
223
|
+
value = el.first.to_f...el.last.to_f
|
224
|
+
elsif value_orig.match(/\.\./)
|
225
|
+
el = value_orig.split('..')
|
226
|
+
value = el.first.to_f..el.last.to_f
|
227
|
+
else
|
228
|
+
value = value_orig..value_orig
|
229
|
+
end
|
230
|
+
end
|
200
231
|
elsif ftype == Proc && String === value_orig
|
201
232
|
value = Proc.from_string value_orig
|
202
233
|
end
|
@@ -374,6 +405,19 @@ class Storable
|
|
374
405
|
end
|
375
406
|
File.chmod(0600, path)
|
376
407
|
end
|
408
|
+
|
409
|
+
class Anonymous
|
410
|
+
def initialize from
|
411
|
+
@hash = from
|
412
|
+
end
|
413
|
+
def [](key)
|
414
|
+
@hash[meth.to_sym]
|
415
|
+
end
|
416
|
+
def method_missing(meth,*args)
|
417
|
+
@hash[meth.to_sym]
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
377
421
|
end
|
378
422
|
|
379
423
|
|
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.7.
|
4
|
+
s.version = "0.7.3"
|
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
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: storable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delano Mandelbaum
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-04-
|
12
|
+
date: 2010-04-11 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|