dotdot 0.1.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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.md +25 -0
- data/Rakefile +1 -0
- data/dotdot.gemspec +26 -0
- data/lib/dotdot/base.rb +159 -0
- data/lib/dotdot/version.rb +3 -0
- data/lib/dotdot.rb +5 -0
- metadata +75 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Dotdot
|
2
|
+
=======
|
3
|
+
|
4
|
+
A database handler which parses a key-value-group pair.
|
5
|
+
|
6
|
+
Keys would look like:
|
7
|
+
|
8
|
+
* databases.default
|
9
|
+
* database.mydb.name
|
10
|
+
* database.mydb.host
|
11
|
+
* cache.default
|
12
|
+
* cache.local.host
|
13
|
+
|
14
|
+
Keys are arbitrary in nature. Keys are paired with values.
|
15
|
+
|
16
|
+
* databases.default => 'development'
|
17
|
+
|
18
|
+
A key database default with 'development' as default values
|
19
|
+
|
20
|
+
* database.hosts => 'host1.local,host2.local,host3.local'
|
21
|
+
|
22
|
+
A key holding database hosts which is a multiple value key.
|
23
|
+
|
24
|
+
Key-value pairs also have groups. Groups identify collections to add
|
25
|
+
more uniqueness and isolation to keys and values.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/dotdot.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "dotdot/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "dotdot"
|
7
|
+
s.version = Dotdot::VERSION
|
8
|
+
s.authors = ["Jan Mendoza"]
|
9
|
+
s.email = ["poymode@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Parking this gem}
|
12
|
+
s.description = %q{Parking this gem}
|
13
|
+
|
14
|
+
s.rubyforge_project = "dotdot"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.add_dependency "sqlite3"
|
21
|
+
s.add_dependency "sequel"
|
22
|
+
|
23
|
+
# specify any dependencies here; for example:
|
24
|
+
# s.add_development_dependency "rspec"
|
25
|
+
# s.add_runtime_dependency "rest-client"
|
26
|
+
end
|
data/lib/dotdot/base.rb
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
module Dotdot
|
2
|
+
class Base
|
3
|
+
attr_reader :database
|
4
|
+
|
5
|
+
def initialize(object)
|
6
|
+
@object = object
|
7
|
+
@database = nil
|
8
|
+
@sql_options = { :logger => @object.logger, :sql_log_level => :info }
|
9
|
+
|
10
|
+
if @object.options[:verbose]
|
11
|
+
@sql_options[:sql_log_level] = :debug
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def boot
|
16
|
+
@database = Sequel.sqlite(@object.db_path, @sql_options)
|
17
|
+
@group = ""
|
18
|
+
@prefix_stack = []
|
19
|
+
|
20
|
+
@dataset = @database[:cablingdatas]
|
21
|
+
end
|
22
|
+
|
23
|
+
def final_key(key)
|
24
|
+
unless @prefix_stack.empty?
|
25
|
+
@prefix_stack.push(key)
|
26
|
+
key = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
key ||= @prefix_stack.join('.')
|
30
|
+
end
|
31
|
+
|
32
|
+
def set(key, value, group = nil)
|
33
|
+
group ||= @group
|
34
|
+
key = final_key(key)
|
35
|
+
|
36
|
+
@dataset.insert(:key => key, :value => value, :group => group)
|
37
|
+
|
38
|
+
stack_pop
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete_key(key, group = nil)
|
42
|
+
group ||= @group
|
43
|
+
|
44
|
+
key = final_key(key)
|
45
|
+
|
46
|
+
@dataset.filter(:key => key, :group => group).delete
|
47
|
+
stack_pop
|
48
|
+
end
|
49
|
+
|
50
|
+
def update(key, value, group = nil)
|
51
|
+
group ||= @group
|
52
|
+
key = final_key(key)
|
53
|
+
|
54
|
+
@dataset.filter(:key => key, :group => group).update(:value => value)
|
55
|
+
|
56
|
+
stack_pop
|
57
|
+
end
|
58
|
+
|
59
|
+
def group(group = nil, &block)
|
60
|
+
@group = group
|
61
|
+
|
62
|
+
@database.transaction do
|
63
|
+
yield
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def globals(&block)
|
68
|
+
@group = "globals"
|
69
|
+
|
70
|
+
@database.transaction do
|
71
|
+
yield
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def prefix(prefix, &block)
|
76
|
+
@prefix_stack.push(prefix)
|
77
|
+
yield
|
78
|
+
|
79
|
+
stack_pop
|
80
|
+
end
|
81
|
+
|
82
|
+
def stack_pop
|
83
|
+
@prefix_stack.pop
|
84
|
+
end
|
85
|
+
|
86
|
+
def has_key?(key, group)
|
87
|
+
group ||= @object.group.to_s
|
88
|
+
|
89
|
+
val = @dataset.where(:key => key, :group => group).count
|
90
|
+
|
91
|
+
if val == 0
|
92
|
+
val = @dataset.where(:key => key, :group => "globals").count
|
93
|
+
|
94
|
+
val == 0 ? false : true
|
95
|
+
else
|
96
|
+
true
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def get(key, group = nil)
|
101
|
+
group ||= @object.group.to_s
|
102
|
+
|
103
|
+
val = @dataset.where(:key => key, :group => group)
|
104
|
+
|
105
|
+
if val.empty?
|
106
|
+
val = @dataset.where(:key => key, :group => "globals")
|
107
|
+
end
|
108
|
+
|
109
|
+
if val.count > 0
|
110
|
+
val.first[:value]
|
111
|
+
else
|
112
|
+
raise "key \'#{key}\' cannot be found!"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def get_if_key_exists(key, group = nil)
|
117
|
+
group ||= @object.group.to_s
|
118
|
+
|
119
|
+
get(key, group) if has_key?(key, group)
|
120
|
+
end
|
121
|
+
|
122
|
+
def get_children(key, group = nil)
|
123
|
+
group ||= @object.group.to_s
|
124
|
+
values = []
|
125
|
+
|
126
|
+
res = @dataset.where(:key.like("#{key}%"), :group => group)
|
127
|
+
|
128
|
+
if res.empty?
|
129
|
+
res = @dataset.where(:key.like("#{key}%"), :group => "globals")
|
130
|
+
end
|
131
|
+
|
132
|
+
key = key.split('.')
|
133
|
+
|
134
|
+
res.each do |r|
|
135
|
+
res_key = r[:key].split('.')
|
136
|
+
res_key = (res_key - key).shift
|
137
|
+
values.push(res_key)
|
138
|
+
end
|
139
|
+
|
140
|
+
if values.count > 0
|
141
|
+
values & values
|
142
|
+
else
|
143
|
+
raise "no values for \'#{key}\'!"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def create_table_if_needed
|
148
|
+
if @database.tables.include? :cablingdatas
|
149
|
+
@database.drop_table :cablingdatas
|
150
|
+
end
|
151
|
+
|
152
|
+
@database.create_table :cablingdatas do
|
153
|
+
String :key
|
154
|
+
String :value
|
155
|
+
String :group
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
data/lib/dotdot.rb
ADDED
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dotdot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jan Mendoza
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-26 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: sqlite3
|
16
|
+
requirement: &14254540 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *14254540
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: sequel
|
27
|
+
requirement: &14253800 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *14253800
|
36
|
+
description: Parking this gem
|
37
|
+
email:
|
38
|
+
- poymode@gmail.com
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- Gemfile
|
45
|
+
- README.md
|
46
|
+
- Rakefile
|
47
|
+
- dotdot.gemspec
|
48
|
+
- lib/dotdot.rb
|
49
|
+
- lib/dotdot/base.rb
|
50
|
+
- lib/dotdot/version.rb
|
51
|
+
homepage: ''
|
52
|
+
licenses: []
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options: []
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
requirements: []
|
70
|
+
rubyforge_project: dotdot
|
71
|
+
rubygems_version: 1.8.10
|
72
|
+
signing_key:
|
73
|
+
specification_version: 3
|
74
|
+
summary: Parking this gem
|
75
|
+
test_files: []
|