eatenbyagrue-entity_storage 1.0.2 → 1.0.4
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/History.txt +6 -0
- data/README.rdoc +11 -5
- data/config/database.yml +2 -2
- data/lib/entity_storage.rb +13 -13
- data/test/test_entity_storage.rb +50 -33
- metadata +4 -4
data/History.txt
CHANGED
data/README.rdoc
CHANGED
@@ -4,16 +4,17 @@ http://github.com/eatenbyagrue/entity_storage
|
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
|
-
An easy to use
|
7
|
+
An easy to use Key/Value store for any Ruby on Rails project. Like Memcache, only persistent. Stores config values & application wide state in the database in order to survive server restarts.
|
8
8
|
|
9
|
-
|
9
|
+
Designed to allow you to add persistent value storage to any Rails project in about 5 minutes.
|
10
|
+
|
11
|
+
Additionally, allows users to set a list of default keys that auto-initializes baseline key/value pairs in the database for easy initialization.
|
10
12
|
|
11
13
|
== SYNOPSIS:
|
12
14
|
|
13
15
|
You can use the entity store like so:
|
14
16
|
|
15
|
-
# Get key value.
|
16
|
-
# If not in default list, will return nil.
|
17
|
+
# Get key value.
|
17
18
|
e = EntityStore["testkey"]
|
18
19
|
e = EntityStore.testkey
|
19
20
|
e = EntityStore[:testkey]
|
@@ -25,6 +26,9 @@ You can use the entity store like so:
|
|
25
26
|
|
26
27
|
# find out it's default, even if it's been changed
|
27
28
|
e = EntityStore.default(:testkey)
|
29
|
+
|
30
|
+
# or
|
31
|
+
e = EntityStore.defaults[:testkey]
|
28
32
|
|
29
33
|
# set it back to default
|
30
34
|
EntityStore.default!(:testkey)
|
@@ -32,7 +36,9 @@ You can use the entity store like so:
|
|
32
36
|
# delete an item
|
33
37
|
EntityStore.delete(key)
|
34
38
|
|
35
|
-
All EntityStorage operations sync immediately with the database, so a server shutdown will not impact stored values.
|
39
|
+
All EntityStorage operations sync immediately with the database, so a server shutdown will not impact stored values.
|
40
|
+
|
41
|
+
If you access a key that doesn't exist, and is specified in default list, will be initialized and returned. If not in default list, will return nil.
|
36
42
|
|
37
43
|
Keys can be up to 512 characters in length. Values can be practically any size, and consist of any object. Objects are marshalled back and forth between database.
|
38
44
|
|
data/config/database.yml
CHANGED
data/lib/entity_storage.rb
CHANGED
@@ -5,7 +5,7 @@ require 'rubygems'
|
|
5
5
|
require 'activerecord'
|
6
6
|
|
7
7
|
module EntityStorage
|
8
|
-
VERSION = '1.0.
|
8
|
+
VERSION = '1.0.4'
|
9
9
|
|
10
10
|
class Storage
|
11
11
|
attr_accessor :defaults
|
@@ -21,7 +21,7 @@ module EntityStorage
|
|
21
21
|
|
22
22
|
# Read a value.
|
23
23
|
def [](index)
|
24
|
-
Entity.get_value(index
|
24
|
+
Entity.get_value(index,@defaults[index.to_s])
|
25
25
|
end
|
26
26
|
|
27
27
|
# Write a value.
|
@@ -37,23 +37,23 @@ module EntityStorage
|
|
37
37
|
# Returns the default value of a key contained in DEFAULT_KEYS global constant.
|
38
38
|
# Does not change the stored value. Use default! to reset the value.
|
39
39
|
def default(index)
|
40
|
-
|
40
|
+
@defaults[index.to_s]
|
41
41
|
end
|
42
42
|
|
43
43
|
# Resets the default value of a key contained in DEFAULT_KEYS global constant and returns the value.
|
44
44
|
def default!(index)
|
45
|
-
Entity.reset_value(index
|
45
|
+
Entity.reset_value(index,@defaults[index.to_s])
|
46
46
|
end
|
47
47
|
|
48
48
|
# Allows EntityStorage[:whatever] to be accessed via EntityStorage.whatever.
|
49
49
|
def method_missing(*args)
|
50
50
|
if args.length == 1
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
51
|
+
self[args[0]]
|
52
|
+
elsif args.length == 2 and args[0].to_s =~ /^(.*)=$/
|
53
|
+
self[$1.intern] = args[1]
|
54
|
+
else
|
55
|
+
super
|
56
|
+
end
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -88,8 +88,8 @@ module EntityStorage
|
|
88
88
|
# If not found, will initialize according to defaults set in DEFAULT_KEYS global constant.
|
89
89
|
def self.get_value(search_key,default_value)
|
90
90
|
e = Entity.find_by_key(search_key.to_s)
|
91
|
-
if e.nil?
|
92
|
-
|
91
|
+
if e.nil? || e.value.nil?
|
92
|
+
e = initialize_value(search_key,default_value)
|
93
93
|
end
|
94
94
|
e.value rescue nil
|
95
95
|
end
|
@@ -98,7 +98,7 @@ module EntityStorage
|
|
98
98
|
def self.set_value(search_key, new_value)
|
99
99
|
e = Entity.find_by_key(search_key.to_s)
|
100
100
|
if e.nil?
|
101
|
-
|
101
|
+
e = new
|
102
102
|
end
|
103
103
|
e.key = search_key
|
104
104
|
e.value = new_value
|
data/test/test_entity_storage.rb
CHANGED
@@ -1,89 +1,106 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
ActiveRecord::Base.establish_connection(YAML::load(File.read(File.dirname(__FILE__) + '/../config/database.yml')))
|
2
3
|
|
3
4
|
class TestEntityStorage < Test::Unit::TestCase
|
4
|
-
DEFAULT_KEYS = { "test" => DateTime.parse("1-1-900"), "also test" => 2, "long ass key that I probably wouldn't use" => false
|
5
|
-
|
5
|
+
DEFAULT_KEYS = { "test" => DateTime.parse("1-1-900"), "also test" => 2, "long ass key that I probably wouldn't use" => false,
|
6
|
+
# last time the hiring manager notifications have been run
|
7
|
+
"new_applicant_last_run" => DateTime.parse("1-1-1900"),
|
8
|
+
# last time the new job notifications have been run
|
9
|
+
"new_jobs_last_run" => DateTime.parse("1-1-1900"),
|
10
|
+
"email_test_address" => "joshuas@bnj.com" }
|
6
11
|
|
12
|
+
attr_accessor :EntityStore
|
13
|
+
EntityStore = EntityStorage::Storage.new(DEFAULT_KEYS)
|
14
|
+
|
7
15
|
def setup
|
8
|
-
ActiveRecord::Base.
|
9
|
-
|
16
|
+
ActiveRecord::Base.connection.execute("delete from entity_storage")
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_instantiation
|
20
|
+
# test nasty weird bug with underscore characters
|
21
|
+
entityStore2 = EntityStorage::Storage.new(DEFAULT_KEYS)
|
22
|
+
assert_equal entityStore2.email_test_address, 'joshuas@bnj.com'
|
10
23
|
end
|
11
24
|
|
12
25
|
# tests value setting and getting functionality, along with default creation
|
13
26
|
def test_defaultkeys
|
14
27
|
DEFAULT_KEYS.each { |key,value|
|
15
|
-
|
28
|
+
EntityStore.delete(key)
|
16
29
|
|
17
30
|
# set key when it doesn't exist, should go to default
|
18
|
-
e =
|
31
|
+
e = EntityStore[key]
|
19
32
|
assert_equal e, value
|
20
33
|
|
34
|
+
EntityStore.delete(key)
|
35
|
+
|
21
36
|
# set and try method missing access
|
22
37
|
if key[/\w/] == key
|
23
|
-
|
24
|
-
|
25
|
-
|
38
|
+
eval("e = EntityStore."+key)
|
39
|
+
assert_equal e, value
|
40
|
+
end
|
26
41
|
|
27
42
|
# change it to something else
|
28
|
-
|
29
|
-
e =
|
43
|
+
EntityStore[key] = Time.now.to_s
|
44
|
+
e = EntityStore[key]
|
30
45
|
assert_not_equal e, value
|
31
46
|
|
32
47
|
# find out it's default
|
33
|
-
e =
|
34
|
-
|
48
|
+
e = EntityStore.default(key)
|
49
|
+
assert_equal e, value
|
50
|
+
|
51
|
+
e = EntityStore.defaults[key]
|
52
|
+
assert_equal e, value
|
35
53
|
|
36
54
|
# set it back to default
|
37
|
-
|
38
|
-
e =
|
55
|
+
EntityStore.default!(key)
|
56
|
+
e = EntityStore[key]
|
39
57
|
assert_equal e, value
|
40
58
|
|
41
59
|
# set it to something else using method missing
|
42
60
|
if key[/\w/] == key
|
43
|
-
|
44
|
-
|
45
|
-
assert_equal e, value
|
61
|
+
eval("e = EntityStore."+key +" = Time.now.to_s")
|
62
|
+
assert_equal e, value
|
46
63
|
end
|
47
64
|
}
|
48
65
|
end
|
49
66
|
|
50
67
|
# tests setting values when no DEFAULT_KEY exists
|
51
68
|
def test_settingvalues
|
52
|
-
|
69
|
+
EntityStore.delete('test')
|
53
70
|
|
54
71
|
# key that can't be accessed via method missing
|
55
72
|
# set value and check it
|
56
|
-
|
57
|
-
e =
|
73
|
+
EntityStore['big long key that cannot be accessed via method missing'] = 'what up'
|
74
|
+
e = EntityStore['big long key that cannot be accessed via method missing']
|
58
75
|
assert_equal e, 'what up'
|
59
76
|
|
60
77
|
# set another value and check it
|
61
|
-
|
62
|
-
e =
|
78
|
+
EntityStore['big long key that cannot be accessed via method missing'] = 'another value'
|
79
|
+
e = EntityStore['big long key that cannot be accessed via method missing']
|
63
80
|
assert_equal e, 'another value'
|
64
81
|
|
65
|
-
|
66
|
-
e =
|
82
|
+
EntityStore['test'] = 'what up'
|
83
|
+
e = EntityStore['test']
|
67
84
|
assert_equal e, 'what up'
|
68
85
|
|
69
|
-
|
70
|
-
e =
|
86
|
+
EntityStore['test'] = 'another value'
|
87
|
+
e = EntityStore['test']
|
71
88
|
assert_equal e, 'another value'
|
72
89
|
|
73
90
|
# try the method missing version of the tests
|
74
|
-
e =
|
75
|
-
e =
|
91
|
+
e = EntityStore.test = 'what up'
|
92
|
+
e = EntityStore.test
|
76
93
|
assert_equal e, 'what up'
|
77
94
|
|
78
|
-
e =
|
79
|
-
e =
|
95
|
+
e = EntityStore.test = 'another value'
|
96
|
+
e = EntityStore.test
|
80
97
|
assert_equal e, 'another value'
|
81
98
|
|
82
99
|
end
|
83
100
|
|
84
101
|
def test_getunknownvalue
|
85
|
-
|
86
|
-
e =
|
102
|
+
EntityStore.delete('does not exist')
|
103
|
+
e = EntityStore['does not exist']
|
87
104
|
assert_nil e
|
88
105
|
end
|
89
106
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eatenbyagrue-entity_storage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Siler
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-23 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 2.3.3
|
34
34
|
version:
|
35
|
-
description: An easy to use
|
35
|
+
description: An easy to use Key/Value store for any Ruby on Rails project. Like Memcache, only persistent. Stores config values & application wide state in the database in order to survive server restarts. Designed to allow you to add persistent value storage to any Rails project in about 5 minutes. Additionally, allows users to set a list of default keys that auto-initializes baseline key/value pairs in the database for easy initialization.
|
36
36
|
email:
|
37
37
|
- joshua.siler@gmail.com
|
38
38
|
executables: []
|
@@ -81,7 +81,7 @@ rubyforge_project: entity_storage
|
|
81
81
|
rubygems_version: 1.3.5
|
82
82
|
signing_key:
|
83
83
|
specification_version: 3
|
84
|
-
summary: An easy to use
|
84
|
+
summary: An easy to use Key/Value store for any Ruby on Rails project
|
85
85
|
test_files:
|
86
86
|
- test/test_entity_storage.rb
|
87
87
|
- test/test_helper.rb
|