redijson_models 0.8.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 +7 -0
- data/Rakefile +6 -0
- data/Readme.md +81 -0
- data/lib/env.rb +15 -0
- data/lib/redijson_models.rb +106 -0
- data/lib/version.rb +3 -0
- metadata +105 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 54c5606a725d17734a92db476abae3e38450c2ed5abe28bf49036b2a29b633e2
|
4
|
+
data.tar.gz: 53881342fc655b9ce36703d7480914aec2a4aeb353d6b539b4610801bfbb97a8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ca8662a4d00d8ccbe55a37154b9070357f045f4bd4123541ce58f1d5e008af070b59effc63b10c00dfc6c4a2639392769557e6035c49fbdecfaa80b1ff31f08c
|
7
|
+
data.tar.gz: 2a9b3bf6ee2a276601bb8a66799e6fb48372f1c0f25bdb27e5e31340eeac29af7e90ed25746a24f37c4b3d94d6a9298524bca3f7276bf39bd7846fb575c59af3
|
data/Rakefile
ADDED
data/Readme.md
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# RediJsonModels
|
2
|
+
|
3
|
+
Document-like ORM based on Redis key value store - uses Redis Re-JSON for full json manipulation
|
4
|
+
|
5
|
+
### Requirements
|
6
|
+
|
7
|
+
- Redis (v4+)
|
8
|
+
- Re-JSON module installed
|
9
|
+
|
10
|
+
### DB API
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
Model.get 1 #=> returns an object instance (gets it from redis)
|
14
|
+
|
15
|
+
Model.all #=> returns an array of Model object instances
|
16
|
+
|
17
|
+
Model.create({}) #=> creates an entry in redis
|
18
|
+
|
19
|
+
Model.update(1, {}) #=> updates a record in redis
|
20
|
+
```
|
21
|
+
|
22
|
+
### Model Definition and Instance API by Virtus
|
23
|
+
|
24
|
+
#### Definition:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
class Document
|
28
|
+
extend RediJsonModelLib
|
29
|
+
include RediJsonModelMixin
|
30
|
+
include Virtus.model
|
31
|
+
|
32
|
+
attribute :id, Integer
|
33
|
+
attribute :name, String
|
34
|
+
attribute :contents, String
|
35
|
+
|
36
|
+
def antani
|
37
|
+
# "..."
|
38
|
+
end
|
39
|
+
end
|
40
|
+
```
|
41
|
+
|
42
|
+
### Instance API:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
doc = Document.new name: "Foo", contents: "Bar123"
|
46
|
+
puts doc.name #=> "foo"
|
47
|
+
puts doc.antani #=> "..."
|
48
|
+
doc.save # saves the record, gives an auto increment id (example: 1)
|
49
|
+
|
50
|
+
doc = Document.get doc.id
|
51
|
+
puts doc.name #=> "foo"
|
52
|
+
puts doc.antani #=> "..."
|
53
|
+
```
|
54
|
+
|
55
|
+
### Run local Redis (+ Re-JSON module) locally via Docker:
|
56
|
+
|
57
|
+
in this repo run:
|
58
|
+
|
59
|
+
```
|
60
|
+
docker-compose up
|
61
|
+
```
|
62
|
+
|
63
|
+
Which use the docker-compose.yml to start your redis.
|
64
|
+
|
65
|
+
|
66
|
+
### Run specs
|
67
|
+
|
68
|
+
(you need to run a local redis + rejson service - explained above)
|
69
|
+
|
70
|
+
Run:
|
71
|
+
|
72
|
+
```
|
73
|
+
rake spec
|
74
|
+
```
|
75
|
+
|
76
|
+
|
77
|
+
---
|
78
|
+
|
79
|
+
Enjoy!
|
80
|
+
|
81
|
+
@makevoid
|
data/lib/env.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# require 'bundler/setup'
|
2
|
+
# Bundler.require :default
|
3
|
+
require 'redis'
|
4
|
+
require 'virtus'
|
5
|
+
require 'dry-inflector'
|
6
|
+
require 'rejson'
|
7
|
+
# require 'redis_rejson' # a little bit faster but has less features than the above
|
8
|
+
|
9
|
+
module RediJsonModels
|
10
|
+
REDIS_DB = ENV["REDIS_DB"]
|
11
|
+
|
12
|
+
R = Redis.new db: REDIS_DB || 0
|
13
|
+
|
14
|
+
class NilValue; end
|
15
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require_relative 'env'
|
2
|
+
|
3
|
+
module RediJsonModels
|
4
|
+
|
5
|
+
# low level API
|
6
|
+
class RJ
|
7
|
+
def self.configure(redis:)
|
8
|
+
@@redis = redis
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.redis
|
12
|
+
@@redis
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.[](key)
|
16
|
+
# redis.json_get key
|
17
|
+
redis.json_get key, Rejson::Path.root_path
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.[]=(key, val)
|
21
|
+
# redis.json_set key, val
|
22
|
+
redis.json_set key, Rejson::Path.root_path, val
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module RediJsonModelLib
|
27
|
+
INFLECTOR = Dry::Inflector.new
|
28
|
+
|
29
|
+
def all
|
30
|
+
1.upto(count).map do |entry_id|
|
31
|
+
get entry_id
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def count
|
36
|
+
( RJ["#{resource}:count"] || 0 ).to_i
|
37
|
+
end
|
38
|
+
|
39
|
+
def get(id)
|
40
|
+
data = RJ["#{resource}:#{id}"]
|
41
|
+
return unless data
|
42
|
+
new data
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_attr(id, attr)
|
46
|
+
key = "#{resource}:#{id}"
|
47
|
+
data = RJ.redis.json_get key, ".name"
|
48
|
+
return NilValue.new unless data
|
49
|
+
data
|
50
|
+
end
|
51
|
+
|
52
|
+
def create(attrs)
|
53
|
+
id = incr
|
54
|
+
attrs.merge! id: id
|
55
|
+
obj = new attrs
|
56
|
+
RJ["#{resource}:#{id}"] = obj.attributes
|
57
|
+
obj
|
58
|
+
end
|
59
|
+
|
60
|
+
def update(id, attrs)
|
61
|
+
resource = get id
|
62
|
+
resource.update attrs
|
63
|
+
end
|
64
|
+
|
65
|
+
def resource
|
66
|
+
INFLECTOR.pluralize model_name
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
# TODO: use incr
|
72
|
+
def incr
|
73
|
+
RJ["#{resource}:count"] = count + 1
|
74
|
+
end
|
75
|
+
|
76
|
+
def model_name
|
77
|
+
self.name.downcase
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
module RediJsonModelMixin
|
83
|
+
|
84
|
+
def update(attrs_new)
|
85
|
+
raise "Can't update a resource without an `id`" unless id
|
86
|
+
klass = self.class
|
87
|
+
model = klass.get id
|
88
|
+
attrs = model.attributes
|
89
|
+
attrs.merge! attrs_new
|
90
|
+
obj = klass.new attrs
|
91
|
+
RJ["#{self.class.resource}:#{id}"] = obj.attributes
|
92
|
+
obj
|
93
|
+
end
|
94
|
+
|
95
|
+
def save
|
96
|
+
klass = self.class
|
97
|
+
id = klass.send :incr
|
98
|
+
attrs = attributes
|
99
|
+
attrs.merge! id: id
|
100
|
+
RJ["#{self.class.resource}:#{id}"] = attrs
|
101
|
+
self
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
data/lib/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: redijson_models
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- makevoid
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-05-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: redis
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.3.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.3.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: virtus
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.5
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.0.5
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: dry-inflector
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.2.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.2.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rejson-rb
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.0.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.0.0
|
69
|
+
description: Document-like ORM based on Redis key value store - uses Redis Re-JSON
|
70
|
+
for full json manipulation
|
71
|
+
email:
|
72
|
+
- makevoid@gmail.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- Rakefile
|
78
|
+
- Readme.md
|
79
|
+
- lib/env.rb
|
80
|
+
- lib/redijson_models.rb
|
81
|
+
- lib/version.rb
|
82
|
+
homepage: http://makevoid.com
|
83
|
+
licenses:
|
84
|
+
- Unlicense
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubygems_version: 3.0.3
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: Document-like ORM based on Redis key value store
|
105
|
+
test_files: []
|