meowdb 1.0.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/meowdb.gemspec +18 -0
- data/src/meowdb.rb +66 -0
- data/src/meowdb/error.rb +5 -0
- data/src/meowdb/hash.rb +55 -0
- data/src/meowdb/utils.rb +71 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b6ca5894bbd511856c155b9a8ba21467bf54a023f8d7ed4221036bbd28977de4
|
4
|
+
data.tar.gz: fcb0f256196840590eed2a9bd0f6d13cc274b6f4d42db24d99b3034fb79e4bfc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ba0f410939dd2f50ae5334591f6a0b1db0cb9b358d9d072cc65132ddfc1c00dfbd871d3672a508a58508b765fddd47c0870c8caa93a8899116bd4e437bb21804
|
7
|
+
data.tar.gz: 0113723dee315ec9508378f2b1d0f0131c06d5fdbd88fc72d275c9a3d3333ee9ff882b7479c8935888ae84d04988cf9c35181d0ecd6af1f3ef47636512b86b25
|
data/meowdb.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
lib = File.expand_path("./src/", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = "meowdb"
|
6
|
+
spec.version = "1.0.0"
|
7
|
+
spec.summary = "\"Database\" in JSON."
|
8
|
+
spec.description = "A Ruby implementation of the MeowDB.js library (https://www.npmjs.com/package/meowdb)."
|
9
|
+
spec.authors = ["Drylotrans"]
|
10
|
+
spec.email = [""]
|
11
|
+
spec.files = Dir.glob("src/*.rb") + Dir.glob("src/meowdb/*.rb") + ["meowdb.gemspec"]
|
12
|
+
spec.require_paths = ["src"]
|
13
|
+
spec.homepage = "https://rubygems.org/gems/meowdb"
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.metadata = {
|
16
|
+
"source_code_uri" => "https://github.com/Drylotrans/MeowDB.rb"
|
17
|
+
}
|
18
|
+
end
|
data/src/meowdb.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require "meowdb/error.rb"
|
2
|
+
require "meowdb/hash.rb"
|
3
|
+
require "meowdb/utils.rb"
|
4
|
+
require "pathname"
|
5
|
+
require "json"
|
6
|
+
|
7
|
+
class MeowDB
|
8
|
+
def initialize(dir: nil, name: "database")
|
9
|
+
raise MeowDBError.new("The directory path is required") if !dir
|
10
|
+
raise MeowDBError.new("The name of the database is required") if !name
|
11
|
+
raise MeowDBError.new("The directory path must be an string") if !dir.is_a?(String)
|
12
|
+
raise MeowDBError.new("The name of the database must be an string") if !name.is_a?(String)
|
13
|
+
raise MeowDBError.new("The directory must be valid") if !Pathname.new(dir).directory?
|
14
|
+
raise MeowDBError.new("The name must have more of one character") if name.length < 1
|
15
|
+
raise MeowDBError.new("The name must only include letters, numbers and underscores") if !/^[a-zA-Z0-9_]+$/.match(name)
|
16
|
+
|
17
|
+
@_options = {
|
18
|
+
"dir" => dir,
|
19
|
+
"name" => name
|
20
|
+
}
|
21
|
+
@_options["file"] = Pathname.new(@_options["dir"]).join("#{@_options["name"]}.json")
|
22
|
+
@_utils = MeowDBUtils.new(@_options["file"])
|
23
|
+
|
24
|
+
if !File.exist?(@_options["file"])
|
25
|
+
File.write(@_options["file"], "{}")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def all()
|
30
|
+
return MeowDBHash.new(@_utils.get_all(), "/", @_options["file"])
|
31
|
+
end
|
32
|
+
|
33
|
+
def create(id, initial_value)
|
34
|
+
return MeowDBError.new("The ID must only include letters, numbers, underscores and dots") if !@_utils.valid_id?(id)
|
35
|
+
return MeowDBError.new("The value must be a string, number, hash, boolean, array or a nil") if !@_utils.valid_value?(id)
|
36
|
+
return @_utils.get(id) if @_utils.get(id)
|
37
|
+
object = @_utils.set(id, initial_value, true)
|
38
|
+
return object.is_a?(Hash) ? object.merge!(__id: id) : object
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete(id)
|
42
|
+
return MeowDBError.new("The ID must only include letters, numbers, underscores and dots") if !@_utils.valid_id?(id)
|
43
|
+
tmp_data = @_utils.get(id)
|
44
|
+
return MeowDBError.new("That element doesn't exists in the database") if !tmp_data
|
45
|
+
@_utils.set(id, nil, false)
|
46
|
+
return tmp_data.is_a?(Hash) ? tmp_data.merge!(__id: id) : tmp_data
|
47
|
+
end
|
48
|
+
|
49
|
+
def exist?(id)
|
50
|
+
return MeowDBError.new("The ID must only include letters, numbers, underscores and dots") if !@_utils.valid_id?(id)
|
51
|
+
return true if @_utils.get(id)
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
|
55
|
+
def get(id)
|
56
|
+
return MeowDBError.new("The ID must only include letters, numbers, underscores and dots") if !@_utils.valid_id?(id)
|
57
|
+
data = @_utils.get(id)
|
58
|
+
return data.is_a?(Hash) ? MeowDBHash.new(data, id, @_options["file"]) : data
|
59
|
+
end
|
60
|
+
|
61
|
+
def set(id, value)
|
62
|
+
return MeowDBError.new("The ID must only include letters, numbers, underscores and dots") if !@_utils.valid_id?(id)
|
63
|
+
return MeowDBError.new("The value must be a string, number, hash, boolean, array or a nil") if !@_utils.valid_value?(value)
|
64
|
+
return @_utils.set(id, value, false)
|
65
|
+
end
|
66
|
+
end
|
data/src/meowdb/error.rb
ADDED
data/src/meowdb/hash.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative "error.rb"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
def valid_value?(value)
|
5
|
+
return true if value.is_a?(String)
|
6
|
+
return true if value.is_a?(Integer)
|
7
|
+
return true if value.is_a?(Hash)
|
8
|
+
return true if value.is_a?(Array)
|
9
|
+
return true if value.is_a?(TrueClass)
|
10
|
+
return true if value.is_a?(FalseClass)
|
11
|
+
return true if value.is_a?(NilClass)
|
12
|
+
return false
|
13
|
+
end
|
14
|
+
|
15
|
+
def stringify_data(data)
|
16
|
+
return "\"#{data}\"" if data.is_a?(String)
|
17
|
+
return "#{data}" if data.is_a?(Integer)
|
18
|
+
return "#{JSON.generate(data)}" if data.is_a?(Hash)
|
19
|
+
return "[#{data.map{|e| self.stringify_data(e)}.join(",")}]" if data.is_a?(Array)
|
20
|
+
return "nil" if data.is_a?(NilClass)
|
21
|
+
return "#{data.to_s()}"
|
22
|
+
end
|
23
|
+
|
24
|
+
class MeowDBHash < Hash
|
25
|
+
def initialize(hash, id, file)
|
26
|
+
super()
|
27
|
+
@__id = id if (id != "/")
|
28
|
+
@file = file
|
29
|
+
hash.each do |k, v|
|
30
|
+
self[k] = v
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def __id
|
35
|
+
return @__id
|
36
|
+
end
|
37
|
+
|
38
|
+
def save()
|
39
|
+
all_data = JSON.parse(File.read(@file))
|
40
|
+
info = ""
|
41
|
+
if __id
|
42
|
+
__id.split(".").each do |property|
|
43
|
+
info += "[\"#{property}\"]"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
self.each do |k, v|
|
47
|
+
unless (k.start_with?("__"))
|
48
|
+
return MeowDBError.new("The value must be a string, number, hash, boolean, array or a nil") if !valid_value?(v)
|
49
|
+
eval("all_data#{info}[\"#{k}\"] = #{stringify_data(v)}")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
File.write(@file, JSON.generate(all_data))
|
53
|
+
return eval("all_data#{info}")
|
54
|
+
end
|
55
|
+
end
|
data/src/meowdb/utils.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
class MeowDBUtils
|
4
|
+
def initialize(file)
|
5
|
+
@file = file
|
6
|
+
end
|
7
|
+
|
8
|
+
def valid_id?(id)
|
9
|
+
return false if !id.is_a?(String)
|
10
|
+
return false if id.length < 1
|
11
|
+
return false if (id =~ /^[a-zA-Z0-9.]+$/).nil?
|
12
|
+
return false if id.split(".").include?("")
|
13
|
+
return false if id.end_with?(".")
|
14
|
+
return true
|
15
|
+
end
|
16
|
+
|
17
|
+
def valid_value?(value)
|
18
|
+
return true if value.is_a?(String)
|
19
|
+
return true if value.is_a?(Integer)
|
20
|
+
return true if value.is_a?(Hash)
|
21
|
+
return true if value.is_a?(Array)
|
22
|
+
return true if value.is_a?(TrueClass)
|
23
|
+
return true if value.is_a?(FalseClass)
|
24
|
+
return true if value.is_a?(NilClass)
|
25
|
+
return false
|
26
|
+
end
|
27
|
+
|
28
|
+
def stringify_data(data)
|
29
|
+
return "\"#{data}\"" if data.is_a?(String)
|
30
|
+
return "#{data}" if data.is_a?(Integer)
|
31
|
+
return "#{JSON.generate(data)}" if data.is_a?(Hash)
|
32
|
+
return "[#{data.map{|e| self.stringify_data(e)}.join(",")}]" if data.is_a?(Array)
|
33
|
+
return "nil" if data.is_a?(NilClass)
|
34
|
+
return "#{data.to_s()}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_all()
|
38
|
+
return JSON.parse(File.read(@file))
|
39
|
+
end
|
40
|
+
|
41
|
+
def get(id)
|
42
|
+
all_data = self.get_all()
|
43
|
+
info = ""
|
44
|
+
properties = id.split(".")
|
45
|
+
properties.each do |property|
|
46
|
+
info += "[\"#{property}\"]"
|
47
|
+
if (properties.index(property) != (properties.length - 1))
|
48
|
+
eval("all_data#{info} = {}") if (!eval("all_data#{info}"))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
return eval("all_data#{info}")
|
52
|
+
end
|
53
|
+
|
54
|
+
def set(id, data, create = false)
|
55
|
+
all_data = self.get_all()
|
56
|
+
info = ""
|
57
|
+
properties = id.split(".")
|
58
|
+
properties.each do |property|
|
59
|
+
info += "[\"#{property}\"]"
|
60
|
+
if (properties.index(property) == (properties.length - 1))
|
61
|
+
last = eval("all_data#{info}")
|
62
|
+
eval("all_data#{info} = #{self.stringify_data(data)}") unless last && create
|
63
|
+
else
|
64
|
+
eval("all_data#{info} = {}") if (!eval("all_data#{info}"))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
File.write(@file, JSON.generate(all_data))
|
69
|
+
return eval("all_data#{info}")
|
70
|
+
end
|
71
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: meowdb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Drylotrans
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-05-17 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A Ruby implementation of the MeowDB.js library (https://www.npmjs.com/package/meowdb).
|
14
|
+
email:
|
15
|
+
- ''
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- meowdb.gemspec
|
21
|
+
- src/meowdb.rb
|
22
|
+
- src/meowdb/error.rb
|
23
|
+
- src/meowdb/hash.rb
|
24
|
+
- src/meowdb/utils.rb
|
25
|
+
homepage: https://rubygems.org/gems/meowdb
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata:
|
29
|
+
source_code_uri: https://github.com/Drylotrans/MeowDB.rb
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- src
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubygems_version: 3.1.2
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: '"Database" in JSON.'
|
49
|
+
test_files: []
|