kvj 0.0.3 → 0.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 05ff9c7e30c82506812d379073f6d00de58d37c6
4
- data.tar.gz: a19ad513e5513dfb4d7af19a05ad5f99a4a7f5ca
3
+ metadata.gz: b2698731d96db2800bf47ef4edba0f1dee71916b
4
+ data.tar.gz: d092ffd4c571fbc3f7613afb5c737be77bd4f721
5
5
  SHA512:
6
- metadata.gz: caf5f3baf60c37d94d19721250307337e08b6f47004943c8580cbe74f3941f5423739890e52fbcec414d652c148cf39f39b7ac46087e5d93317764eed81f8b3d
7
- data.tar.gz: df224a20c4c42ee7fa453ac5c53bc49892573f3e18242eceba38c1eb39a34f681890f9c57b4b75308c240f3c1b1b15127f27d791279fcb58d0b1ff65ae413ae7
6
+ metadata.gz: 140e4618e0b24760306528f7e0c030ddb2d7ddd15349718e88134f8b1f4c89bf8a76195a6e104cd8fd344a86145ddbce2120d277e875c3afab5288a8aba040fd
7
+ data.tar.gz: 10ab1a26b0d0deefb643fb234a7dc554e5357cfaaed051fef882be3914c26b2f6464150a311e08907b5f5599a3f1428ad45114ea02d7e99d884883d80d7e0dcc
@@ -1,14 +1,14 @@
1
1
 
2
- module BaseManager
2
+ module BaseMethods
3
3
  def list
4
- base_directory = CONFIG['base_directory']
4
+ base_directory = KVJ_CONFIG['base_directory']
5
5
  databases = Dir.entries(base_directory)
6
6
  databases.delete_if { |database| database =~ /^\./ }
7
7
  databases.map { |file_name| file_name.chomp('.json') }
8
8
  end
9
9
 
10
10
  def drop(database)
11
- base_directory = CONFIG['base_directory']
11
+ base_directory = KVJ_CONFIG['base_directory']
12
12
  File.delete(base_directory + database + '.json')
13
13
  end
14
14
  end
data/lib/kvj.rb CHANGED
@@ -1,77 +1,44 @@
1
1
  require_relative 'file_connector'
2
- require_relative 'base_manager'
2
+ require_relative 'base_methods'
3
+ require_relative 'meta_hash_methods'
3
4
  require 'pry'
4
5
  require 'yaml'
5
6
 
6
- CONFIG = YAML.load_file('config/kvj_config.yml')
7
+ # load config file from user defined constant of from default path
8
+ KVJ_CONFIG_PATH ||= 'config/kvj_config.yml'.freeze
9
+ KVJ_CONFIG = YAML.load_file(KVJ_CONFIG_PATH)
7
10
 
8
11
  class KVJ
9
- extend BaseManager
12
+ extend BaseMethods
13
+ extend MetaHashMethods
14
+
15
+ def self.connect_or_create(database)
16
+ directory = KVJ_CONFIG['base_directory']
17
+ new(database, directory)
18
+ end
10
19
 
11
20
  def self.create(database)
12
- directory = CONFIG['base_directory']
21
+ directory = KVJ_CONFIG['base_directory']
13
22
  return new(database, directory) unless FileConnector.exist(database, directory)
14
23
  STDERR.puts "Request to initialize a new database : #{database} but alread exists. "
15
24
  false
16
25
  end
17
26
 
18
27
  def self.connect(database)
19
- directory = CONFIG['base_directory']
28
+ directory = KVJ_CONFIG['base_directory']
20
29
  return new(database, directory) if FileConnector.exist(database, directory)
21
30
  STDERR.puts "Request to connect to database : #{database} but does not exists. "
22
31
  false
23
32
  end
24
33
 
25
- def write(key, value)
26
- @file_connector.grab_ex_lock
27
- hash = @file_connector.read
28
- hash[key] = value
29
- @file_connector.write(hash)
30
- return true
31
- ensure
32
- @file_connector.release_lock
33
- end
34
-
35
- def read(key)
36
- @file_connector.grab_sh_lock
37
- data = @file_connector.read
38
- return false unless key_exist(data, key, 'read')
39
- return data[key]
40
- ensure
41
- @file_connector.release_lock
42
- end
43
-
44
- def inspect_keys
45
- @file_connector.grab_sh_lock
46
- @file_connector.read.keys
47
- ensure
48
- @file_connector.release_lock
49
- end
50
-
51
- def delete(key)
52
- @file_connector.grab_ex_lock
53
- data = @file_connector.read
54
- return false unless key_exist(data, key, 'delete')
55
- data.delete(key)
56
- @file_connector.write(hash)
57
- ensure
58
- @file_connector.release_lock
59
- end
60
-
61
- alias []= write
62
- alias [] read
63
-
64
- def key_exist(data, key, action)
65
- return true if data.key?(key)
66
- STDERR.puts "Request to #{action} key : '#{key}' does not exist in database : '#{@database}' "
67
- false
68
- end
69
-
34
+ # the new constructor is hidden from user
35
+ # please use connect_or_create, create or connect instead
70
36
  def initialize(database, directory)
71
37
  @database = database
72
38
  @file_connector = FileConnector.new(database, directory)
73
39
  end
74
40
 
75
- private :key_exist
76
- private_class_method :new
41
+ # create dynamic methods for all Hash object native method
42
+ generate_hash_functions
43
+ private_class_method :new, :inheritage_hash_method, :generate_hash_functions
77
44
  end
@@ -0,0 +1,33 @@
1
+ module MetaHashMethods
2
+ def inheritage_hash_method(method, level)
3
+ define_method(method) do |*arg, &block|
4
+ begin
5
+ if level == :write
6
+ @file_connector.grab_ex_lock
7
+ else
8
+ @file_connector.grab_sh_lock
9
+ end
10
+ hash = @file_connector.read
11
+ return_value = hash.send(method, *arg, &block)
12
+ @file_connector.write(hash) if level == :write
13
+ return return_value
14
+ ensure
15
+ @file_connector.release_lock
16
+ end
17
+ end
18
+ end
19
+
20
+ def generate_hash_functions
21
+ methods = Hash.instance_methods - KVJ.instance_methods
22
+ write_methods = methods.select { |method| method =~ /=|!|delete/ }
23
+ read_only_methods = methods - write_methods
24
+
25
+ read_only_methods.each do |method|
26
+ inheritage_hash_method(method, :read)
27
+ end
28
+
29
+ write_methods.each do |method|
30
+ inheritage_hash_method(method, :write)
31
+ end
32
+ end
33
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kvj
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - RundongGao
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-19 00:00:00.000000000 Z
11
+ date: 2016-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -24,17 +24,17 @@ dependencies:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- description: A supper light connectionless key-value storage database provides ACID
28
- transcations for multiple programs.
27
+ description: Using your key-value data just like using Ruby Hash.
29
28
  email: asphinx423@gmail.com
30
29
  executables: []
31
30
  extensions: []
32
31
  extra_rdoc_files: []
33
32
  files:
34
- - lib/base_manager.rb
33
+ - lib/base_methods.rb
35
34
  - lib/file_connector.rb
36
35
  - lib/kvj.rb
37
36
  - lib/lock_manager.rb
37
+ - lib/meta_hash_methods.rb
38
38
  homepage: https://github.com/RundongGao/kvj
39
39
  licenses:
40
40
  - MIT
@@ -58,5 +58,6 @@ rubyforge_project:
58
58
  rubygems_version: 2.4.6
59
59
  signing_key:
60
60
  specification_version: 4
61
- summary: A supper light connectionless key-value storage database.
61
+ summary: A supper light connectionless key-value storage database provides ACID transcations
62
+ for multiple programs.
62
63
  test_files: []