lurker 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.hound.yml +15 -0
- data/.rubocop.yml +15 -0
- data/README.md +19 -4
- data/Rakefile +1 -1
- data/certs/razum2um.pem +21 -0
- data/features/atom_persistent_within_the_same_type.feature +138 -0
- data/features/controller_schema_scaffolding.feature +5 -1
- data/features/multitype_request_support.feature +139 -0
- data/features/request_schema_scaffolding.feature +6 -4
- data/features/schema_updating_within_test_suite.feature +138 -0
- data/features/test_endpoint.feature +6 -3
- data/lib/lurker.rb +20 -4
- data/lib/lurker/cli.rb +2 -3
- data/lib/lurker/endpoint.rb +63 -28
- data/lib/lurker/presenters/endpoint_presenter.rb +10 -4
- data/lib/lurker/schema.rb +14 -16
- data/lib/lurker/schema_modifier.rb +46 -0
- data/lib/lurker/schema_modifier/array.rb +28 -0
- data/lib/lurker/schema_modifier/atom.rb +88 -0
- data/lib/lurker/schema_modifier/hash.rb +30 -0
- data/lib/lurker/service.rb +2 -6
- data/lib/lurker/spy.rb +1 -1
- data/lib/lurker/templates/layouts/application.html.erb +1 -0
- data/lib/lurker/version.rb +1 -1
- data/lurker.gemspec +13 -10
- data/templates/generate_stuff.rb +25 -3
- data/templates/lurker_app.rb +17 -2
- metadata +135 -68
- metadata.gz.sig +2 -0
- checksums.yaml.gz.asc +0 -12
- data.tar.gz.asc +0 -12
- data/lib/lurker/endpoint_scaffold.rb +0 -135
- metadata.gz.asc +0 -12
metadata.gz.sig
ADDED
checksums.yaml.gz.asc
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
-----BEGIN PGP SIGNATURE-----
|
2
|
-
Version: GnuPG v1
|
3
|
-
Comment: GPGTools - http://gpgtools.org
|
4
|
-
|
5
|
-
iQEcBAABCgAGBQJTc6u3AAoJENcoxKfNVdjbPFQH/2AlxmZv3HxGqTBWHwEa8X0W
|
6
|
-
B/BQWPNQa0TmSLb0gwMBIakmZskLEF78AoiqEsgWVjxzaUqzrfsPfF3PaEfn2dFn
|
7
|
-
qyblC25Tzo55a4GNafZBfR9oLd1Z3T0feVsmS1z54dZRtVTnEIeJgDw8pGUOuLRm
|
8
|
-
GhBwzwPyl1yKCfJ9iTMCB9QsoiGrJipOzYULDoXoP9BV2v1iYbVVoJj4r2JWay8B
|
9
|
-
XIYQZEYMBjwIxa6IBAYP5wOoWJjf3rizveXpXGFGvUxYA28AEVfDagAyfbxn/Lvv
|
10
|
-
ifO5ww5p8+VqY4Hf8TxL9YLfZHXDf8oi9hKKtjE86FypjvcuYN0WBwmAjtF6aCM=
|
11
|
-
=TtxC
|
12
|
-
-----END PGP SIGNATURE-----
|
data.tar.gz.asc
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
-----BEGIN PGP SIGNATURE-----
|
2
|
-
Version: GnuPG v1
|
3
|
-
Comment: GPGTools - http://gpgtools.org
|
4
|
-
|
5
|
-
iQEcBAABCgAGBQJTc6u0AAoJENcoxKfNVdjbXtoH+gOMyCvf2MRKtlx7mBadLRj9
|
6
|
-
6ei4q21BvhC60iTD9yiIg4WuREZhec+2LqiFhsEspKZbhDlyLR7/abc568P54FrZ
|
7
|
-
7kfXBW5/J8/1PuiYVpaYovExiVg8ttIqqHfpN2X3dHJ2fvKHPrDwGK+UpPKKIjvg
|
8
|
-
0pPuQAKx0YljMKlg+vDampb8JYXM+E74zpVQ2OM/lUE96ZriQNz+YEKI3t9NXLR8
|
9
|
-
vDZ8u2BCovqLdLy7tqcxhvsvZHtHvTffWMLpykP3sik+WYvjma4FocfJ9QOsvUFx
|
10
|
-
lwlZMfN9EGdKDw8mvNqcub0E2yGsv+Z6nZcQsD9qpLns+nDs/49baRDuJ9UXvWI=
|
11
|
-
=w69M
|
12
|
-
-----END PGP SIGNATURE-----
|
@@ -1,135 +0,0 @@
|
|
1
|
-
# EndpointScaffolds aggregate input to guess at the structure of an API
|
2
|
-
# endpoint. The #consume_* methods can modify the structure of the
|
3
|
-
# in-memory endpoint, to save the results to the file system, call #persist!
|
4
|
-
class Lurker::EndpointScaffold < Lurker::Endpoint
|
5
|
-
def initialize(endpoint_path, extensions={}, service=Lurker::Service.default_service)
|
6
|
-
if File.exist?(endpoint_path)
|
7
|
-
super
|
8
|
-
else
|
9
|
-
@endpoint_path = endpoint_path
|
10
|
-
@schema = Lurker::Schema.new(
|
11
|
-
{
|
12
|
-
"prefix" => "",
|
13
|
-
"description" => "",
|
14
|
-
"responseCodes" => []
|
15
|
-
},
|
16
|
-
stringify_keys(extensions)
|
17
|
-
)
|
18
|
-
@service = service
|
19
|
-
@errors = []
|
20
|
-
@extensions = extensions
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def persist!
|
25
|
-
schema.ordered!.write_to(endpoint_path)
|
26
|
-
end
|
27
|
-
|
28
|
-
def consume_request(params, successful = true)
|
29
|
-
scaffold_schema(request_parameters, stringify_keys(params), {
|
30
|
-
:root_object => true
|
31
|
-
})
|
32
|
-
end
|
33
|
-
|
34
|
-
def consume_response(params, status_code, successful=true)
|
35
|
-
if successful
|
36
|
-
scaffold_schema(response_parameters, stringify_keys(params), {
|
37
|
-
:root_object => true
|
38
|
-
})
|
39
|
-
end
|
40
|
-
|
41
|
-
response_code = response_codes.find do
|
42
|
-
|rc| rc["status"] == status_code && rc["successful"] == successful
|
43
|
-
end
|
44
|
-
|
45
|
-
if !response_code
|
46
|
-
response_codes << {
|
47
|
-
"status" => status_code,
|
48
|
-
"successful" => successful,
|
49
|
-
"description" => ""
|
50
|
-
}
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
protected
|
55
|
-
|
56
|
-
def scaffold_schema(schema, params, options = {:root_object => false})
|
57
|
-
unless options[:root_object]
|
58
|
-
schema["description"] ||= ""
|
59
|
-
end
|
60
|
-
|
61
|
-
if params.kind_of? Hash
|
62
|
-
scaffold_hash(schema, params, options)
|
63
|
-
elsif params.kind_of? Array
|
64
|
-
scaffold_array(schema, params, options)
|
65
|
-
else
|
66
|
-
scaffold_atom(schema, params, options)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def scaffold_hash(schema, params, options = {})
|
71
|
-
schema["description"] ||= ""
|
72
|
-
schema["type"] ||= "object"
|
73
|
-
schema["additionalProperties"] = false if schema["additionalProperties"].nil?
|
74
|
-
schema["required"] ||= []
|
75
|
-
schema["properties"] ||= {}
|
76
|
-
|
77
|
-
params.each do |key, value|
|
78
|
-
unless schema[key]
|
79
|
-
schema["properties"][key] ||= {}
|
80
|
-
sub_options = options.merge(:root_object => false)
|
81
|
-
scaffold_schema(schema["properties"][key], value, sub_options)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def scaffold_array(schema, params, options = {})
|
87
|
-
schema["type"] ||= "array"
|
88
|
-
schema["items"] ||= {}
|
89
|
-
params.each do |arr_value|
|
90
|
-
sub_options = options.merge(:root_object => false)
|
91
|
-
scaffold_schema(schema["items"], arr_value, options.merge(sub_options))
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def scaffold_atom(schema, params, options = {})
|
96
|
-
value = params
|
97
|
-
schema["type"] ||= guess_type(params)
|
98
|
-
if format = guess_format(params)
|
99
|
-
schema["format"] ||= format
|
100
|
-
end
|
101
|
-
schema["example"] ||= value
|
102
|
-
end
|
103
|
-
|
104
|
-
def guess_type(value)
|
105
|
-
in_type = value.class.to_s
|
106
|
-
type_map = {
|
107
|
-
"Fixnum" => "integer",
|
108
|
-
"Float" => "number",
|
109
|
-
"Hash" => "object",
|
110
|
-
"Time" => "string",
|
111
|
-
"TrueClass" => "boolean",
|
112
|
-
"FalseClass" => "boolean",
|
113
|
-
"NilClass" => "null"
|
114
|
-
}
|
115
|
-
type_map[in_type] || in_type.downcase
|
116
|
-
end
|
117
|
-
|
118
|
-
def guess_format(value)
|
119
|
-
if value.kind_of? Time
|
120
|
-
"date-time"
|
121
|
-
elsif value.kind_of? String
|
122
|
-
if value.start_with? "http://"
|
123
|
-
"uri"
|
124
|
-
elsif value.match(/\#[0-9a-fA-F]{3}(?:[0-9a-fA-F]{3})?\b/)
|
125
|
-
"color"
|
126
|
-
else
|
127
|
-
begin
|
128
|
-
"date-time" if Time.iso8601(value)
|
129
|
-
rescue
|
130
|
-
nil
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
metadata.gz.asc
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
-----BEGIN PGP SIGNATURE-----
|
2
|
-
Version: GnuPG v1
|
3
|
-
Comment: GPGTools - http://gpgtools.org
|
4
|
-
|
5
|
-
iQEcBAABCgAGBQJTc6uwAAoJENcoxKfNVdjbBysIAKPht7dFcw1FVZGq+D3t3Gxu
|
6
|
-
oLvyRB4VbdDKFVnqNy+cflqIllyCmCuVAjVepNS+te7UFnqoPkDpF21dob8JT2+h
|
7
|
-
ybx9dspdr5Z3+CFy+mU7ya+GFoDolKDEzv277f3S7kGRws7C02TkR7uGr204Jyos
|
8
|
-
Ckm/9c6MwT16pt+8VcTn3wUwYdDBWpLrvn2+apkPldyOPI5HI9ohgFosqDiTYRsi
|
9
|
-
ObcmJRPISPYxpE4ej26h+p5flxsFridrW8NBKRWdVpjgBVeH02bGSCmQ79yMWVY2
|
10
|
-
DqfZollFgztt1Fw4A90cAA5SPhCb5pfbgLiJ2GgMBZimQumpl6hQ6pJZwMTIVgA=
|
11
|
-
=MIHv
|
12
|
-
-----END PGP SIGNATURE-----
|