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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9d2e925a8364400b6115a4223c5856f12e2c24b56f1ef8bf1720e4d00e1e4c9
4
- data.tar.gz: 8d6419d449bb81d08ea6eead65910120ec0e157d925b046847e8b191a4adf084
3
+ metadata.gz: f2cee541c81d7d38fd8d62c651238ac0912cca0ba29ae04aed482d1e0420c20b
4
+ data.tar.gz: bb5925419f0579dc023a3bb79b917b0b78ab37c5ef35282cbeb0c50b82cfc642
5
5
  SHA512:
6
- metadata.gz: 851f343021aa0a78e16cda8669ccacba8b40a608504352d59e87985287882da06b376de9fd99c918e89d4a0c30ecb61e9c7718a1ceb7ce340721886ba75f5a09
7
- data.tar.gz: 62ab42620321c4e6c5c9c88a422d411732b31b6d01dad4cf9e1415338ad192da2e6870aa2f4826d73c566f3b063082feb42338d4288eb9ca1a47ce8c22024b3c
6
+ metadata.gz: 5b608bb22211b633c66d9c0eb2f9f396b948856bf9447a82737407c2806253b86356b65dcb570345c09b4f144f8f30dbe8064959a08daccd3f236797a8d938da
7
+ data.tar.gz: 363bd2f82a7b8732dcd53b8eeab4f341c48e8b839139d152ea16b0a5ec705a55be8f99aaac9987d8afef2cc526109f20918aacb2533e411d4da403a1b8fc87f5
@@ -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
@@ -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
- class RedisStore
9
- def initialize(name)
10
- @name = name
11
- @redis = Redis.new
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
- # Returns the result of the block.
16
- def open
17
- table = if @redis.exists? @name
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
- geode = @db[:geode]
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.1.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-14 00:00:00.000000000 Z
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: 2.4.0
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: A simple hierarchical key-store for Ruby
90
+ summary: Elegantly store Ruby objects in Redis or SQL
89
91
  test_files: []