wolverine 0.0.4 → 0.1.0

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.md CHANGED
@@ -26,10 +26,10 @@ cd redis && make
26
26
  gem 'wolverine'
27
27
  ```
28
28
 
29
- 3) Add your lua scripts to `app/redis`:
29
+ 3) Add your lua scripts to `app/wolverine`:
30
30
 
31
31
  ```lua
32
- -- app/redis/util/mexists.lua
32
+ -- app/wolverine/util/mexists.lua
33
33
  local exists = {}
34
34
  local existence
35
35
  for _, key in ipairs(KEYS) do
@@ -41,9 +41,12 @@ return exists
41
41
  4) Call wolverine from your code:
42
42
 
43
43
  ```ruby
44
- Wolverine.call('util/mexists', 'key1', 'key2', 'key3') #=> [0, 1, 0]
44
+ Wolverine.util.mexists('key1', 'key2', 'key3') #=> [0, 1, 0]
45
45
  ```
46
46
 
47
+ Methods are available on `Wolverine` paralleling the directory structure
48
+ of wolverine's `script_path`.
49
+
47
50
  ## Configuration
48
51
 
49
52
  Available configuration options:
data/Rakefile CHANGED
@@ -1 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = "test/**/*_test.rb"
6
+ end
7
+
8
+ task default: :test
data/TODO CHANGED
@@ -1 +1,2 @@
1
- * Support calling templates like: `Wolverine.util.mexists('key1', 'key2', 'key3')`
1
+ - Tests for Wolverine::PathComponent
2
+ - Think of more TODO items
data/lib/wolverine.rb CHANGED
@@ -1,32 +1,12 @@
1
1
  require 'redis'
2
+ require 'pathname'
2
3
 
3
4
  require 'wolverine/version'
4
5
  require 'wolverine/configuration'
5
6
  require 'wolverine/script'
7
+ require 'wolverine/path_component'
6
8
 
7
9
  module Wolverine
8
-
9
- class Directory
10
- class MissingTemplate < StandardError ; end
11
- def initialize path
12
- @path = path
13
- end
14
-
15
- def method_missing sym, *args
16
- resolve sym, *args
17
- end
18
-
19
- def resolve sym, *args
20
- if File.directory?(path = @path + sym.to_s)
21
- Directory.new(path)
22
- elsif File.exists?(path = @path + "#{sym}.lua")
23
- Wolverine.call path, *args
24
- else
25
- raise MissingTemplate
26
- end
27
- end
28
- end
29
-
30
10
  def self.config
31
11
  @config ||= Configuration.new
32
12
  end
@@ -35,20 +15,14 @@ module Wolverine
35
15
  config.redis
36
16
  end
37
17
 
38
- def self.method_missing sym, *args
39
- Directory.new(config.script_path).resolve(sym, *args)
40
- rescue Directory::MissingTemplate
41
- super
42
- end
43
-
44
- def self.call(file, *args)
45
- pathname = file.kind_of?(Pathname) ? file : full_path(file)
46
- Script.new(pathname).call(redis, *args)
18
+ def self.root_directory
19
+ @root_directory ||= PathComponent.new(config.script_path)
47
20
  end
48
21
 
49
- def self.full_path(file)
50
- file << ".lua" unless file =~ /\.lua$/
51
- config.script_path + file
22
+ def self.method_missing sym, *args
23
+ root_directory.send(sym, *args)
24
+ rescue PathComponent::MissingTemplate
25
+ super
52
26
  end
53
27
 
54
28
  end
@@ -0,0 +1,53 @@
1
+ module Wolverine
2
+ class PathComponent
3
+ class MissingTemplate < StandardError ; end
4
+
5
+ def initialize path
6
+ @path = path
7
+ end
8
+
9
+ def method_missing sym, *args
10
+ create_method sym, *args
11
+ send sym, *args
12
+ end
13
+
14
+ private
15
+
16
+ def create_method sym, *args
17
+ if directory?(path = @path + sym.to_s)
18
+ define_directory_method path, sym
19
+ elsif file?(path = @path + "#{sym}.lua")
20
+ define_script_method path, sym, *args
21
+ else
22
+ raise MissingTemplate
23
+ end
24
+ end
25
+
26
+ def directory?(path)
27
+ File.directory?(path)
28
+ end
29
+
30
+ def file?(path)
31
+ File.exists?(path) && !File.directory?(path)
32
+ end
33
+
34
+ def define_directory_method path, sym
35
+ dir = PathComponent.new(path)
36
+ define_metaclass_method(sym) { dir }
37
+ end
38
+
39
+ def define_script_method path, sym, *args
40
+ script = Wolverine::Script.new(path)
41
+ define_metaclass_method(sym) { |*args|
42
+ script.call(Wolverine.redis, *args)
43
+ }
44
+ end
45
+
46
+ def define_metaclass_method sym, &block
47
+ metaclass = class << self; self; end
48
+ metaclass.send(:define_method, sym, &block)
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -1,3 +1,5 @@
1
+ require 'digest/sha1'
2
+
1
3
  module Wolverine
2
4
  class Script
3
5
  attr_reader :content, :digest
@@ -1,3 +1,3 @@
1
1
  module Wolverine
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,6 @@
1
+ local exists = {}
2
+ local existence
3
+ for _, key in ipairs(KEYS) do
4
+ table.insert(exists, redis.call('exists', key))
5
+ end
6
+ return exists
@@ -0,0 +1,25 @@
1
+ require_relative '../test_helper'
2
+
3
+ class WolverineIntegrationTest < MiniTest::Unit::TestCase
4
+
5
+ CONTENT = File.read(File.expand_path('../lua/util/mexists.lua', __FILE__))
6
+
7
+ def mock_redis
8
+ stub.tap do |redis|
9
+ redis.expects(:evalsha).
10
+ with('fe24f4dd4ba7881608cca4b846f009195e06d79a', 2, :a, :b).
11
+ raises("NOSCRIPT")
12
+ redis.expects(:eval).
13
+ with(CONTENT, 2, :a, :b).
14
+ returns([1, 0])
15
+ end
16
+ end
17
+
18
+ def test_everything
19
+ Wolverine.config.redis = mock_redis
20
+ Wolverine.config.script_path = Pathname.new(File.expand_path('../lua', __FILE__))
21
+
22
+ assert_equal [1, 0], Wolverine.util.mexists(:a, :b)
23
+ end
24
+
25
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../test_helper'
2
+
3
+ module Wolverine
4
+ class PathComponentTest < MiniTest::Unit::TestCase
5
+
6
+ def root
7
+ @root ||= Pathname.new('.')
8
+ end
9
+
10
+ def pc
11
+ @pc ||= Wolverine::PathComponent.new(root)
12
+ end
13
+
14
+ def test_directory_caching
15
+ pc.expects(:directory?).with(root + 'bar').returns(true)
16
+ assert_equal pc.bar.object_id, pc.bar.object_id
17
+ end
18
+
19
+ def test_script_caching
20
+ pc.expects(:directory?).with(root + 'bar').returns(false)
21
+ pc.expects(:file?).with(root + 'bar.lua').returns(true)
22
+ script = stub
23
+ Wolverine::Script.expects(:new).once.returns(script)
24
+ script.expects(:call).twice.returns(:success)
25
+
26
+ assert_equal pc.bar, pc.bar
27
+ end
28
+
29
+ end
30
+ end
@@ -1,29 +1,10 @@
1
1
  require_relative 'test_helper'
2
2
 
3
3
  class WolverineTest < MiniTest::Unit::TestCase
4
-
5
- def setup
6
- Wolverine.config.redis = :redis
7
- Wolverine.config.script_path = Pathname.new('foo')
8
- end
9
-
10
- def test_adds_extension_if_none_present
11
- assert_equal Pathname.new('foo/bar.lua'), Wolverine.full_path('bar')
12
- end
13
-
14
- def test_finding_a_file
15
- assert_equal 3, Wolverine.three
16
- end
17
-
4
+
18
5
  def test_redis
6
+ Wolverine.config.redis = :redis
19
7
  assert_equal :redis, Wolverine.redis
20
8
  end
21
9
 
22
- def test_call
23
- script = stub
24
- script.expects(:call).with(:redis, :a, :b).returns(:return)
25
- Wolverine::Script.expects(:new).with(Pathname.new('foo/bar.lua')).returns(script)
26
- assert_equal :return, Wolverine.call('bar', :a, :b)
27
- end
28
-
29
- end
10
+ end
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.0.4
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-03-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &70182207074200 !ruby/object:Gem::Requirement
16
+ requirement: &70166214008280 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70182207074200
24
+ version_requirements: *70166214008280
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: mocha
27
- requirement: &70182207088260 !ruby/object:Gem::Requirement
27
+ requirement: &70166214007720 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70182207088260
35
+ version_requirements: *70166214007720
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: minitest
38
- requirement: &70182207086280 !ruby/object:Gem::Requirement
38
+ requirement: &70166214007120 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70182207086280
46
+ version_requirements: *70166214007120
47
47
  description: Wolverine provides a simple way to run server-side redis scripts from
48
48
  a rails app
49
49
  email:
@@ -61,10 +61,14 @@ files:
61
61
  - examples/mexists.lua
62
62
  - lib/wolverine.rb
63
63
  - lib/wolverine/configuration.rb
64
+ - lib/wolverine/path_component.rb
64
65
  - lib/wolverine/script.rb
65
66
  - lib/wolverine/version.rb
67
+ - test/integration/lua/util/mexists.lua
68
+ - test/integration/wolverine_integration_test.rb
66
69
  - test/test_helper.rb
67
70
  - test/wolverine/configuration_test.rb
71
+ - test/wolverine/path_component_test.rb
68
72
  - test/wolverine/script_test.rb
69
73
  - test/wolverine_test.rb
70
74
  - wolverine.gemspec
@@ -94,7 +98,10 @@ specification_version: 3
94
98
  summary: Wolverine provides a simple way to run server-side redis scripts from a rails
95
99
  app
96
100
  test_files:
101
+ - test/integration/lua/util/mexists.lua
102
+ - test/integration/wolverine_integration_test.rb
97
103
  - test/test_helper.rb
98
104
  - test/wolverine/configuration_test.rb
105
+ - test/wolverine/path_component_test.rb
99
106
  - test/wolverine/script_test.rb
100
107
  - test/wolverine_test.rb