steenzout-sqnc 1.0.2
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/README.textile +37 -0
- data/lib/sqnc/file/manager.rb +37 -0
- data/lib/sqnc/file/manager_file.rb +33 -0
- data/lib/sqnc/kyotocabinet/manager.rb +18 -0
- data/lib/sqnc/kyotocabinet/manager_kyotocabinet.rb +0 -0
- data/lib/sqnc/manager.rb +134 -0
- data/lib/sqnc/manager_file.rb +33 -0
- data/lib/sqnc/manager_kyotocabinet.rb +0 -0
- data/lib/sqnc/manager_tokyocabinet.rb +0 -0
- data/lib/sqnc/tokyocabinet/manager.rb +18 -0
- data/lib/sqnc/tokyocabinet/manager_tokyocabinet.rb +0 -0
- data/lib/steenzout-sqnc.rb +10 -0
- data/test/unit/sqnc/manager_test.rb +72 -0
- metadata +96 -0
data/README.textile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
h1. Introduction
|
2
|
+
|
3
|
+
This gem provides simple sequence management functionality.
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
h1. Configuration
|
8
|
+
|
9
|
+
You can only use one type of sequence manager implementation.
|
10
|
+
|
11
|
+
|
12
|
+
h2. implement sequence on a file
|
13
|
+
|
14
|
+
<pre><code>:steenzout-sqnc:
|
15
|
+
:implementation: :file
|
16
|
+
:sequences:
|
17
|
+
:seq1:
|
18
|
+
:location: '/opt/local/steenzout/sequence1'
|
19
|
+
:seq2:
|
20
|
+
:location: '/opt/local/steenzout/sequence2'
|
21
|
+
:step: 100
|
22
|
+
:offset: 100
|
23
|
+
</code></pre>
|
24
|
+
|
25
|
+
|
26
|
+
h2. implement sequence on a TokyoCabinet database
|
27
|
+
|
28
|
+
<pre><code>:steenzout-sqnc:
|
29
|
+
:implementation: :tokyocabinet
|
30
|
+
:sequences:
|
31
|
+
:seq1:
|
32
|
+
:location: '/opt/local/steenzout/sequence1.tch'
|
33
|
+
:seq2:
|
34
|
+
:location: '/opt/local/steenzout/sequence2.tch'
|
35
|
+
:step: 100
|
36
|
+
:offset: 100
|
37
|
+
</code></pre>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Steenzout
|
2
|
+
|
3
|
+
class SequenceManager
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def self.increment_and_store name
|
8
|
+
|
9
|
+
open(@@config[:sequences][name][:location], File::RDWR|File::CREAT, 0644) do |f|
|
10
|
+
|
11
|
+
begin
|
12
|
+
|
13
|
+
p @@config[:implementation]
|
14
|
+
f.flock(File::LOCK_EX)
|
15
|
+
|
16
|
+
value = @@sequences[name] # get value from memory
|
17
|
+
p "from memory #{value}"
|
18
|
+
value = f.readline().to_i if @@sequences[name].nil? rescue EOFError # get value from file
|
19
|
+
p "from file #{value}"
|
20
|
+
value ||= @@config[:sequences][name][:offset] # initialize value to offset if none of the above had a value
|
21
|
+
p "value=#{value}, offset=#{@@config[:sequences][name][:offset]}"
|
22
|
+
value += @@config[:sequences][name][:step]
|
23
|
+
@@sequences[name] = value
|
24
|
+
p "newvalue=#{value}, increment=#{@@config[:sequences][name][:step]}"
|
25
|
+
f << value
|
26
|
+
return value
|
27
|
+
|
28
|
+
ensure
|
29
|
+
f.flock(File::LOCK_UN)
|
30
|
+
f.close
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Steenzout
|
2
|
+
|
3
|
+
class SequenceManager
|
4
|
+
|
5
|
+
@@sequences = {}
|
6
|
+
|
7
|
+
def self.load_from_tokyocabinet
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.load_from_yaml
|
12
|
+
config = Steenzout::ConfigurationManager.configuration_for_gem 'steenzout-sqnc'
|
13
|
+
@@sequences = config[:sequences]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.reload
|
17
|
+
config = Steenzout::ConfigurationManager.configuration_for_gem 'steenzout-sqnc'
|
18
|
+
load_from_yaml if config[:method] == 'yaml'
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def self.list_sequences
|
23
|
+
@@sequences
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.increment_sequence name
|
27
|
+
@@sequences[name] = @@sequences[name] + 1
|
28
|
+
end
|
29
|
+
|
30
|
+
reload
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
File without changes
|
data/lib/sqnc/manager.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
module Steenzout
|
2
|
+
|
3
|
+
class SequenceManager
|
4
|
+
|
5
|
+
class << self; attr_accessor :sequences end
|
6
|
+
class << self; attr_accessor :implementations end
|
7
|
+
|
8
|
+
@config = nil
|
9
|
+
@sequences = {}
|
10
|
+
@implementations = [:file]
|
11
|
+
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
# Validates gem configuration and initializes the class' sequences.
|
16
|
+
#
|
17
|
+
def self.load_sequences
|
18
|
+
|
19
|
+
@config[:sequences].each_key do |name|
|
20
|
+
|
21
|
+
|
22
|
+
# validate :location
|
23
|
+
|
24
|
+
raise ArgumentError.new \
|
25
|
+
"Sequence file location #{@config[:sequences][name][:location]} needs to be defined!" \
|
26
|
+
if !@config[:sequences][name].has_key? :location
|
27
|
+
|
28
|
+
|
29
|
+
# validate :offset
|
30
|
+
|
31
|
+
@config[:sequences][name][:offset] ||= 0
|
32
|
+
raise ArgumentError.new \
|
33
|
+
"Offset value #{@config[:sequences][name][:offset]} for #{name} sequence needs to be >= 0!" \
|
34
|
+
if @config[:sequences][name][:offset] < 0
|
35
|
+
|
36
|
+
|
37
|
+
# validate :step
|
38
|
+
|
39
|
+
@config[:sequences][name][:step] ||= 1
|
40
|
+
raise ArgumentError.new \
|
41
|
+
"Step value #{@config[:sequences][name][:step]} for #{name} sequence needs to be > 0!" \
|
42
|
+
if @config[:sequences][name][:step] <= 0
|
43
|
+
|
44
|
+
|
45
|
+
# initialize sequence
|
46
|
+
|
47
|
+
@sequences[name] = nil
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
public
|
56
|
+
|
57
|
+
# Returns the list of allowed sequence management implementations.
|
58
|
+
#
|
59
|
+
def self.implementations
|
60
|
+
@implementations
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
# Validates the configuration and loads the class with the given implementation.
|
66
|
+
#
|
67
|
+
def self.load
|
68
|
+
|
69
|
+
# retrieve configuration
|
70
|
+
|
71
|
+
@config = Steenzout::ConfigurationManager.configuration_for_gem 'steenzout-sqnc'
|
72
|
+
@config[:sequences] ||= {}
|
73
|
+
|
74
|
+
|
75
|
+
# validation
|
76
|
+
|
77
|
+
if !@config.has_key? :implementation or @config[:implementation].nil?
|
78
|
+
error_message = "implementation property is missing from the configuration file!"
|
79
|
+
raise ArgumentError.new error_message
|
80
|
+
end
|
81
|
+
|
82
|
+
raise ArgumentError.new "there is no #{@config[:implementation]} implementation!" if
|
83
|
+
!@implementations.include? @config[:implementation] or
|
84
|
+
!File.exist? "#{File.dirname(__FILE__)}/#{@config[:implementation]}/manager.rb"
|
85
|
+
|
86
|
+
|
87
|
+
# load implementation
|
88
|
+
|
89
|
+
require "#{File.dirname(__FILE__)}/#{@config[:implementation]}/manager"
|
90
|
+
|
91
|
+
|
92
|
+
# load sequences
|
93
|
+
|
94
|
+
load_sequences
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
# Returns the current in-memory value for this sequence.
|
101
|
+
# WARNING: if the sequence hasn't been used yet, a nil value will be returned.
|
102
|
+
#
|
103
|
+
# @param name: the sequence name.
|
104
|
+
#
|
105
|
+
def self.current_value name
|
106
|
+
|
107
|
+
raise ArgumentError.new "The sequence #{name} doesn't exist!" if !@sequences.has_key? name
|
108
|
+
|
109
|
+
return @sequences[name]
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
# Increments and returns the given sequence by step (or offset + step if it has never been used before).
|
116
|
+
#
|
117
|
+
# @param name: the sequence name.
|
118
|
+
#
|
119
|
+
def self.increment name
|
120
|
+
raise ArgumentError.new "The sequence #{name} doesn't exist!" if !@sequences.has_key? name
|
121
|
+
self.increment_and_store name
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
# Returns a list of the current sequence names being managed.
|
126
|
+
#
|
127
|
+
def self.sequences
|
128
|
+
@sequences.each_key {|name|
|
129
|
+
yield name
|
130
|
+
}
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Steenzout
|
2
|
+
|
3
|
+
class SequenceManager
|
4
|
+
|
5
|
+
@@sequences = {}
|
6
|
+
|
7
|
+
def self.load_from_tokyocabinet
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.load_from_yaml
|
12
|
+
config = Steenzout::ConfigurationManager.configuration_for_gem 'steenzout-sqnc'
|
13
|
+
@@sequences = config[:sequences]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.reload
|
17
|
+
config = Steenzout::ConfigurationManager.configuration_for_gem 'steenzout-sqnc'
|
18
|
+
load_from_yaml if config[:method] == 'yaml'
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def self.list_sequences
|
23
|
+
@@sequences
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.increment_sequence name
|
27
|
+
@@sequences[name] = @@sequences[name] + 1
|
28
|
+
end
|
29
|
+
|
30
|
+
reload
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'steenzout-cfg'
|
4
|
+
|
5
|
+
# loading development environment configuration settings
|
6
|
+
Steenzout::ConfigurationManager.load 'config/development.yaml'
|
7
|
+
|
8
|
+
# load gem
|
9
|
+
require 'lib/steenzout-sqnc'
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
class TestSequenceManager < Test::Unit::TestCase
|
14
|
+
|
15
|
+
def setup
|
16
|
+
@config = Steenzout::ConfigurationManager.configuration_for_gem 'steenzout-sqnc'
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
@config[:sequences].each_key {|name|
|
21
|
+
sequence_file = @config[:sequences][name][:location]
|
22
|
+
File.delete sequence_file if File.exist? sequence_file
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
def __do_increment_tests
|
29
|
+
|
30
|
+
assert_equal 1, Steenzout::SequenceManager::increment(:seq1), @config[:implementation]
|
31
|
+
assert_equal 2, Steenzout::SequenceManager::increment(:seq1), @config[:implementation]
|
32
|
+
|
33
|
+
# invalid sequence name
|
34
|
+
assert_raises ArgumentError do
|
35
|
+
Steenzout::SequenceManager::increment 'seq1'
|
36
|
+
end
|
37
|
+
assert_raises ArgumentError do
|
38
|
+
Steenzout::SequenceManager::increment 'unknown'
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
def test_increment
|
46
|
+
|
47
|
+
# run tests for all implementations
|
48
|
+
Steenzout::SequenceManager.implementations {|implementation|
|
49
|
+
|
50
|
+
# override configuration
|
51
|
+
@config[:implementation] = implementation
|
52
|
+
|
53
|
+
# load new sequence manager implementation
|
54
|
+
Steenzout::SequenceManager.load
|
55
|
+
|
56
|
+
# run tests
|
57
|
+
__do_increment_tests
|
58
|
+
}
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
def test_sequences
|
65
|
+
|
66
|
+
sequence_names = []
|
67
|
+
Steenzout::SequenceManager.sequences {|name| sequence_names << name}
|
68
|
+
assert_equal([:seq1, :seq2], sequence_names)
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: steenzout-sqnc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 1.0.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- steenzout
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-03-17 00:00:00 -06:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: steenzout-cfg
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 19
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
- 2
|
34
|
+
version: 1.0.2
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
description: |
|
38
|
+
This gem provides simple sequence management functionality.
|
39
|
+
|
40
|
+
email:
|
41
|
+
executables: []
|
42
|
+
|
43
|
+
extensions: []
|
44
|
+
|
45
|
+
extra_rdoc_files:
|
46
|
+
- README.textile
|
47
|
+
files:
|
48
|
+
- lib/sqnc/file/manager.rb
|
49
|
+
- lib/sqnc/file/manager_file.rb
|
50
|
+
- lib/sqnc/kyotocabinet/manager.rb
|
51
|
+
- lib/sqnc/kyotocabinet/manager_kyotocabinet.rb
|
52
|
+
- lib/sqnc/manager.rb
|
53
|
+
- lib/sqnc/manager_file.rb
|
54
|
+
- lib/sqnc/manager_kyotocabinet.rb
|
55
|
+
- lib/sqnc/manager_tokyocabinet.rb
|
56
|
+
- lib/sqnc/tokyocabinet/manager.rb
|
57
|
+
- lib/sqnc/tokyocabinet/manager_tokyocabinet.rb
|
58
|
+
- lib/steenzout-sqnc.rb
|
59
|
+
- README.textile
|
60
|
+
- test/unit/sqnc/manager_test.rb
|
61
|
+
has_rdoc: true
|
62
|
+
homepage: https://github.com/steenzout/steenzout-cfg
|
63
|
+
licenses: []
|
64
|
+
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options: []
|
67
|
+
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
hash: 3
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
version: "0"
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
requirements: []
|
89
|
+
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 1.6.2
|
92
|
+
signing_key:
|
93
|
+
specification_version: 3
|
94
|
+
summary: Steenzout sequence management gem.
|
95
|
+
test_files:
|
96
|
+
- test/unit/sqnc/manager_test.rb
|