jstp 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/features/map_a_la_rest.feature +148 -0
- data/features/step_definitions/map_a_la_rest_steps.rb +19 -0
- data/features/support/env.rb +11 -0
- data/jstp.gemspec +1 -0
- data/lib/jstp.rb +3 -0
- data/lib/jstp/controller.rb +14 -0
- data/lib/jstp/engine.rb +40 -0
- data/lib/jstp/version.rb +1 -1
- data/lib/jstp/web_socket.rb +1 -1
- data/lib/reader/jstp/connector.rb +2 -1
- metadata +26 -2
data/.gitignore
CHANGED
@@ -0,0 +1,148 @@
|
|
1
|
+
Feature: Map á la REST
|
2
|
+
|
3
|
+
Scenario: Map a really simple dispatch to the correct class
|
4
|
+
Given the class:
|
5
|
+
"""
|
6
|
+
class User < JSTP::Controller
|
7
|
+
def get
|
8
|
+
Testing.test_log << "hola"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
"""
|
12
|
+
When I send the dispatch:
|
13
|
+
"""
|
14
|
+
{
|
15
|
+
"resource":["localhost", "User"],
|
16
|
+
"method": "GET"
|
17
|
+
}
|
18
|
+
"""
|
19
|
+
Then I should have 'hola' in the test log
|
20
|
+
|
21
|
+
Scenario: A dispatch with a body
|
22
|
+
Given the class:
|
23
|
+
"""
|
24
|
+
class Article < JSTP::Controller
|
25
|
+
def post params
|
26
|
+
Testing.test_log << params["body"]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
"""
|
30
|
+
When I send the dispatch:
|
31
|
+
"""
|
32
|
+
{
|
33
|
+
"resource": ["localhost", "Article"],
|
34
|
+
"method": "POST",
|
35
|
+
"body": "some text"
|
36
|
+
}
|
37
|
+
"""
|
38
|
+
Then I should have 'some text' in the test log
|
39
|
+
|
40
|
+
Scenario: A compliant dispatch
|
41
|
+
Given the class:
|
42
|
+
"""
|
43
|
+
class ForDispatch < JSTP::Controller
|
44
|
+
def get params
|
45
|
+
Testing.test_log.concat [
|
46
|
+
params["body"],
|
47
|
+
@token,
|
48
|
+
@timestamp,
|
49
|
+
@referer,
|
50
|
+
@protocol,
|
51
|
+
@resource,
|
52
|
+
@method
|
53
|
+
]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
"""
|
57
|
+
When I send the dispatch:
|
58
|
+
"""
|
59
|
+
{
|
60
|
+
"protocol": ["JSTP", "0.1"],
|
61
|
+
"method": "GET",
|
62
|
+
"resource": ["localhost", "ForDispatch"],
|
63
|
+
"token": "523asdf243",
|
64
|
+
"timestamp": 15453242542245,
|
65
|
+
"referer": ["localhost", "Test"],
|
66
|
+
"body": {
|
67
|
+
"data": "some data"
|
68
|
+
}
|
69
|
+
}
|
70
|
+
"""
|
71
|
+
Then I should have '["JSTP", "0.1"]' in the test log
|
72
|
+
Then I should have 'GET' in the test log
|
73
|
+
Then I should have '["localhost", "Test"]' in the test log
|
74
|
+
Then I should have 15453242542245 in the test log
|
75
|
+
Then I should have '523asdf243' in the test log
|
76
|
+
Then I should have '{"data": "some data"}' in the test log
|
77
|
+
Then I should have '["localhost", "ForDispatch"]' in the test log
|
78
|
+
|
79
|
+
Scenario: A dispatch with query arguments
|
80
|
+
Given the class:
|
81
|
+
"""
|
82
|
+
class Argumented < JSTP::Controller
|
83
|
+
def put params
|
84
|
+
Testing.test_log << params["query"]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
"""
|
88
|
+
When I send the dispatch:
|
89
|
+
"""
|
90
|
+
{
|
91
|
+
"method": "PUT",
|
92
|
+
"resource": ["localhost", "Argumented", "querydata"]
|
93
|
+
}
|
94
|
+
"""
|
95
|
+
Then I should have '["querydata"]' in the test log
|
96
|
+
|
97
|
+
Scenario: Mixed arguments in the query
|
98
|
+
Given the class:
|
99
|
+
"""
|
100
|
+
class Mixed
|
101
|
+
class Argument < JSTP::Controller
|
102
|
+
def delete params
|
103
|
+
Testing.test_log << params["query"]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
"""
|
108
|
+
When I send the dispatch:
|
109
|
+
"""
|
110
|
+
{
|
111
|
+
"method": "DELETE",
|
112
|
+
"resource": ["localhost", "Mixed", "54s3453", "Argument", "35asdf"]
|
113
|
+
}
|
114
|
+
"""
|
115
|
+
Then I should have '["54s3453", "35asdf"]' in the test log
|
116
|
+
|
117
|
+
Scenario: A complex example just for the fun
|
118
|
+
Given the class:
|
119
|
+
"""
|
120
|
+
class Deeper
|
121
|
+
class Inside
|
122
|
+
class Klass < JSTP::Controller
|
123
|
+
def get params
|
124
|
+
Testing.test_log << params["query"]
|
125
|
+
Testing.test_log << params["body"]
|
126
|
+
Testing.test_log << @protocol
|
127
|
+
Testing.test_log << @token
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
"""
|
133
|
+
When I send the dispatch:
|
134
|
+
"""
|
135
|
+
{
|
136
|
+
"protocol": ["JSTP", "0.1"],
|
137
|
+
"resource": ["localhost", "Deeper", "52345", "Inside", "Klass", "53afas", "54234"],
|
138
|
+
"method": "GET",
|
139
|
+
"token": ["25353"],
|
140
|
+
"body": {
|
141
|
+
"id": 20
|
142
|
+
}
|
143
|
+
}
|
144
|
+
"""
|
145
|
+
Then I should have '["JSTP", "0.1"]' in the test log
|
146
|
+
Then I should have '["52345", "53afas", "54234"]' in the test log
|
147
|
+
Then I should have '["25353"]' in the test log
|
148
|
+
Then I should have '{"id": 20}' in the test log
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Given /^the class:$/ do |code|
|
2
|
+
eval code
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I send the dispatch:$/ do |dispatch|
|
6
|
+
JSTP::Engine.instance.dispatch JSON.parse dispatch
|
7
|
+
end
|
8
|
+
|
9
|
+
Then /^I should have '(.+?)' in the test log$/ do |text|
|
10
|
+
begin
|
11
|
+
Testing.test_log.should include JSON.parse text
|
12
|
+
rescue JSON::ParserError => e
|
13
|
+
Testing.test_log.should include text
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Then /^I should have (\d+) in the test log$/ do |number|
|
18
|
+
Testing.test_log.should include number.to_i
|
19
|
+
end
|
data/jstp.gemspec
CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.add_dependency 'uuid'
|
16
16
|
|
17
17
|
gem.add_development_dependency 'rspec'
|
18
|
+
gem.add_development_dependency 'cucumber'
|
18
19
|
|
19
20
|
gem.files = `git ls-files`.split($\)
|
20
21
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
data/lib/jstp.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
module JSTP
|
2
|
+
class Controller
|
3
|
+
include JSTP::API
|
4
|
+
|
5
|
+
def initialize message
|
6
|
+
@protocol = message["protocol"]
|
7
|
+
@method = message["method"]
|
8
|
+
@referer = message["referer"]
|
9
|
+
@timestamp = message["timestamp"]
|
10
|
+
@token = message["token"]
|
11
|
+
@resource = message["resource"]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/jstp/engine.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module JSTP
|
2
|
+
class Engine
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
# Processes the dispatch in the new REST engine way
|
6
|
+
def dispatch message
|
7
|
+
host, the_class, query = discover_resource message["resource"].clone
|
8
|
+
resource = the_class.new message
|
9
|
+
if query.empty? && (message["body"].nil? || message["body"].empty?)
|
10
|
+
resource.send message["method"].downcase.to_sym
|
11
|
+
else
|
12
|
+
resource.send(
|
13
|
+
message["method"].downcase.to_sym,
|
14
|
+
{
|
15
|
+
"body" => message["body"],
|
16
|
+
"query" => query
|
17
|
+
}
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def discover_resource resource_stack
|
23
|
+
response = []
|
24
|
+
response << resource_stack.shift
|
25
|
+
class_stack = "::"
|
26
|
+
query = []
|
27
|
+
resource_stack.each do |item|
|
28
|
+
begin
|
29
|
+
eval(class_stack + item)
|
30
|
+
class_stack += "#{item}::"
|
31
|
+
rescue NameError, SyntaxError
|
32
|
+
query << item
|
33
|
+
end
|
34
|
+
end
|
35
|
+
response << eval(class_stack[0..-3])
|
36
|
+
response << query
|
37
|
+
return response
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/jstp/version.rb
CHANGED
data/lib/jstp/web_socket.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jstp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-01-
|
14
|
+
date: 2013-01-23 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: em-websocket
|
@@ -109,6 +109,22 @@ dependencies:
|
|
109
109
|
- - ! '>='
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: cucumber
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ! '>='
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
112
128
|
description: Reference implementation for the sketch protocol JSTP
|
113
129
|
email:
|
114
130
|
- xavierviacanel@gmail.com
|
@@ -122,11 +138,16 @@ files:
|
|
122
138
|
- LICENSE
|
123
139
|
- README.md
|
124
140
|
- Rakefile
|
141
|
+
- features/map_a_la_rest.feature
|
142
|
+
- features/step_definitions/map_a_la_rest_steps.rb
|
143
|
+
- features/support/env.rb
|
125
144
|
- jstp.gemspec
|
126
145
|
- lib/jstp.rb
|
127
146
|
- lib/jstp/api.rb
|
128
147
|
- lib/jstp/base.rb
|
129
148
|
- lib/jstp/connector.rb
|
149
|
+
- lib/jstp/controller.rb
|
150
|
+
- lib/jstp/engine.rb
|
130
151
|
- lib/jstp/tcp.rb
|
131
152
|
- lib/jstp/version.rb
|
132
153
|
- lib/jstp/web_socket.rb
|
@@ -165,6 +186,9 @@ signing_key:
|
|
165
186
|
specification_version: 3
|
166
187
|
summary: Reference implementation for the sketch protocol JSTP
|
167
188
|
test_files:
|
189
|
+
- features/map_a_la_rest.feature
|
190
|
+
- features/step_definitions/map_a_la_rest_steps.rb
|
191
|
+
- features/support/env.rb
|
168
192
|
- spec/jstp/api_spec.rb
|
169
193
|
- spec/jstp/base_spec.rb
|
170
194
|
- spec/jstp/connector_spec.rb
|