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 ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in dotdot.gemspec
4
+ gemspec
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
@@ -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
@@ -0,0 +1,3 @@
1
+ module Dotdot
2
+ VERSION = "0.1.0"
3
+ end
data/lib/dotdot.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "dotdot/version"
2
+
3
+ module Dotdot
4
+ autoload :Base, 'dotdot/base'
5
+ end
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: []