communist 0.1.0 → 0.2.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/CHANGELOG.md +9 -0
- data/README.md +3 -1
- data/lib/communist/const.rb +10 -0
- data/lib/communist/cucumber.rb +1 -0
- data/lib/communist/null_server.rb +12 -0
- data/lib/communist/server.rb +29 -15
- data/lib/communist/version.rb +1 -1
- data/lib/communist.rb +18 -2
- data/spec/server_spec.rb +32 -0
- data/spec/spec_helper.rb +20 -0
- metadata +15 -10
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -4,7 +4,9 @@ The Manifesto:
|
|
4
4
|
|
5
5
|
>It is Communist prime role to serve community by providing Cucumber steps for
|
6
6
|
>testing external API calls from command line applications. To meet this aim
|
7
|
-
>the Communist employees Sinatra DSL for mocking server responses.
|
7
|
+
>the Communist employees Sinatra DSL for mocking server responses. The Communist
|
8
|
+
>server receives requests from CLI and provides an API to respond to those
|
9
|
+
>requests. Canned answers/expectations have to be provided upfront.
|
8
10
|
|
9
11
|
## Installation
|
10
12
|
|
data/lib/communist/cucumber.rb
CHANGED
data/lib/communist/server.rb
CHANGED
@@ -7,6 +7,8 @@ require 'communist'
|
|
7
7
|
module Communist
|
8
8
|
class Server
|
9
9
|
|
10
|
+
include Communist::Const
|
11
|
+
|
10
12
|
class ServerError < StandardError; end
|
11
13
|
|
12
14
|
class Identify
|
@@ -35,10 +37,13 @@ module Communist
|
|
35
37
|
@app = app
|
36
38
|
@host = options[:host]
|
37
39
|
@server_thread = nil
|
40
|
+
@port = options[:port] || Communist.server_port
|
41
|
+
@port ||= Communist::Server.ports[@app.object_id]
|
42
|
+
@port ||= find_available_port
|
38
43
|
end
|
39
44
|
|
40
45
|
def host
|
41
|
-
|
46
|
+
Communist.server_host || DEFAULT_HOST
|
42
47
|
end
|
43
48
|
|
44
49
|
def responsive?
|
@@ -47,28 +52,26 @@ module Communist
|
|
47
52
|
res = Net::HTTP.start(host, @port) { |http| http.get('/__identify__') }
|
48
53
|
|
49
54
|
if res.is_a?(Net::HTTPSuccess) or res.is_a?(Net::HTTPRedirection)
|
50
|
-
return res.body ==
|
55
|
+
return res.body == app.object_id.to_s
|
51
56
|
end
|
52
57
|
rescue Errno::ECONNREFUSED, Errno::EBADF
|
53
58
|
return false
|
54
59
|
end
|
55
60
|
|
56
61
|
def start(&block)
|
57
|
-
|
58
|
-
@port = Server.ports[@app.object_id]
|
62
|
+
raise ArgumentError, 'app required' unless app
|
59
63
|
|
60
|
-
|
61
|
-
|
62
|
-
Server.ports[@pp.object_id] = @port
|
64
|
+
unless responsive?
|
65
|
+
Communist::Server.ports[app.object_id] = port
|
63
66
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
end
|
67
|
+
@server_thread = Thread.new do
|
68
|
+
Communist.run_default_server(Identify.new(app), port) do |server|
|
69
|
+
Communist.servers[app.object_id] = server
|
70
|
+
trap "INT" do server.shutdown end
|
68
71
|
end
|
69
|
-
|
70
|
-
Timeout.timeout(5) { @server_thread.join(0.1) until responsive? }
|
71
72
|
end
|
73
|
+
|
74
|
+
Timeout.timeout(DEFAULT_TIMEOUT) { @server_thread.join(0.1) until responsive? }
|
72
75
|
end
|
73
76
|
rescue TimeoutError
|
74
77
|
raise ServerError, "Rack application timed out during start"
|
@@ -76,13 +79,24 @@ module Communist
|
|
76
79
|
self
|
77
80
|
end
|
78
81
|
|
82
|
+
# Stops the server after handling the connection.
|
83
|
+
# Attempts to stop the server gracefully, otherwise
|
84
|
+
# shuts current connection right away.
|
79
85
|
def stop
|
80
|
-
Communist.
|
86
|
+
server = Communist.servers.delete(app.object_id) { |s| NullServer.new }
|
87
|
+
if Communist.server.respond_to?(:shutdown)
|
88
|
+
server.shutdown
|
89
|
+
elsif Communist.server.respond_to?(:stop!)
|
90
|
+
server.stop!
|
91
|
+
else
|
92
|
+
server.stop
|
93
|
+
end
|
81
94
|
@server_thread.join
|
82
95
|
end
|
83
96
|
|
84
97
|
def self.run(&block)
|
85
98
|
app = Sinatra.new do
|
99
|
+
set :show_exceptions, true
|
86
100
|
set :environment, :test
|
87
101
|
disable :protection
|
88
102
|
|
@@ -102,7 +116,7 @@ module Communist
|
|
102
116
|
private
|
103
117
|
|
104
118
|
def find_available_port
|
105
|
-
server = TCPServer.new(
|
119
|
+
server = TCPServer.new(DEFAULT_HOST, 0)
|
106
120
|
server.addr[Socket::Constants::SOCK_STREAM]
|
107
121
|
ensure
|
108
122
|
server.close if server
|
data/lib/communist/version.rb
CHANGED
data/lib/communist.rb
CHANGED
@@ -2,13 +2,21 @@ require 'communist/version'
|
|
2
2
|
require 'rack'
|
3
3
|
|
4
4
|
module Communist
|
5
|
+
|
6
|
+
class CommunistError < StandardError; end
|
7
|
+
|
5
8
|
class << self
|
6
9
|
attr_accessor :app_host
|
7
10
|
attr_accessor :default_host
|
11
|
+
attr_accessor :server_host, :server_port
|
8
12
|
attr_accessor :run_server
|
9
13
|
attr_accessor :app
|
10
14
|
|
11
|
-
#
|
15
|
+
# Configure Communist options
|
16
|
+
#
|
17
|
+
# Communist.configure do |config|
|
18
|
+
# config.server_host = 'http://localhost'
|
19
|
+
# end
|
12
20
|
#
|
13
21
|
def configure
|
14
22
|
yield self
|
@@ -26,6 +34,12 @@ module Communist
|
|
26
34
|
end
|
27
35
|
end
|
28
36
|
|
37
|
+
# Stores server instances.
|
38
|
+
#
|
39
|
+
def servers
|
40
|
+
@servers ||= {}
|
41
|
+
end
|
42
|
+
|
29
43
|
# By default run thin or fall back on webrick
|
30
44
|
#
|
31
45
|
def run_default_server(app, port, &block)
|
@@ -41,7 +55,9 @@ module Communist
|
|
41
55
|
|
42
56
|
end
|
43
57
|
|
44
|
-
autoload :Server,
|
58
|
+
autoload :Server, 'communist/server'
|
59
|
+
autoload :Const, 'communist/const'
|
60
|
+
autoload :NullServer, 'communist/null_server'
|
45
61
|
|
46
62
|
end # Communist
|
47
63
|
|
data/spec/server_spec.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Communist::Server do
|
4
|
+
|
5
|
+
let(:app) { proc { |env| [200, {}, "Hello Server!"] } }
|
6
|
+
|
7
|
+
context 'initialization' do
|
8
|
+
it 'sets application' do
|
9
|
+
server = Communist::Server.new(app)
|
10
|
+
server.app.should == app
|
11
|
+
end
|
12
|
+
|
13
|
+
it "sets port" do
|
14
|
+
server = Communist::Server.new(app).start
|
15
|
+
server.port.should == Communist::Server.ports[app.object_id]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "spins up a server" do
|
20
|
+
server = Communist::Server.new(app).start
|
21
|
+
res = Net::HTTP.start(server.host, server.port) { |http| http.get('/') }
|
22
|
+
res.body.should include("Hello Server!")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "binds to specified host" do
|
26
|
+
Communist.server_host = "0.0.0.0"
|
27
|
+
server = Communist::Server.new(app).start
|
28
|
+
server.host.should == "0.0.0.0"
|
29
|
+
Communist.server_host = nil
|
30
|
+
end
|
31
|
+
|
32
|
+
end # Communist::Server
|
data/spec/spec_helper.rb
CHANGED
@@ -4,7 +4,27 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
4
4
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
5
|
|
6
6
|
require 'rspec'
|
7
|
+
require 'communist'
|
8
|
+
|
9
|
+
DEFAULT_TEST_HOST = '0.0.0.0'
|
10
|
+
DEFAULT_TEST_PORT = 3333
|
11
|
+
|
12
|
+
module Helpers
|
13
|
+
def start_server(app, options, &block)
|
14
|
+
@server = Communist::Server.new(app, options)
|
15
|
+
@thread = Thread.new { @server.start }
|
16
|
+
end
|
17
|
+
|
18
|
+
def stop_server
|
19
|
+
@server.stop!
|
20
|
+
@thread.kill
|
21
|
+
end
|
22
|
+
end
|
7
23
|
|
8
24
|
RSpec.configure do |config|
|
9
25
|
config.order = :rand
|
26
|
+
config.color_enabled = true
|
27
|
+
config.tty = true
|
28
|
+
|
29
|
+
config.include Helpers
|
10
30
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: communist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
16
|
-
requirement: &
|
16
|
+
requirement: &2152389520 !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: *
|
24
|
+
version_requirements: *2152389520
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: sinatra
|
27
|
-
requirement: &
|
27
|
+
requirement: &2152389080 !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: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2152389080
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &2152388600 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2152388600
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
|
-
requirement: &
|
49
|
+
requirement: &2152388160 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2152388160
|
58
58
|
description: Library for mocking CLI calls to external APIs
|
59
59
|
email:
|
60
60
|
- ''
|
@@ -64,15 +64,19 @@ extra_rdoc_files: []
|
|
64
64
|
files:
|
65
65
|
- .gitignore
|
66
66
|
- .rvmrc
|
67
|
+
- CHANGELOG.md
|
67
68
|
- Gemfile
|
68
69
|
- LICENSE
|
69
70
|
- README.md
|
70
71
|
- Rakefile
|
71
72
|
- communist.gemspec
|
72
73
|
- lib/communist.rb
|
74
|
+
- lib/communist/const.rb
|
73
75
|
- lib/communist/cucumber.rb
|
76
|
+
- lib/communist/null_server.rb
|
74
77
|
- lib/communist/server.rb
|
75
78
|
- lib/communist/version.rb
|
79
|
+
- spec/server_spec.rb
|
76
80
|
- spec/spec_helper.rb
|
77
81
|
homepage: ''
|
78
82
|
licenses: []
|
@@ -99,4 +103,5 @@ signing_key:
|
|
99
103
|
specification_version: 3
|
100
104
|
summary: Library for mocking CLI calls to external APIs
|
101
105
|
test_files:
|
106
|
+
- spec/server_spec.rb
|
102
107
|
- spec/spec_helper.rb
|