wolverine 0.2.3 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
data/lib/wolverine.rb CHANGED
@@ -7,7 +7,7 @@ require 'wolverine/script'
7
7
  require 'wolverine/path_component'
8
8
  require 'wolverine/lua_error'
9
9
 
10
- module Wolverine
10
+ class Wolverine
11
11
  # Returns the configuration object for reading and writing
12
12
  # configuration values.
13
13
  #
@@ -44,10 +44,36 @@ module Wolverine
44
44
  super
45
45
  end
46
46
 
47
+ def initialize(config = nil)
48
+ @config = config
49
+ end
50
+
51
+ def config
52
+ @config || self.class.config
53
+ end
54
+
55
+ def redis
56
+ config.redis
57
+ end
58
+
59
+ def reset!
60
+ @root_directory = nil
61
+ end
62
+
63
+ def method_missing sym, *args
64
+ root_directory.send(sym, *args)
65
+ rescue PathComponent::MissingTemplate
66
+ super
67
+ end
68
+
47
69
  private
48
70
 
49
71
  def self.root_directory
50
72
  @root_directory ||= PathComponent.new(config.script_path)
51
73
  end
52
74
 
75
+ def root_directory
76
+ @root_directory ||= PathComponent.new(config.script_path, {:config => config, :redis => redis})
77
+ end
78
+
53
79
  end
@@ -1,4 +1,4 @@
1
- module Wolverine
1
+ class Wolverine
2
2
  class Configuration < Struct.new(:redis, :script_path, :instrumentation)
3
3
 
4
4
  # @return [Redis] the redis connection actively in use by Wolverine
@@ -1,11 +1,11 @@
1
- module Wolverine
1
+ class Wolverine
2
2
  # Reformats errors raised by redis representing failures while executing
3
3
  # a lua script. The default errors have confusing messages and backtraces,
4
4
  # and a type of +RuntimeError+. This class improves the message and
5
5
  # modifies the backtrace to include the lua script itself in a reasonable
6
6
  # way.
7
7
  class LuaError < StandardError
8
- PATTERN = /ERR Error (compiling|running) script \(.*?\): \[.*?\]:(\d+): (.*)/
8
+ PATTERN = /ERR Error (compiling|running) script \(.*?\): .*?:(\d+): (.*)/
9
9
  WOLVERINE_LIB_PATH = File.expand_path('../../', __FILE__)
10
10
 
11
11
  # Is this error one that should be reformatted?
@@ -1,4 +1,4 @@
1
- module Wolverine
1
+ class Wolverine
2
2
  # A {PathComponent} represents either the +Wolverine.config.script_path+
3
3
  # directory, or a subdirectory of it. Calling (nearly) any method on it will
4
4
  # cause it to look in the filesystem at the location it refers to for a file
@@ -14,8 +14,12 @@ module Wolverine
14
14
  class MissingTemplate < StandardError ; end
15
15
 
16
16
  # @param path [Pathname] full path to the current file or directory
17
- def initialize path
17
+ # @param redis [Redis]
18
+ def initialize path, options = {}
18
19
  @path = path
20
+ @options = options
21
+ @redis = options[:redis] || Wolverine.redis
22
+ @config = options[:config] || Wolverine.config
19
23
  end
20
24
 
21
25
  # @param sym [Symbol] the file or directory to look up and execute
@@ -49,14 +53,14 @@ module Wolverine
49
53
  end
50
54
 
51
55
  def define_directory_method path, sym
52
- dir = PathComponent.new(path)
56
+ dir = PathComponent.new(path, @options)
53
57
  define_metaclass_method(sym) { dir }
54
58
  end
55
59
 
56
60
  def define_script_method path, sym, *args
57
- script = Wolverine::Script.new(path)
61
+ script = Wolverine::Script.new(path, @options)
58
62
  define_metaclass_method(sym) { |*args|
59
- script.call(Wolverine.redis, *args)
63
+ script.call(@redis, *args)
60
64
  }
61
65
  end
62
66
 
@@ -2,7 +2,7 @@ require 'pathname'
2
2
  require 'benchmark'
3
3
  require 'digest/sha1'
4
4
 
5
- module Wolverine
5
+ class Wolverine
6
6
  # {Script} represents a lua script in the filesystem. It loads the script
7
7
  # from disk and handles talking to redis to execute it. Error handling
8
8
  # is handled by {LuaError}.
@@ -11,10 +11,11 @@ module Wolverine
11
11
  # Loads the script file from disk and calculates its +SHA1+ sum.
12
12
  #
13
13
  # @param file [Pathname] the full path to the indicated file
14
- def initialize file
14
+ def initialize file, options = {}
15
15
  @file = Pathname.new(file)
16
16
  @content = load_lua file
17
17
  @digest = Digest::SHA1.hexdigest @content
18
+ @config = options[:config] || Wolverine.config
18
19
  end
19
20
 
20
21
  # Passes the script and supplied arguments to redis for evaulation.
@@ -59,12 +60,12 @@ module Wolverine
59
60
  def instrument eval_type
60
61
  ret = nil
61
62
  runtime = Benchmark.realtime { ret = yield }
62
- Wolverine.config.instrumentation.call relative_path.to_s, runtime, eval_type
63
+ @config.instrumentation.call relative_path.to_s, runtime, eval_type
63
64
  ret
64
65
  end
65
66
 
66
67
  def relative_path
67
- path = @file.relative_path_from(Wolverine.config.script_path)
68
+ @path ||= @file.relative_path_from(@config.script_path)
68
69
  end
69
70
 
70
71
  def load_lua file
@@ -1,3 +1,3 @@
1
- module Wolverine
2
- VERSION = "0.2.3"
1
+ class Wolverine
2
+ VERSION = "0.2.5"
3
3
  end
@@ -8,10 +8,10 @@ class WolverineIntegrationTest < MiniTest::Unit::TestCase
8
8
  stub.tap do |redis|
9
9
  redis.expects(:evalsha).
10
10
  with('fe24f4dd4ba7881608cca4b846f009195e06d79a', 2, :a, :b).
11
- raises("NOSCRIPT")
11
+ raises("NOSCRIPT").once
12
12
  redis.expects(:eval).
13
13
  with(CONTENT, 2, :a, :b).
14
- returns([1, 0])
14
+ returns([1, 0]).once
15
15
  end
16
16
  end
17
17
 
@@ -22,4 +22,12 @@ class WolverineIntegrationTest < MiniTest::Unit::TestCase
22
22
  assert_equal [1, 0], Wolverine.util.mexists(:a, :b)
23
23
  end
24
24
 
25
+ def test_everything_instantiated
26
+ script_path = Pathname.new(File.expand_path('../lua', __FILE__))
27
+ config = Wolverine::Configuration.new(mock_redis, script_path)
28
+
29
+ wolverine = Wolverine.new(config)
30
+ assert_equal [1, 0], wolverine.util.mexists(:a, :b)
31
+ end
32
+
25
33
  end
@@ -7,7 +7,7 @@ module Rails
7
7
  end
8
8
  end
9
9
 
10
- module Wolverine
10
+ class Wolverine
11
11
  class ConfigurationTest < MiniTest::Unit::TestCase
12
12
 
13
13
  def test_default_redis
@@ -1,6 +1,6 @@
1
1
  require File.join(File.expand_path('../../test_helper', __FILE__))
2
2
 
3
- module Wolverine
3
+ class Wolverine
4
4
  class PathComponentTest < MiniTest::Unit::TestCase
5
5
 
6
6
  def root
@@ -1,7 +1,7 @@
1
1
  require File.join(File.expand_path('../../test_helper', __FILE__))
2
2
  require 'digest/sha1'
3
3
 
4
- module Wolverine
4
+ class Wolverine
5
5
  class ScriptTest < MiniTest::Unit::TestCase
6
6
  CONTENT = "return 1"
7
7
  DIGEST = Digest::SHA1.hexdigest(CONTENT)
@@ -14,4 +14,14 @@ class WolverineTest < MiniTest::Unit::TestCase
14
14
  refute_equal Wolverine.root_directory, dir
15
15
  end
16
16
 
17
+ def test_instantiate_wolverine_with_config
18
+ r = Struct.new(:Redis)
19
+ config = Wolverine::Configuration.new(r, 'path')
20
+ wolverine = Wolverine.new(config)
21
+
22
+ assert_equal r, wolverine.config.redis
23
+ assert_equal r, wolverine.redis
24
+ assert_equal 'path', wolverine.config.script_path
25
+ end
26
+
17
27
  end
data/wolverine.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_runtime_dependency 'redis', '~> 2.2.2'
21
+ s.add_runtime_dependency 'redis', '>= 2.2.2'
22
22
  s.add_development_dependency 'mocha', '~> 0.10.5'
23
23
  s.add_development_dependency 'minitest', '~> 2.11.3'
24
24
  s.add_development_dependency 'rake'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wolverine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,27 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-05 00:00:00.000000000 Z
12
+ date: 2012-12-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &70155163744540 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: 2.2.2
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70155163744540
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.2.2
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: mocha
27
- requirement: &70155163743720 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 0.10.5
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70155163743720
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.10.5
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: minitest
38
- requirement: &70155163743080 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: 2.11.3
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70155163743080
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.11.3
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: rake
49
- requirement: &70155163742680 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70155163742680
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: yard
60
- requirement: &70155163742180 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,7 +85,12 @@ dependencies:
65
85
  version: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70155163742180
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  description: Wolverine provides a simple way to run server-side redis scripts from
70
95
  a rails app
71
96
  email:
@@ -119,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
144
  version: '0'
120
145
  requirements: []
121
146
  rubyforge_project: wolverine
122
- rubygems_version: 1.8.11
147
+ rubygems_version: 1.8.23
123
148
  signing_key:
124
149
  specification_version: 3
125
150
  summary: Wolverine provides a simple way to run server-side redis scripts from a rails
@@ -132,4 +157,3 @@ test_files:
132
157
  - test/wolverine/path_component_test.rb
133
158
  - test/wolverine/script_test.rb
134
159
  - test/wolverine_test.rb
135
- has_rdoc: