ssd 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +24 -16
- data/bin/console +0 -4
- data/bin/repl.rb +41 -0
- data/lib/ssd.rb +29 -30
- data/lib/ssd/version.rb +1 -1
- data/specs/ssd_spec.rb +22 -12
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deeb33a039ae9fe9134ce820c77d31dbebdac967
|
4
|
+
data.tar.gz: a5ff690e9e4104f532d4f05065899ea5cd49c45c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2be1fd3a716666afba008493a4c177315682e46afc679d3099058d512c7b04579420c012bac67b96ca1bc8b832c3cc87e644bd2f127d3bcf896f3588899cb15a
|
7
|
+
data.tar.gz: 0ed3aed894aefe020752028fb59901bb983c205c9746ceeb40ce7f5cfbd92f23eeb08c9fea7c9955e58d014fcfd7644130f84a2c8a120dd99a9d000eafac1bcc
|
data/README.md
CHANGED
@@ -4,18 +4,23 @@ SSD (Simply-Smart-Data) is an append-only, file-based, immutable key-value store
|
|
4
4
|
|
5
5
|
Key Features
|
6
6
|
=================
|
7
|
-
- Scalable file
|
8
|
-
- Immutable (timestamped inserts).
|
9
|
-
- Fault tolerance (transactional operations).
|
10
|
-
- Measurably low technical debt (consciously clean small-sized library that wouldn't complect your codebase).
|
11
|
-
- Zero external dependencies
|
12
|
-
- Schemaless (easily meets your Application evolution needs).
|
13
|
-
- Append-only (easily keeps track of Applications Data timeline).
|
14
|
-
- Key-based rolling-forward\rolling-back
|
15
|
-
-
|
16
|
-
|
17
|
-
|
18
|
-
|
7
|
+
- **Scalable file**-based design (each key gets its own file).
|
8
|
+
- **Immutable** (timestamped inserts as **accountants don't use erasers, otherwise they go to jail**).
|
9
|
+
- **Fault tolerance** (transactional operations).
|
10
|
+
- **Measurably low technical debt** (consciously clean small-sized library that wouldn't complect your codebase).
|
11
|
+
- **Zero external dependencies**.
|
12
|
+
- **Schemaless** (easily meets your Application evolution needs).
|
13
|
+
- **Append-only** (easily keeps track of Applications Data timeline).
|
14
|
+
- **Key-based rolling-forward\rolling-back**.
|
15
|
+
- **Super easy to learn and use** (up & running in mins).
|
16
|
+
|
17
|
+
TODO
|
18
|
+
======
|
19
|
+
- **Strict Security-first policy SHA256 Encryption** (implment your own logging for intercepting keys required for decrypting data).
|
20
|
+
- **JSON objects** (based on ruby's native pstore).
|
21
|
+
- **RESTful HTTP/JSON API Endpoint**.
|
22
|
+
- REPL console
|
23
|
+
- Server Web-based Admin Interface
|
19
24
|
|
20
25
|
Use Cases
|
21
26
|
==========
|
@@ -28,14 +33,17 @@ module MyApp
|
|
28
33
|
class User
|
29
34
|
include SSD
|
30
35
|
attr_accessor :id # ssd key
|
36
|
+
|
37
|
+
def initialize id
|
38
|
+
@ssd = id
|
39
|
+
end
|
31
40
|
end
|
32
41
|
|
33
42
|
class API < Sinatra::Base
|
34
43
|
get '/' do
|
35
|
-
@user = User.new # Initialize an object form any Class that `include SSD`
|
36
|
-
@user.
|
37
|
-
@user.
|
38
|
-
User.ssd("generated_id") # Later to read it via Class.ssd(id)
|
44
|
+
@user = User.new("generated_id") # Initialize an object form any Class that `include SSD` and assign it a :ssd key
|
45
|
+
@user.append! # Do an `append!` operation and viola! DONE
|
46
|
+
@user = User.ssd("generated_id") # Afterwards read it via Class.ssd(:ssd)
|
39
47
|
end
|
40
48
|
end
|
41
49
|
end
|
data/bin/console
CHANGED
@@ -6,9 +6,5 @@ require "ssd"
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
9
|
require "irb"
|
14
10
|
IRB.start
|
data/bin/repl.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
puts "SSD Console -h for help"
|
2
|
+
puts " "
|
3
|
+
puts " "
|
4
|
+
|
5
|
+
def colorize(text, color_code)
|
6
|
+
"#{color_code}#{text}e[0m"
|
7
|
+
end
|
8
|
+
|
9
|
+
def red(text); colorize(text, "e[31m"); end
|
10
|
+
def green(text); colorize(text, "e[32m"); end
|
11
|
+
|
12
|
+
# Actual work
|
13
|
+
puts 'Importing categories [ ' + green('DONE') + ' ]'
|
14
|
+
# Actual work
|
15
|
+
puts 'Importing tags [' + red('FAILED') + ']'
|
16
|
+
|
17
|
+
# Handle the input, this would probably run some method
|
18
|
+
# as a part of the DSL you'd have to create. Place this
|
19
|
+
# repl as your command line interface to your service.
|
20
|
+
def handle_input(input)
|
21
|
+
result = eval(input)
|
22
|
+
puts(" => #{result}")
|
23
|
+
end
|
24
|
+
|
25
|
+
# This is a lambda that runs the content of the block
|
26
|
+
# after the input is chomped.
|
27
|
+
repl = -> prompt do
|
28
|
+
begin
|
29
|
+
print prompt
|
30
|
+
handle_input(gets.chomp!)
|
31
|
+
rescue "Error"
|
32
|
+
raise "ERROR"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# After evaling and returning, fire up the prompt lambda
|
37
|
+
# again, this loops after every input and exits with
|
38
|
+
# exit or a HUP.
|
39
|
+
loop do
|
40
|
+
repl["SSD> "]
|
41
|
+
end
|
data/lib/ssd.rb
CHANGED
@@ -23,12 +23,12 @@ module SSD
|
|
23
23
|
@@ssd_name = base.new.class.to_s.downcase
|
24
24
|
end
|
25
25
|
|
26
|
-
attr_accessor :
|
26
|
+
attr_accessor :ssd
|
27
27
|
|
28
|
-
def
|
29
|
-
@
|
28
|
+
def ssd= value
|
29
|
+
@ssd = value
|
30
30
|
FileUtils::mkdir_p ".ssd/#{@@ssd_name}"
|
31
|
-
@@ssd_path = ".ssd/#{@@ssd_name}/#{@
|
31
|
+
@@ssd_path = ".ssd/#{@@ssd_name}/#{@ssd}.ssd"
|
32
32
|
@@ssd_db = PStore.new @@ssd_path, true
|
33
33
|
@@ssd_db.ultra_safe = true
|
34
34
|
@@ssd_db.transaction(true) {}
|
@@ -44,14 +44,13 @@ module SSD
|
|
44
44
|
|
45
45
|
def []=
|
46
46
|
begin
|
47
|
-
if !@
|
47
|
+
if !@ssd.nil? then
|
48
48
|
@@ssd_db.transaction do
|
49
|
-
#todo should be somthing like??? timestamp instead of
|
50
|
-
#@@ssd_db[id.to_sym] = self
|
49
|
+
#todo should be somthing like??? timestamp instead of ssd as a key?? and use .last while reading
|
51
50
|
@@ssd_db[Time.now.utc.to_s + "_" + Random.new_seed.to_s ] = self
|
52
51
|
end
|
53
52
|
else
|
54
|
-
raise 'ssd
|
53
|
+
raise 'ssd key can not be nil. see more (documentation url)'
|
55
54
|
end
|
56
55
|
end
|
57
56
|
end
|
@@ -72,50 +71,50 @@ module SSD
|
|
72
71
|
#@@ssd_db
|
73
72
|
end
|
74
73
|
|
75
|
-
def setup
|
76
|
-
@@
|
74
|
+
def setup ssd
|
75
|
+
@@ssd = ssd
|
77
76
|
FileUtils::mkdir_p ".ssd/#{@@ssd_name}"
|
78
|
-
@@ssd_path = ".ssd/#{@@ssd_name}/#{@@
|
77
|
+
@@ssd_path = ".ssd/#{@@ssd_name}/#{@@ssd}.ssd"
|
79
78
|
@@ssd_db = PStore.new @@ssd_path, true
|
80
79
|
@@ssd_db.ultra_safe = true
|
81
80
|
@@ssd_db.transaction(true) {}
|
82
81
|
return @@ssd_db
|
83
82
|
end
|
84
83
|
|
85
|
-
def last_key
|
86
|
-
setup
|
84
|
+
def last_key ssd
|
85
|
+
setup ssd
|
87
86
|
last_key = @@ssd_db.transaction true do
|
88
87
|
@@ssd_db.roots
|
89
88
|
end
|
90
89
|
last_key.last
|
91
90
|
end
|
92
91
|
|
93
|
-
def keys
|
94
|
-
setup
|
92
|
+
def keys ssd
|
93
|
+
setup ssd
|
95
94
|
@@ssd_db.transaction true do
|
96
95
|
@@ssd_db.roots
|
97
96
|
end
|
98
97
|
end
|
99
98
|
|
100
|
-
def key?
|
101
|
-
setup
|
99
|
+
def key? ssd
|
100
|
+
setup ssd
|
102
101
|
@@ssd_db.transaction true do
|
103
|
-
@@ssd_db.root?
|
102
|
+
@@ssd_db.root? ssd
|
104
103
|
end
|
105
104
|
end
|
106
105
|
|
107
106
|
alias exists? key?
|
108
107
|
|
109
|
-
def []
|
110
|
-
setup
|
108
|
+
def [] ssd
|
109
|
+
setup ssd
|
111
110
|
@@ssd_db.transaction true do
|
112
|
-
@@ssd_db[
|
111
|
+
@@ssd_db[ssd]
|
113
112
|
end
|
114
113
|
end
|
115
114
|
|
116
|
-
def ssd
|
117
|
-
#TODO add raise if
|
118
|
-
last_key = (last_key
|
115
|
+
def ssd ssd
|
116
|
+
#TODO add raise if ssd.nil?
|
117
|
+
last_key = (last_key ssd)
|
119
118
|
@@ssd_db.transaction true do
|
120
119
|
@@ssd_db.fetch last_key
|
121
120
|
end
|
@@ -124,20 +123,20 @@ module SSD
|
|
124
123
|
#alias get fetch
|
125
124
|
#alias find fetch
|
126
125
|
|
127
|
-
def delete *
|
126
|
+
def delete *ssds
|
128
127
|
@@ssd_db.transaction do
|
129
|
-
|
130
|
-
@@ssd_db.delete
|
128
|
+
ssds.each do |ssd|
|
129
|
+
@@ssd_db.delete ssd.to_sym
|
131
130
|
end
|
132
131
|
@@ssd_db.commit
|
133
132
|
end
|
134
133
|
end
|
135
134
|
alias remove delete
|
136
135
|
|
137
|
-
def count
|
138
|
-
setup
|
136
|
+
def count ssd
|
137
|
+
setup ssd
|
139
138
|
$log.info("count")
|
140
|
-
return keys(
|
139
|
+
return keys(ssd).count
|
141
140
|
end
|
142
141
|
end
|
143
142
|
|
data/lib/ssd/version.rb
CHANGED
data/specs/ssd_spec.rb
CHANGED
@@ -3,21 +3,31 @@ require_relative "./spec_helper"
|
|
3
3
|
describe SSD do
|
4
4
|
|
5
5
|
before do
|
6
|
-
|
6
|
+
|
7
|
+
class User
|
7
8
|
include SSD
|
8
|
-
attr_accessor :first_name, :last_name, :location
|
9
|
+
attr_accessor :id, :first_name, :last_name, :location
|
10
|
+
|
11
|
+
def initialize id=""
|
12
|
+
@ssd = id
|
13
|
+
end
|
14
|
+
|
15
|
+
def id= id
|
16
|
+
@id = id
|
17
|
+
@ssd = @id
|
18
|
+
end
|
9
19
|
end
|
10
20
|
|
11
|
-
@
|
21
|
+
@generated_ssd = Random.new.seed
|
12
22
|
end
|
13
23
|
|
14
24
|
describe "#append!" do
|
15
25
|
it "saves an object to the database" do
|
16
26
|
#skip
|
17
27
|
@user = User.new
|
18
|
-
@user.
|
28
|
+
@user.ssd = @generated_ssd
|
19
29
|
@user.append!
|
20
|
-
@user.
|
30
|
+
@user.ssd.must_equal @generated_ssd
|
21
31
|
end
|
22
32
|
end
|
23
33
|
|
@@ -25,10 +35,10 @@ describe SSD do
|
|
25
35
|
it "fetches an object from the database" do
|
26
36
|
# skip
|
27
37
|
@user = User.new
|
28
|
-
@user.
|
38
|
+
@user.ssd = @generated_ssd
|
29
39
|
@user.append!
|
30
|
-
user = User.ssd(@
|
31
|
-
user.
|
40
|
+
user = User.ssd(@generated_ssd)
|
41
|
+
user.ssd.must_equal @generated_ssd
|
32
42
|
end
|
33
43
|
end
|
34
44
|
|
@@ -36,19 +46,19 @@ describe SSD do
|
|
36
46
|
it "it keeps adding new objects" do
|
37
47
|
@user = User.new
|
38
48
|
|
39
|
-
@user.
|
49
|
+
@user.ssd = @generated_ssd
|
40
50
|
@user.location = "Egypt"
|
41
51
|
@user.append!
|
42
52
|
|
43
|
-
@user = User.ssd(@
|
53
|
+
@user = User.ssd(@generated_ssd)
|
44
54
|
@user.location = "Brazil"
|
45
55
|
@user.append!
|
46
56
|
|
47
|
-
@user = User.ssd(@
|
57
|
+
@user = User.ssd(@generated_ssd)
|
48
58
|
@user.location = "France"
|
49
59
|
@user.append!
|
50
60
|
|
51
|
-
User.count(@
|
61
|
+
User.count(@generated_ssd).must_equal 3
|
52
62
|
end
|
53
63
|
end
|
54
64
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ssd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zotherstupidguy
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -67,6 +67,7 @@ files:
|
|
67
67
|
- README.md
|
68
68
|
- Rakefile
|
69
69
|
- bin/console
|
70
|
+
- bin/repl.rb
|
70
71
|
- bin/setup
|
71
72
|
- lib/encrypt.rb
|
72
73
|
- lib/ssd.rb
|