wase_endpoint 0.0.0 → 0.0.1

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/.gitignore CHANGED
@@ -1 +1,2 @@
1
- *.log
1
+ *.log
2
+ pkg/
@@ -6,7 +6,7 @@ WaseEndpoint is a library for building daemons that act as WASE Endpoints for th
6
6
 
7
7
  WaseEndpoint is hosted by http://gemcutter.com. Please make sure you have added them to your gem sources.
8
8
 
9
- $ sudo gem install WaseEndpoint
9
+ $ sudo gem install wase_endpoint
10
10
 
11
11
  == Usage
12
12
 
@@ -21,9 +21,18 @@ Your endpoint logic:
21
21
 
22
22
  class MyEndpoint < WaseEndpoint
23
23
 
24
- # Just return our json as it came in.
24
+ # This where our logic goes.
25
+ # A json encoded String is the only argument. You can deal with this however
26
+ # you want. The JSON library is already loaded should you wish to use it.
27
+ # Return another String, or a Hash containing the String and the program
28
+ # counter increment you wish to use.
25
29
  def secret_sauce(raw_json)
30
+
31
+ # Just pass it back. Program counter increment will be 1.
26
32
  raw_json
33
+
34
+ # Or pass it back with a custom program counter.
35
+ # { :data => raw_json, :increment => 2}
27
36
  end
28
37
 
29
38
  end
@@ -39,11 +48,15 @@ The init file:
39
48
  :logfile => 'my_endpoint.log',
40
49
  :sleep_period => 60 )
41
50
 
51
+ Now running the init file will start your daemon. The PID will be returned to allow you to monitor it or kill it later.
52
+
53
+ ruby init.rb
54
+
42
55
  That's it! I also included a basic sinatra server in 'server.rb' that can be used as an input/output/program-listing node.
43
56
 
44
57
  == Problems, Comments, Suggestions?
45
58
 
46
- Issues can be tracked on github:
59
+ Issues can be tracked on github: http://github.com/dougal/wase_endpoint/issues
47
60
 
48
61
  All of the above are most welcome. mailto:dougal.s@gmail.com
49
62
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.0.1
@@ -3,9 +3,18 @@ require 'wase_endpoint'
3
3
 
4
4
  class MyEndpoint < WaseEndpoint
5
5
 
6
- # Just return our json as it came in.
6
+ # This where our logic goes.
7
+ # A json encoded String is the only argument. You can deal with this however
8
+ # you want. The JSON library is already loaded should you wish to use it.
9
+ # Return another String, or a Hash containing the String and the program
10
+ # counter increment you wish to use.
7
11
  def secret_sauce(raw_json)
12
+
13
+ # Just pass it back. Program counter increment will be 1.
8
14
  raw_json
15
+
16
+ # Or pass it back with a custom program counter.
17
+ # { :data => raw_json, :increment => 2}
9
18
  end
10
19
 
11
20
  end
@@ -42,14 +42,14 @@ class WaseEndpoint
42
42
  messages.each do |message|
43
43
  program_listing = message.fetch_program_listing
44
44
  if message.program_counter >= program_listing.size
45
- throw Exception 'Program counter has gone too far'
45
+ raise IndexError, 'Program counter has gone too far'
46
46
  end
47
47
 
48
48
  # Here's where your magic happens.
49
49
  message.send_input(secret_sauce(message.fetch_output))
50
50
 
51
51
  # Tell the next endpoint.
52
- @twitterer.send(program_listing[message.program_counter + 1], message.program_counter + 1, message.program_listing_uri, message.output_uri)
52
+ @twitterer.send(program_listing[message.new_program_counter], message.new_program_counter, message.program_listing_uri, message.output_uri)
53
53
  end
54
54
 
55
55
  end
@@ -14,6 +14,7 @@ class WaseEndpoint
14
14
  @output_uri = output_uri.strip
15
15
  @input_uri = input_uri.strip if input_uri
16
16
  @input_uri_1 = input_uri_1.strip if input_uri_1
17
+ @increment = 1
17
18
  end
18
19
 
19
20
  def ==(other)
@@ -28,7 +29,17 @@ class WaseEndpoint
28
29
  RestClient.get('http://' + @output_uri)
29
30
  end
30
31
 
32
+ # Accepts either a String of raw data, or a Hash of data and a program
33
+ # counter increment.
34
+ # An Exception will be thrown if this increment is negative.
31
35
  def send_input(input)
36
+
37
+ if input.is_a?(Hash)
38
+ @increment = input[:increment]
39
+ raise ArgumentError, 'You cannot have negative program counter increments' if @increment < 0
40
+ input = input[:data]
41
+ end
42
+
32
43
  input_uri = 'http://' + (@input_uri || @output_uri)
33
44
 
34
45
  # RestClient can't follow a redirect for put, so we'll expand it.
@@ -38,6 +49,10 @@ class WaseEndpoint
38
49
  RestClient.put(expanded_input_uri, input)
39
50
  end
40
51
 
52
+ def new_program_counter
53
+ @program_counter + @increment
54
+ end
55
+
41
56
  end
42
57
 
43
- end
58
+ end
@@ -5,6 +5,9 @@ class WaseEndpoint
5
5
  twitter_http_auth = Twitter::HTTPAuth.new(username, password)
6
6
  @twitter_client = Twitter::Base.new(twitter_http_auth)
7
7
 
8
+ # Call the test api method to validate the authentication.
9
+ @twitter_client.help
10
+
8
11
  # The oldest message ID could be stored here, but since twitter IDs
9
12
  # aren't always time-linear, comparing the messages is safer.
10
13
  @all_messages = []
@@ -50,15 +50,45 @@ describe WaseEndpoint::Message do
50
50
  @message.fetch_output.should == '[58, 92, 12, 18, 76]'
51
51
  end
52
52
 
53
- it "should send the input data using the expanded output URI" do
54
- mock_net_http = mock(Net::HTTP)
55
- mock_net_http.should_receive(:head).with('/2uhGcl').and_return({'Location' => 'http://example.com/'})
56
- Net::HTTP.should_receive(:new).with('bit.ly').and_return(mock_net_http)
57
- RestClient.should_receive(:put).with('http://example.com/', '[1, 2, 3, 4]')
53
+ describe "sending input data" do
54
+
55
+ it "should send the input data using the expanded output URI" do
56
+ mock_net_http = mock(Net::HTTP)
57
+ mock_net_http.should_receive(:head).with('/2uhGcl').and_return({'Location' => 'http://example.com/'})
58
+ Net::HTTP.should_receive(:new).with('bit.ly').and_return(mock_net_http)
59
+ RestClient.should_receive(:put).with('http://example.com/', '[1, 2, 3, 4]')
60
+
61
+ @message.send_input('[1, 2, 3, 4]')
62
+ end
63
+
64
+ it "should throw an error on negative program counter increment" do
65
+ Net::HTTP.stub(:new).and_return(mock(Net::HTTP, :head => 'http://example.com'))
66
+ RestClient.stub(:put)
67
+
68
+ lambda {
69
+ @message.send_input({:data => 'foo', :increment => -1})
70
+ }.should raise_error(ArgumentError, 'You cannot have negative program counter increments')
71
+ end
58
72
 
59
- @message.send_input('[1, 2, 3, 4]')
60
73
  end
61
-
74
+
75
+
76
+ describe "incrementing the program counter" do
77
+
78
+ it "should be one" do
79
+ @message.new_program_counter.should == 1
80
+ end
81
+
82
+ it "should should be two" do
83
+ Net::HTTP.stub(:new).and_return(mock(Net::HTTP, :head => 'http://example.com'))
84
+ RestClient.stub(:put)
85
+ @message.send_input({:data => 'foo', :increment => 2})
86
+
87
+ @message.new_program_counter.should == 2
88
+ end
89
+
90
+ end
91
+
62
92
  end
63
93
 
64
94
  describe "with one input URI" do
@@ -76,7 +106,7 @@ describe WaseEndpoint::Message do
76
106
  @message.input_uri_1.should be_nil
77
107
  end
78
108
 
79
- it "should send the input data using the expanded output URI" do
109
+ it "should send the input data using the expanded input URI" do
80
110
  mock_net_http = mock(Net::HTTP)
81
111
  mock_net_http.should_receive(:head).with('/3kl0xs').and_return({'Location' => 'http://example.com/'})
82
112
  Net::HTTP.should_receive(:new).with('bit.ly').and_return(mock_net_http)
@@ -12,6 +12,16 @@ describe WaseEndpoint::Twitterer do
12
12
  WaseEndpoint::Twitterer.new(username, password)
13
13
  end
14
14
 
15
+ it "should validate the authentication with the help method" do
16
+ username ='foo'
17
+ password = 'bar'
18
+ Twitter::HTTPAuth.stub(:new)
19
+ Twitter::Base.stub(:new).and_return(mock_twitter_base)
20
+ mock_twitter_base.should_receive(:help)
21
+
22
+ @twitterer = WaseEndpoint::Twitterer.new(username, password)
23
+ end
24
+
15
25
  describe "fetching messages" do
16
26
 
17
27
  before(:all) do
@@ -72,8 +82,8 @@ describe WaseEndpoint::Twitterer do
72
82
  @auth_mock ||= mock(Twitter::HTTPAuth)
73
83
  end
74
84
 
75
- def mock_twitter_base
76
- @base_mock ||= mock(Twitter::Base)
85
+ def mock_twitter_base(stubs = {:help => true})
86
+ @base_mock ||= mock(Twitter::Base, stubs)
77
87
  end
78
88
 
79
89
  def mock_mash(message_id)
@@ -0,0 +1,57 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{wase_endpoint}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Douglas F Shearer"]
12
+ s.date = %q{2009-11-06}
13
+ s.description = %q{WaseEndpoint is a library for building daemons that act as WASE Endpoints for http://bit.ly/3qRMbv}
14
+ s.email = %q{dougal.s@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ ".gitignore",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "example/init.rb",
24
+ "example/my_endpoint.rb",
25
+ "example/server.rb",
26
+ "lib/wase_endpoint.rb",
27
+ "lib/wase_endpoint/message.rb",
28
+ "lib/wase_endpoint/twitterer.rb",
29
+ "spec/spec_helper.rb",
30
+ "spec/wase_endpoint_message_spec.rb",
31
+ "spec/wase_endpoint_spec.rb",
32
+ "spec/wase_endpoint_twitterer_spec.rb",
33
+ "wase_endpoint.gemspec"
34
+ ]
35
+ s.homepage = %q{http://github.com/dougal/wase_endpoint}
36
+ s.rdoc_options = ["--charset=UTF-8"]
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = %q{1.3.5}
39
+ s.summary = %q{WaseEndpoint is a library for building daemons that act as WASE Endpoints for http://bit.ly/3qRMbv}
40
+ s.test_files = [
41
+ "spec/spec_helper.rb",
42
+ "spec/wase_endpoint_message_spec.rb",
43
+ "spec/wase_endpoint_spec.rb",
44
+ "spec/wase_endpoint_twitterer_spec.rb"
45
+ ]
46
+
47
+ if s.respond_to? :specification_version then
48
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
49
+ s.specification_version = 3
50
+
51
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
52
+ else
53
+ end
54
+ else
55
+ end
56
+ end
57
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wase_endpoint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Douglas F Shearer
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-05 00:00:00 +00:00
12
+ date: 2009-11-06 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -36,6 +36,7 @@ files:
36
36
  - spec/wase_endpoint_message_spec.rb
37
37
  - spec/wase_endpoint_spec.rb
38
38
  - spec/wase_endpoint_twitterer_spec.rb
39
+ - wase_endpoint.gemspec
39
40
  has_rdoc: true
40
41
  homepage: http://github.com/dougal/wase_endpoint
41
42
  licenses: []