mason-client 0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,24 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ mason-client (0)
5
+ json
6
+ rack
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ contest (0.1.2)
12
+ json (1.4.6)
13
+ rack (1.2.1)
14
+ rake (0.8.7)
15
+
16
+ PLATFORMS
17
+ ruby
18
+
19
+ DEPENDENCIES
20
+ contest
21
+ json
22
+ mason-client!
23
+ rack
24
+ rake
@@ -0,0 +1,8 @@
1
+ require "rake/testtask"
2
+
3
+ task :default => :test
4
+
5
+ Rake::TestTask.new(:test) do |t|
6
+ t.ruby_opts << "-Ilib" << "-Itest"
7
+ t.test_files = FileList["test/*_test.rb"]
8
+ end
@@ -0,0 +1,57 @@
1
+ require "json"
2
+ require "rack"
3
+
4
+ require "mason_client/request"
5
+ require "mason_client/result"
6
+ require "mason_client/response"
7
+ require "mason_client/app"
8
+ require "mason_client/mock"
9
+ require "mason_client/http"
10
+
11
+ module MasonClient
12
+ class Error < StandardError; end
13
+
14
+ def self.setup(url, &block)
15
+ @url = url
16
+ @handler = block
17
+ end
18
+
19
+ def self.build(repo, sha1, command, callback)
20
+ request = Request.new(repo, sha1, command, callback)
21
+ url = backend.run(request)
22
+
23
+ Response.new(url)
24
+ end
25
+
26
+ def self.app
27
+ @app ||= App.new(@handler)
28
+ end
29
+
30
+ def self.backend
31
+ @backend ||= HTTP.new(@url)
32
+ end
33
+
34
+ def self.handle(result)
35
+ @handler.call(result)
36
+ end
37
+
38
+ def self.enable_mock!
39
+ @backend = Mock.new(@url)
40
+ end
41
+
42
+ def self.disable_mock!
43
+ @backend = nil
44
+ end
45
+
46
+ def self.mocked?
47
+ @backend.is_a?(Mock)
48
+ end
49
+
50
+ def self.success!
51
+ @backend.success!
52
+ end
53
+
54
+ def self.fail!
55
+ @backend.fail!
56
+ end
57
+ end
@@ -0,0 +1,19 @@
1
+ module MasonClient
2
+ class App
3
+ def initialize(handler)
4
+ @handler = handler
5
+ end
6
+
7
+ def call(env)
8
+ request = Rack::Request.new(env)
9
+ payload = JSON.parse(request.params["payload"])
10
+ result = Result.from(payload)
11
+
12
+ if @handler.call(result)
13
+ Rack::Response.new("OK", 200, {"Content-Type" => "text/plain"}).finish
14
+ else
15
+ raise Error, "failed to handle build result for #{result.callback}"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ module MasonClient
2
+ class HTTP
3
+ def initialize(url)
4
+ @url = url
5
+ end
6
+
7
+ def run(request)
8
+ response = Net::HTTP.post_form(URI(@url), "payload" => request.to_json)
9
+
10
+ unless response.code == "301"
11
+ return
12
+ end
13
+
14
+ response["Location"]
15
+ end
16
+
17
+ def success!
18
+ raise Error, "success! can only be used when mocked"
19
+ end
20
+
21
+ def fail!
22
+ raise Error, "fail! can only be used when mocked"
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module MasonClient
2
+ class Mock
3
+ def initialize(url)
4
+ @url = url
5
+
6
+ success!
7
+ end
8
+
9
+ def success!
10
+ @status = 0
11
+ end
12
+
13
+ def fail!
14
+ @status = 1
15
+ end
16
+
17
+ def run(request)
18
+ id = Time.now.to_f
19
+ url = "#{@url}/#{id}"
20
+ result = Result.new(url, request.callback, @status)
21
+
22
+ MasonClient.handle(result)
23
+
24
+ url
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ module MasonClient
2
+ class Request
3
+ def initialize(repo, ref, command, callback)
4
+ @repo = repo
5
+ @ref = ref
6
+ @command = command
7
+ @callback = callback
8
+ end
9
+
10
+ attr_reader :repo, :ref, :command, :callback
11
+
12
+ def to_json
13
+ { :repo => repo,
14
+ :ref => ref,
15
+ :command => command,
16
+ :callback => callback }.to_json
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ module MasonClient
2
+ class Response
3
+ def initialize(url)
4
+ @url = url
5
+ end
6
+
7
+ attr_reader :url
8
+
9
+ def success?
10
+ !! @url
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ module MasonClient
2
+ class Result
3
+ def self.from(payload)
4
+ new(payload["url"], payload["callback"], payload["status"])
5
+ end
6
+
7
+ def initialize(url, callback, status)
8
+ @url = url
9
+ @callback = callback
10
+ @status = status
11
+ end
12
+
13
+ attr_reader :url, :callback
14
+
15
+ def success?
16
+ @status.zero?
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "mason-client"
3
+ s.version = "0.0.1"
4
+ s.summary = "builds things"
5
+
6
+ s.add_dependency "json"
7
+ s.add_dependency "rack"
8
+
9
+ s.add_development_dependency "contest"
10
+ s.add_development_dependency "rake"
11
+
12
+ s.files = `git ls-files`.split("\n")
13
+ end
@@ -0,0 +1,66 @@
1
+ require "test/unit"
2
+ require "contest"
3
+
4
+ require "mason_client"
5
+
6
+ class MasonClientTest < Test::Unit::TestCase
7
+ setup do
8
+ @results = {}
9
+
10
+ MasonClient.enable_mock!
11
+ MasonClient.setup("http://mason.example.com") do |result|
12
+ @results[result.url] = result
13
+ end
14
+ end
15
+
16
+ def request_build
17
+ MasonClient.build(
18
+ "git@github.com:sinatra/sinatra.git",
19
+ "HEAD",
20
+ "rake",
21
+ "http://example.com/ci"
22
+ )
23
+ end
24
+
25
+ describe "build api" do
26
+ test "success" do
27
+ MasonClient.success!
28
+
29
+ response = request_build
30
+
31
+ assert response.success?
32
+ assert @results[response.url].success?
33
+ end
34
+
35
+ test "fail" do
36
+ MasonClient.fail!
37
+
38
+ response = request_build
39
+
40
+ assert response.success?
41
+ assert ! @results[response.url].success?
42
+ end
43
+ end
44
+
45
+ describe "mocking api" do
46
+ setup do
47
+ MasonClient.disable_mock!
48
+ end
49
+
50
+ test "mocked?" do
51
+ MasonClient.enable_mock!
52
+ assert MasonClient.mocked?
53
+
54
+ MasonClient.disable_mock!
55
+ assert ! MasonClient.mocked?
56
+ end
57
+
58
+ test "success!" do
59
+ assert_raise(NoMethodError) { MasonClient.success! }
60
+ end
61
+
62
+ test "fail!" do
63
+ assert_raise(NoMethodError) { MasonClient.fail! }
64
+ end
65
+ end
66
+ end
metadata CHANGED
@@ -4,7 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- version: "0"
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
8
10
  platform: ruby
9
11
  authors: []
10
12
 
@@ -12,10 +14,57 @@ autorequire:
12
14
  bindir: bin
13
15
  cert_chain: []
14
16
 
15
- date: 2010-09-18 00:00:00 +02:00
17
+ date: 2010-09-19 00:00:00 +02:00
16
18
  default_executable:
17
- dependencies: []
18
-
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: json
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: rack
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ type: :runtime
43
+ version_requirements: *id002
44
+ - !ruby/object:Gem::Dependency
45
+ name: contest
46
+ prerelease: false
47
+ requirement: &id003 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ type: :development
55
+ version_requirements: *id003
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ prerelease: false
59
+ requirement: &id004 !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ type: :development
67
+ version_requirements: *id004
19
68
  description:
20
69
  email:
21
70
  executables: []
@@ -24,8 +73,19 @@ extensions: []
24
73
 
25
74
  extra_rdoc_files: []
26
75
 
27
- files: []
28
-
76
+ files:
77
+ - Gemfile
78
+ - Gemfile.lock
79
+ - Rakefile
80
+ - lib/mason_client.rb
81
+ - lib/mason_client/app.rb
82
+ - lib/mason_client/http.rb
83
+ - lib/mason_client/mock.rb
84
+ - lib/mason_client/request.rb
85
+ - lib/mason_client/response.rb
86
+ - lib/mason_client/result.rb
87
+ - mason-client.gemspec
88
+ - test/mason_client_test.rb
29
89
  has_rdoc: true
30
90
  homepage:
31
91
  licenses: []