geode 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/lib/geode/redis.rb +26 -0
- data/lib/geode/sequel.rb +38 -0
- data/lib/geode.rb +11 -49
- metadata +18 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2cee541c81d7d38fd8d62c651238ac0912cca0ba29ae04aed482d1e0420c20b
|
4
|
+
data.tar.gz: bb5925419f0579dc023a3bb79b917b0b78ab37c5ef35282cbeb0c50b82cfc642
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b608bb22211b633c66d9c0eb2f9f396b948856bf9447a82737407c2806253b86356b65dcb570345c09b4f144f8f30dbe8064959a08daccd3f236797a8d938da
|
7
|
+
data.tar.gz: 363bd2f82a7b8732dcd53b8eeab4f341c48e8b839139d152ea16b0a5ec705a55be8f99aaac9987d8afef2cc526109f20918aacb2533e411d4da403a1b8fc87f5
|
data/lib/geode/redis.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'redis'
|
2
|
+
|
3
|
+
require_relative '../geode'
|
4
|
+
|
5
|
+
module Geode
|
6
|
+
# A store implemented using Redis.
|
7
|
+
class RedisStore < Store
|
8
|
+
def initialize(name, connection = {})
|
9
|
+
super
|
10
|
+
|
11
|
+
@redis = Redis.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def open
|
15
|
+
table = if @redis.exists? @name
|
16
|
+
Marshal.load(@redis.get @name)
|
17
|
+
else
|
18
|
+
{}
|
19
|
+
end
|
20
|
+
|
21
|
+
(yield table).tap do
|
22
|
+
@redis.set @name, Marshal.dump(table)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/geode/sequel.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'sequel'
|
2
|
+
|
3
|
+
require_relative '../geode'
|
4
|
+
|
5
|
+
module Geode
|
6
|
+
# Uses a relational database as the store rather than Redis.
|
7
|
+
# This is mainly useful for Heroku, where persistent Postgres is free, but
|
8
|
+
# the same is not true of Redis.
|
9
|
+
# Unless you have a similarly good reason to use this class, use RedisStore instead.
|
10
|
+
class SequelStore < Store
|
11
|
+
def initialize(name, connection = { adapter: 'postgres' })
|
12
|
+
super
|
13
|
+
|
14
|
+
db = Sequel.connect(connection)
|
15
|
+
db.create_table? :geode do
|
16
|
+
primary_key :id
|
17
|
+
String :name
|
18
|
+
File :value
|
19
|
+
end
|
20
|
+
|
21
|
+
@db = db[:geode]
|
22
|
+
end
|
23
|
+
|
24
|
+
def open
|
25
|
+
store = @db.where(name: @name)
|
26
|
+
table = if store.first.nil?
|
27
|
+
store.insert(name: @name, value: '')
|
28
|
+
{}
|
29
|
+
else
|
30
|
+
Marshal.load(store.first[:value])
|
31
|
+
end
|
32
|
+
|
33
|
+
(yield table).tap do
|
34
|
+
store.update(value: Sequel.blob(Marshal.dump(table)))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/geode.rb
CHANGED
@@ -1,57 +1,19 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'redis'
|
4
|
-
|
5
|
-
require 'sequel'
|
6
|
-
|
7
1
|
module Geode
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
2
|
+
# Subclass this to implement your own stores.
|
3
|
+
class Store
|
4
|
+
# Connect to a store.
|
5
|
+
# @param name [Symbol, String] The name of the store
|
6
|
+
# @param connection [Hash, String] DB connection parameters passed to the DB client
|
7
|
+
def initialize(name, connection)
|
8
|
+
@name = name.to_s
|
12
9
|
end
|
13
10
|
|
14
11
|
# "Open" the store for reading and/or writing.
|
15
|
-
#
|
16
|
-
|
17
|
-
|
18
|
-
Marshal.load(@redis.get @name)
|
19
|
-
else
|
20
|
-
{}
|
21
|
-
end
|
22
|
-
|
23
|
-
(yield table).tap do
|
24
|
-
@redis.set(@name, Marshal.dump(table))
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class PostgresStore
|
30
|
-
def initialize(name, connection=nil)
|
31
|
-
@name = name
|
32
|
-
@db = connection.nil? ? Sequel.postgres : Sequel.connect(connection)
|
33
|
-
@db.create_table? :geode do
|
34
|
-
primary_key :id
|
35
|
-
String :name
|
36
|
-
File :value
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
12
|
+
# @yield a block
|
13
|
+
# @yieldparam table [Hash] The table belonging to `@name`
|
14
|
+
# @return [Object] The result of the block.
|
41
15
|
def open
|
42
|
-
|
43
|
-
store = geode.where(name: @name)
|
44
|
-
table = if store.first.nil?
|
45
|
-
store.insert(name: @name, value: '')
|
46
|
-
{}
|
47
|
-
else
|
48
|
-
Marshal.load(store.first[:value])
|
49
|
-
end
|
50
|
-
|
51
|
-
(yield table).tap do
|
52
|
-
dumped = Marshal.dump(table)
|
53
|
-
store.update(value: Sequel.blob(dumped))
|
54
|
-
end
|
16
|
+
raise NotImplementedError
|
55
17
|
end
|
56
18
|
end
|
57
19
|
end
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- biqqles
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: redis
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '4.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
40
|
+
version: '4.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sequel
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
47
|
+
version: '5.0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
54
|
+
version: '5.0'
|
55
55
|
description:
|
56
56
|
email:
|
57
57
|
- biqqles@protonmail.com
|
@@ -60,6 +60,8 @@ extensions: []
|
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
62
|
- lib/geode.rb
|
63
|
+
- lib/geode/redis.rb
|
64
|
+
- lib/geode/sequel.rb
|
63
65
|
homepage: https://github.com/biqqles/geode
|
64
66
|
licenses:
|
65
67
|
- MPL-2.0
|
@@ -75,7 +77,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
75
77
|
requirements:
|
76
78
|
- - ">="
|
77
79
|
- !ruby/object:Gem::Version
|
78
|
-
version:
|
80
|
+
version: '0'
|
79
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
82
|
requirements:
|
81
83
|
- - ">="
|
@@ -85,5 +87,5 @@ requirements: []
|
|
85
87
|
rubygems_version: 3.1.2
|
86
88
|
signing_key:
|
87
89
|
specification_version: 4
|
88
|
-
summary:
|
90
|
+
summary: Elegantly store Ruby objects in Redis or SQL
|
89
91
|
test_files: []
|