steenzout-sqnc 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,18 @@
1
+ require 'kyotocabinet'
2
+
3
+ include KyotoCabinet
4
+
5
+
6
+
7
+ module Steenzout
8
+
9
+ class SequenceManager
10
+
11
+ private
12
+
13
+ def self.increment_and_store name
14
+ raise ArgumentError "KyotoCabinet implementation is not ready!"
15
+ end
16
+
17
+ end
18
+ end
File without changes
@@ -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
@@ -0,0 +1,18 @@
1
+ require 'tokyocabinet'
2
+
3
+ include TokyoCabinet
4
+
5
+
6
+
7
+ module Steenzout
8
+
9
+ class SequenceManager
10
+
11
+ private
12
+
13
+ def self.increment_and_store name
14
+ raise ArgumentError "TokyoCabinet implementation is not ready!"
15
+ end
16
+
17
+ end
18
+ end
File without changes
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'steenzout-cfg'
3
+
4
+ module Steenzout
5
+
6
+ autoload :SequenceManager, "#{File.dirname(__FILE__)}/sqnc/manager"
7
+
8
+ end
9
+
10
+ Steenzout::SequenceManager.load
@@ -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