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 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: []