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 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