jstp 0.4.0 → 0.5.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/.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
|