apidragon 1.0.0 → 1.1.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.
- checksums.yaml +4 -4
- data/README.md +46 -4
- data/VERSION +1 -1
- data/apidragon.gemspec +4 -3
- data/lib/apidragon/api.rb +4 -10
- data/lib/apidragon/log.rb +23 -0
- data/lib/apidragon/macro.rb +19 -11
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 057fea4ff820d0007256be6ae77b2ad5f41af564
|
4
|
+
data.tar.gz: dff236d10ed490abbb2df35b7c0d1874b4f902ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2037bb17194a23285ed05b67c3573e19c1500ae7dec6d3c5d1ce0778f9c90424007757234ec63882be0086b5a0eca8b990b32fe62df5aceb3186fbbeb6a7397f
|
7
|
+
data.tar.gz: 52cb232fd49bf6410c47ae7f4169f9df67a518f2b9e8fe16932417759f7b92804916fadec4b38cf9316fda85c035ee716ef1a5d93381f883c5afd59a412d2b03
|
data/README.md
CHANGED
@@ -50,23 +50,28 @@ Each macro can have `n` number of calls like `testcall` in the example, each req
|
|
50
50
|
Currently supported modes:
|
51
51
|
- `get`
|
52
52
|
- `post`
|
53
|
-
- `
|
54
|
-
|
55
|
-
|
53
|
+
- `put`
|
54
|
+
- `delete`
|
55
|
+
- `curl_get`, `curl_post` (uses curl instead of the `rest-client` gem for special cases)
|
56
|
+
- `eval` (not yet stable)
|
57
|
+
- Planned: `curl_put`, `curl_delete`
|
56
58
|
|
57
59
|
# Further Options
|
60
|
+
|
61
|
+
## `record`
|
58
62
|
Each call can have a `record` option, where you can specify what output variables you want to record to your config.
|
59
63
|
|
60
64
|
- e.g.:
|
61
65
|
```yaml
|
62
66
|
testcall:
|
63
|
-
output:
|
67
|
+
output:
|
64
68
|
- id
|
65
69
|
- userinfo
|
66
70
|
record:
|
67
71
|
- id
|
68
72
|
```
|
69
73
|
|
74
|
+
## Qualifier variables
|
70
75
|
Further, for more specific output parsing, you can specify a qualifier variable. As long as responses are returned as `xml` or `json`, output variables can be associated with one of your pre-defined values for cases like parsing lists of values that have several attribute fields.
|
71
76
|
|
72
77
|
- e.g.:
|
@@ -78,6 +83,43 @@ Further, for more specific output parsing, you can specify a qualifier variable.
|
|
78
83
|
```
|
79
84
|
So if the call returns a list like this: `[{username => bob, id => 1234}, {username => alice, id => 5678}]`, you can always return the `id` associated with the `username` variable defined in the `vars` section.
|
80
85
|
|
86
|
+
## `logging`
|
87
|
+
For each call, set `logging` to `true` to enable or `false` to disable.
|
88
|
+
|
89
|
+
- e.g.:
|
90
|
+
```yaml
|
91
|
+
testcall:
|
92
|
+
logging: true
|
93
|
+
```
|
94
|
+
|
95
|
+
## `plugin` (unstable)
|
96
|
+
apidragon will automatically `require_relative` any `.rb` files at `/tmp/apidragonplugins/`.
|
97
|
+
Call the code in the plugin file like so:
|
98
|
+
|
99
|
+
- e.g.:
|
100
|
+
- example.rb: (in `/tmp/apidragonplugins/`)
|
101
|
+
```ruby
|
102
|
+
class Example
|
103
|
+
def initialize(message)
|
104
|
+
@message = message
|
105
|
+
end
|
106
|
+
|
107
|
+
def out
|
108
|
+
puts "#{@message}"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
```
|
112
|
+
- apidragonconf.yaml:
|
113
|
+
```yaml
|
114
|
+
hellocall:
|
115
|
+
function: Example.new('hello').out
|
116
|
+
mode: eval
|
117
|
+
plugin: example
|
118
|
+
```
|
119
|
+
|
120
|
+
# Planned Features
|
121
|
+
- The ability to include custom scripts at the end of a call for extensibility
|
122
|
+
|
81
123
|
#License
|
82
124
|
|
83
125
|
[MIT](https://tldrlegal.com/license/mit-license)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
data/apidragon.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: apidragon 1.
|
5
|
+
# stub: apidragon 1.1.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "apidragon"
|
9
|
-
s.version = "1.
|
9
|
+
s.version = "1.1.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["isaiah thiessen"]
|
14
|
-
s.date = "2015-11-
|
14
|
+
s.date = "2015-11-30"
|
15
15
|
s.description = "Ruby based CLI for accessing veracode's api"
|
16
16
|
s.email = "isaiah.thiessen@live.ca"
|
17
17
|
s.executables = ["apidragon"]
|
@@ -34,6 +34,7 @@ Gem::Specification.new do |s|
|
|
34
34
|
"lib/apidragon.rb",
|
35
35
|
"lib/apidragon/api.rb",
|
36
36
|
"lib/apidragon/argbucket.rb",
|
37
|
+
"lib/apidragon/log.rb",
|
37
38
|
"lib/apidragon/macro.rb",
|
38
39
|
"lib/apidragon/parser.rb",
|
39
40
|
"test/helper.rb",
|
data/lib/apidragon/api.rb
CHANGED
@@ -6,6 +6,8 @@ require_relative 'macro'
|
|
6
6
|
require_relative 'argbucket'
|
7
7
|
|
8
8
|
CONFIG = '/tmp/apidragonconf.yaml'
|
9
|
+
PLUGINS = '/tmp/apidragonplugins/'
|
10
|
+
LOG = '/tmp/apidragon.log'
|
9
11
|
|
10
12
|
class Api < ArgBucket
|
11
13
|
# Uses the configuration data in config.yaml to run a sequence of api calls.
|
@@ -21,27 +23,19 @@ class Api < ArgBucket
|
|
21
23
|
if @macro.nil? then fail "Command: '#{macro_name}' is not defined." end
|
22
24
|
end
|
23
25
|
|
24
|
-
def macro_init
|
25
|
-
macro = @macro
|
26
|
-
@macro = []
|
27
|
-
macro.each_pair do |key, value|
|
28
|
-
@macro << Call.new(value['input'], value['output'], value['mode'], value['function'], @arg_bucket)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
26
|
def load_config
|
33
27
|
YAML.load_file CONFIG
|
34
28
|
end
|
35
29
|
|
36
30
|
def go
|
37
31
|
@macro.each_pair do |key, value|
|
38
|
-
call = Call.new(value['input'], value['output'], value['mode'], value['function'], @arg_bucket)
|
32
|
+
call = Call.new(value['input'], value['output'], value['mode'], value['function'], @arg_bucket, value['logging'], value['plugin'])
|
39
33
|
@arg_bucket = call.run
|
40
34
|
if !value['record'].nil?
|
41
35
|
value['record'].each do |var|
|
42
36
|
add_config_var var, get(var)
|
43
37
|
end
|
44
|
-
end
|
38
|
+
end
|
45
39
|
end
|
46
40
|
end
|
47
41
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class ResponseLogger
|
2
|
+
|
3
|
+
def object_log(function, code, body)
|
4
|
+
log = File.open "#{LOG}", 'a+'
|
5
|
+
log.write "call @ #{timestamp}"
|
6
|
+
log.write "HTTP #{code}\n"
|
7
|
+
log.write body
|
8
|
+
log.write "\n"
|
9
|
+
log.close
|
10
|
+
end
|
11
|
+
|
12
|
+
def string_log(function, response)
|
13
|
+
log = File.open "#{LOG}", 'a+'
|
14
|
+
log.write "call @ #{timestamp}"
|
15
|
+
log.write response
|
16
|
+
log.write "\n"
|
17
|
+
log.close
|
18
|
+
end
|
19
|
+
|
20
|
+
def timestamp
|
21
|
+
`date`
|
22
|
+
end
|
23
|
+
end
|
data/lib/apidragon/macro.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require_relative 'parser'
|
2
2
|
require_relative 'argbucket'
|
3
|
+
require_relative 'log'
|
3
4
|
|
4
5
|
class Call < ArgBucket
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
def initialize(input, output, mode, function, args)
|
7
|
+
def initialize(input, output, mode, function, args, logging=false, plugin=nil)
|
9
8
|
@arg_bucket = args
|
9
|
+
require_relative "#{PLUGINS}#{plugin}" unless plugin.nil?
|
10
10
|
username = get 'username'
|
11
11
|
password = get 'password'
|
12
12
|
check_constraints mode, function
|
@@ -15,13 +15,14 @@ class Call < ArgBucket
|
|
15
15
|
@mode = mode
|
16
16
|
@output = output
|
17
17
|
@input = input
|
18
|
+
@logging = logging
|
18
19
|
set_call_args unless input.nil?
|
19
20
|
end
|
20
21
|
|
21
22
|
def check_constraints(mode, function)
|
22
23
|
if mode.nil? then fail '"mode" not set. syntax= mode: get/post/put/delete.' end
|
23
24
|
if function.nil? then fail '"function" not set. syntax= function: api-url.' end
|
24
|
-
puts "WARNING: 'function' should have basic auth. (example syntax= function: username:password@example.com/apicall)" unless function.include?('username') && function.include?('password')
|
25
|
+
puts "WARNING: 'function' should have basic auth. (example syntax= function: username:password@example.com/apicall)" unless function.include?('username') && function.include?('password') || @mode == 'eval'
|
25
26
|
end
|
26
27
|
|
27
28
|
def credential_sub(username, password)
|
@@ -55,17 +56,19 @@ class Call < ArgBucket
|
|
55
56
|
puts "making a delete: #{@function} with #{@input}"
|
56
57
|
@response = RestClient.delete @function, params: @input
|
57
58
|
when 'curl_get'
|
58
|
-
command = "curl --url #{@function}"
|
59
|
+
command = "curl -v --url #{@function}"
|
59
60
|
@input.each_pair do |key, value|
|
60
61
|
command << " -F #{key}='#{value}'"
|
61
62
|
end
|
62
63
|
@response = `#{command}`
|
63
64
|
when 'curl_post'
|
64
|
-
command = "curl -X POST --url #{@function}"
|
65
|
+
command = "curl -v -X POST --url #{@function}"
|
65
66
|
@input.each_pair do |key, value|
|
66
67
|
command << " -F #{key}='#{value}'"
|
67
68
|
end
|
68
69
|
@response = `#{command}`
|
70
|
+
when 'eval'
|
71
|
+
@response = eval(@function)
|
69
72
|
else
|
70
73
|
puts "#{@mode} not supported."
|
71
74
|
end
|
@@ -74,15 +77,20 @@ class Call < ArgBucket
|
|
74
77
|
rescue RestClient::Exception
|
75
78
|
puts 'Internal Error or requested resource was not found.'
|
76
79
|
end
|
77
|
-
|
78
|
-
|
80
|
+
if !@response.nil?
|
81
|
+
log_response unless @logging == false
|
82
|
+
parse_response unless @output.nil?
|
83
|
+
end
|
79
84
|
return @arg_bucket
|
80
85
|
end
|
81
86
|
|
82
87
|
def log_response
|
83
|
-
|
84
|
-
|
85
|
-
|
88
|
+
logger = ResponseLogger.new
|
89
|
+
if !@response.is_a? String
|
90
|
+
logger.object_log @function, @response.code, @response.body
|
91
|
+
else
|
92
|
+
logger.string_log @function, @response
|
93
|
+
end
|
86
94
|
end
|
87
95
|
|
88
96
|
def xml_to_json
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apidragon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- isaiah thiessen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -257,6 +257,7 @@ files:
|
|
257
257
|
- lib/apidragon.rb
|
258
258
|
- lib/apidragon/api.rb
|
259
259
|
- lib/apidragon/argbucket.rb
|
260
|
+
- lib/apidragon/log.rb
|
260
261
|
- lib/apidragon/macro.rb
|
261
262
|
- lib/apidragon/parser.rb
|
262
263
|
- test/helper.rb
|