meowdb 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,5 @@
1
+ class MeowDBError < StandardError
2
+ def initialize(message = "Unknown error")
3
+ super(message)
4
+ end
5
+ end
@@ -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
@@ -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: []