lurker 0.6.0 → 0.6.1
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.
- 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-----
|