bmg-redis 0.20.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2eb3aa2cf27c4636c1a5f4ba3c8e285ff3a7637b3aba741af20c33fafdd52c08
4
+ data.tar.gz: c41d2a45cbaabd4805fb85d071aa381c3e4931e31ec6c2a7cf2145c27d2c6882
5
+ SHA512:
6
+ metadata.gz: 01eea86c3261aad9cf80f60b9b72e7293c12e0a49fa976e260c18ff0a7f164c14ed1f9b1e867097972cd6120b29b43b54033183826322dfe3d6c548a672cdfa9
7
+ data.tar.gz: ebfb639103f4fc25fc606cd54d26d247b22dcc1315d4c46ca4ec63497244dc6fc7c93183e0252c62a012909d8d53486945f681dc2dec38e9f537b0b4c54f91d6
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+ gem "bmg", path: "../.."
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ #
2
+ # Install all tasks found in tasks folder
3
+ #
4
+ # See .rake files there for complete documentation.
5
+ #
6
+ Dir["tasks/*.rake"].each do |taskfile|
7
+ load taskfile
8
+ end
9
+
10
+ # We run tests by default
11
+ task :default => :test
@@ -0,0 +1,111 @@
1
+ module Bmg
2
+ module Redis
3
+ class Relation
4
+ include Bmg::Relation
5
+
6
+ DEFAULT_OPTIONS = {
7
+ serializer: :marshal
8
+ }
9
+
10
+ def initialize(type, options)
11
+ @type = type
12
+ @options = DEFAULT_OPTIONS.merge(options)
13
+
14
+ serializer!
15
+ candidate_key!
16
+ end
17
+ attr_accessor :type
18
+
19
+ attr_reader :options
20
+ protected :options
21
+
22
+ def each
23
+ return to_enum unless block_given?
24
+
25
+ redis.scan_each(match: "#{key_prefix}:*") do |key|
26
+ tuple_str = redis.get(key)
27
+ tuple = serializer.deserialize(tuple_str)
28
+ yield(tuple)
29
+ end
30
+ end
31
+
32
+ ###
33
+
34
+ def insert(tuple_or_tuples)
35
+ case tuple_or_tuples
36
+ when Hash
37
+ key = extract_key(tuple_or_tuples)
38
+ serialized = serializer.serialize(tuple_or_tuples)
39
+ redis.set(key, serialized)
40
+ else
41
+ tuple_or_tuples.each do |tuple|
42
+ insert(tuple)
43
+ end
44
+ end
45
+ self
46
+ end
47
+
48
+ def update(updating, predicate = Predicate.tautology)
49
+ each do |tuple|
50
+ next unless predicate.call(tuple)
51
+
52
+ insert(tuple.merge(updating))
53
+ end
54
+ self
55
+ end
56
+
57
+ def delete(predicate = Predicate.tautology)
58
+ keys = self
59
+ .each
60
+ .select{|tuple| predicate.call(tuple) }
61
+ .map{|tuple| extract_key(tuple) }
62
+
63
+ redis.del(*keys)
64
+
65
+ self
66
+ end
67
+
68
+ private
69
+
70
+ def serializer
71
+ @serializer ||= begin
72
+ case s = options[:serializer] || :marshal
73
+ when :marshal
74
+ Serializer::Marshal.new
75
+ when :json
76
+ Serializer::Json.new
77
+ when Serializer
78
+ s
79
+ else
80
+ raise Bmg::Error, "Unknown serializer `#{s}`"
81
+ end
82
+ end
83
+ end
84
+ alias :serializer! :serializer
85
+
86
+ def candidate_key
87
+ @candidate_key ||= begin
88
+ raise Bmg::Error, "A key must be provided" unless type.knows_keys?
89
+ type.keys.first
90
+ end
91
+ end
92
+ alias :candidate_key! :candidate_key
93
+
94
+ def redis
95
+ options[:redis]
96
+ end
97
+
98
+ def key_prefix
99
+ options[:key_prefix] || "bmg"
100
+ end
101
+
102
+ def extract_key(tuple)
103
+ key = candidate_key
104
+ key = TupleAlgebra.project(tuple, key)
105
+ key = serializer.serialize(key)
106
+ "#{key_prefix}:#{key}"
107
+ end
108
+
109
+ end # class Relation
110
+ end # module Redis
111
+ end # module Bmg
@@ -0,0 +1,18 @@
1
+ module Bmg
2
+ module Redis
3
+ class Serializer
4
+ class Json < Serializer
5
+
6
+ def serialize(tuple)
7
+ tuple.to_json
8
+ end
9
+
10
+ def deserialize(serialized)
11
+ parsed = JSON.parse(serialized)
12
+ TupleAlgebra.symbolize_keys(parsed)
13
+ end
14
+
15
+ end # class Json
16
+ end # class Serializer
17
+ end # module Redis
18
+ end # module Bmg
@@ -0,0 +1,17 @@
1
+ module Bmg
2
+ module Redis
3
+ class Serializer
4
+ class Marshal < Serializer
5
+
6
+ def serialize(tuple)
7
+ ::Marshal.dump(tuple)
8
+ end
9
+
10
+ def deserialize(serialized)
11
+ ::Marshal.load(serialized)
12
+ end
13
+
14
+ end # class Marshal
15
+ end # class Serializer
16
+ end # module Redis
17
+ end # module Bmg
@@ -0,0 +1,8 @@
1
+ module Bmg
2
+ module Redis
3
+ class Serializer
4
+ end # class Serializer
5
+ end # module Redis
6
+ end # module Bmg
7
+ require_relative 'serializer/json'
8
+ require_relative 'serializer/marshal'
data/lib/bmg/redis.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'redis'
2
+ require 'json'
3
+ require_relative 'redis/serializer'
4
+ require_relative 'redis/relation'
data/tasks/gem.rake ADDED
@@ -0,0 +1,39 @@
1
+ require 'rubygems/package_task'
2
+
3
+ # Dynamically load the gem spec
4
+ gemspec_file = File.expand_path('../../bmg-redis.gemspec', __FILE__)
5
+ gemspec = Kernel.eval(File.read(gemspec_file))
6
+
7
+ Gem::PackageTask.new(gemspec) do |t|
8
+
9
+ # Name of the package
10
+ t.name = gemspec.name
11
+
12
+ # Version of the package
13
+ t.version = gemspec.version
14
+
15
+ # Directory used to store the package files
16
+ t.package_dir = "pkg"
17
+
18
+ # True if a gzipped tar file (tgz) should be produced
19
+ t.need_tar = false
20
+
21
+ # True if a gzipped tar file (tar.gz) should be produced
22
+ t.need_tar_gz = false
23
+
24
+ # True if a bzip2'd tar file (tar.bz2) should be produced
25
+ t.need_tar_bz2 = false
26
+
27
+ # True if a zip file should be produced (default is false)
28
+ t.need_zip = false
29
+
30
+ # List of files to be included in the package.
31
+ t.package_files = gemspec.files
32
+
33
+ # Tar command for gzipped or bzip2ed archives.
34
+ t.tar_command = "tar"
35
+
36
+ # Zip command for zipped archives.
37
+ t.zip_command = "zip"
38
+
39
+ end
data/tasks/test.rake ADDED
@@ -0,0 +1,24 @@
1
+ namespace :test do
2
+ require "rspec/core/rake_task"
3
+
4
+ tests = []
5
+
6
+ desc "Runs unit tests"
7
+ RSpec::Core::RakeTask.new(:unit) do |t|
8
+ t.pattern = "spec/unit/**/test_*.rb"
9
+ t.rspec_opts = ["-Ilib", "-Ispec/unit", "--color", "--backtrace", "--format=progress"]
10
+ end
11
+ tests << :unit
12
+
13
+ desc "Runs integration tests"
14
+ RSpec::Core::RakeTask.new(:integration) do |t|
15
+ t.pattern = "spec/integration/**/test_*.rb"
16
+ t.rspec_opts = ["-Ilib", "-Ispec/integration", "--color", "--backtrace", "--format=progress"]
17
+ end
18
+ tests << :integration
19
+
20
+ task :all => tests
21
+ end
22
+
23
+ desc "Runs all tests"
24
+ task :test => :'test:all'
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bmg-redis
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.20.0
5
+ platform: ruby
6
+ authors:
7
+ - Bernard Lambeau
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-05-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bmg
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: redis
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '4.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '4.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.6'
69
+ description: bmg-redis provides an adapter to expose redis databases as relations
70
+ email: blambeau@gmail.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - Gemfile
76
+ - Rakefile
77
+ - lib/bmg/redis.rb
78
+ - lib/bmg/redis/relation.rb
79
+ - lib/bmg/redis/serializer.rb
80
+ - lib/bmg/redis/serializer/json.rb
81
+ - lib/bmg/redis/serializer/marshal.rb
82
+ - tasks/gem.rake
83
+ - tasks/test.rake
84
+ homepage: http://github.com/enspirit/bmg-redis
85
+ licenses:
86
+ - MIT
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubygems_version: 3.1.4
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Expose redis as relations.
107
+ test_files: []