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.
@@ -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
@@ -0,0 +1,6 @@
1
+ desc "Spec"
2
+ task :spec do
3
+ sh "bundle exec rspec"
4
+ end
5
+
6
+ task default: :spec
@@ -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
@@ -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
@@ -0,0 +1,3 @@
1
+ module RediJsonModels
2
+ VERSION = "0.8.0"
3
+ end
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: []