haveapi-go-client 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/README.md +64 -0
- data/bin/haveapi-go-client +3 -0
- data/haveapi-go-client.gemspec +25 -0
- data/lib/haveapi/go_client/action.rb +128 -0
- data/lib/haveapi/go_client/api_version.rb +21 -0
- data/lib/haveapi/go_client/authentication/base.rb +13 -0
- data/lib/haveapi/go_client/authentication/basic.rb +21 -0
- data/lib/haveapi/go_client/authentication/token.rb +56 -0
- data/lib/haveapi/go_client/authentication/unsupported.rb +13 -0
- data/lib/haveapi/go_client/authentication_methods.rb +24 -0
- data/lib/haveapi/go_client/cli.rb +39 -0
- data/lib/haveapi/go_client/erb_template.rb +46 -0
- data/lib/haveapi/go_client/generator.rb +65 -0
- data/lib/haveapi/go_client/input_output.rb +48 -0
- data/lib/haveapi/go_client/metadata.rb +63 -0
- data/lib/haveapi/go_client/parameter.rb +27 -0
- data/lib/haveapi/go_client/parameters/association.rb +54 -0
- data/lib/haveapi/go_client/parameters/base.rb +66 -0
- data/lib/haveapi/go_client/parameters/global_meta_includes.rb +17 -0
- data/lib/haveapi/go_client/parameters/resource.rb +20 -0
- data/lib/haveapi/go_client/parameters/typed.rb +30 -0
- data/lib/haveapi/go_client/resource.rb +133 -0
- data/lib/haveapi/go_client/utils.rb +10 -0
- data/lib/haveapi/go_client/version.rb +5 -0
- data/lib/haveapi/go_client.rb +21 -0
- data/shell.nix +23 -0
- data/template/action.go.erb +475 -0
- data/template/authentication/basic.go.erb +22 -0
- data/template/authentication/token.go.erb +164 -0
- data/template/authentication.go.erb +10 -0
- data/template/client.go.erb +26 -0
- data/template/go.mod.erb +1 -0
- data/template/request.go.erb +96 -0
- data/template/resource.go.erb +36 -0
- data/template/response.go.erb +13 -0
- data/template/types.go.erb +41 -0
- metadata +125 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'haveapi/go_client/utils'
|
2
|
+
|
3
|
+
module HaveAPI::GoClient
|
4
|
+
class Parameters::Association
|
5
|
+
include Utils
|
6
|
+
|
7
|
+
# @return [Parameter]
|
8
|
+
attr_reader :parameter
|
9
|
+
|
10
|
+
# @return [String]
|
11
|
+
attr_reader :go_type
|
12
|
+
|
13
|
+
# @return [String]
|
14
|
+
attr_reader :go_value_id
|
15
|
+
|
16
|
+
# @return [String]
|
17
|
+
attr_reader :go_value_label
|
18
|
+
|
19
|
+
# @return [Resource]
|
20
|
+
attr_reader :resource
|
21
|
+
|
22
|
+
def initialize(param, desc)
|
23
|
+
@parameter = param
|
24
|
+
@resource = find_resource(desc[:resource])
|
25
|
+
@go_type = resource.actions.detect { |a| a.name == 'show' }.output.go_type
|
26
|
+
@go_value_id = camelize(desc[:value_id])
|
27
|
+
@go_value_label = camelize(desc[:value_label])
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
def find_resource(path)
|
32
|
+
root = parameter.io.action.resource.api_version
|
33
|
+
path = path.clone
|
34
|
+
|
35
|
+
loop do
|
36
|
+
name = path.shift
|
37
|
+
resource = root.resources.detect { |r| r.name == name }
|
38
|
+
|
39
|
+
if resource.nil?
|
40
|
+
fail "associated resource '#{name}' not found in "+
|
41
|
+
(root.is_a?(ApiVersion) ? 'root' : root.resource_path.map(&:name).join('.'))
|
42
|
+
|
43
|
+
elsif path.empty?
|
44
|
+
return resource
|
45
|
+
|
46
|
+
else
|
47
|
+
root = resource
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
fail 'programming error'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'haveapi/go_client/utils'
|
2
|
+
|
3
|
+
module HaveAPI::GoClient
|
4
|
+
class Parameters::Base
|
5
|
+
include Utils
|
6
|
+
|
7
|
+
# Register the parameter handler
|
8
|
+
#
|
9
|
+
# The block is called whenever a new parameter is to be instantiated. If
|
10
|
+
# this class supports the parameter, the block returns true, else false.
|
11
|
+
# The first class to return true is used.
|
12
|
+
#
|
13
|
+
# @yieldparam role [Symbol]
|
14
|
+
# @yieldparam direction [Symbol]
|
15
|
+
# @yieldparam name [String]
|
16
|
+
# @yieldparam desc [Hash]
|
17
|
+
# @yiledreturn [Boolean, nil]
|
18
|
+
def self.handle(&block)
|
19
|
+
Parameter.register(self, block)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [InputOutput]
|
23
|
+
attr_reader :io
|
24
|
+
|
25
|
+
# Parameter name in the API
|
26
|
+
# @return [String]
|
27
|
+
attr_reader :name
|
28
|
+
|
29
|
+
# HaveAPI data type
|
30
|
+
# @return [String]
|
31
|
+
attr_reader :type
|
32
|
+
|
33
|
+
# Parameter name in Go
|
34
|
+
# @return [String]
|
35
|
+
attr_reader :go_name
|
36
|
+
|
37
|
+
# Go type for action input
|
38
|
+
# @return [String]
|
39
|
+
attr_reader :go_in_type
|
40
|
+
|
41
|
+
# Go type for action output
|
42
|
+
# @return [String]
|
43
|
+
attr_reader :go_out_type
|
44
|
+
|
45
|
+
def initialize(io, name, desc)
|
46
|
+
@io = io
|
47
|
+
@name = name
|
48
|
+
@type = desc[:type]
|
49
|
+
@desc = desc
|
50
|
+
@go_name = camelize(name)
|
51
|
+
end
|
52
|
+
|
53
|
+
def resolve
|
54
|
+
do_resolve
|
55
|
+
@desc = nil
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
# @return [Hash]
|
60
|
+
attr_reader :desc
|
61
|
+
|
62
|
+
def do_resolve
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'haveapi/go_client/parameters/base'
|
2
|
+
|
3
|
+
module HaveAPI::GoClient
|
4
|
+
class Parameters::GlobalMetaIncludes < Parameters::Base
|
5
|
+
handle do |role, direction, name, desc|
|
6
|
+
role == :global_meta \
|
7
|
+
&& direction == :input \
|
8
|
+
&& name == 'includes' \
|
9
|
+
&& desc[:type] == 'Custom'
|
10
|
+
end
|
11
|
+
|
12
|
+
protected
|
13
|
+
def do_resolve
|
14
|
+
@go_in_type = @go_out_type = 'string'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'haveapi/go_client/parameters/base'
|
2
|
+
|
3
|
+
module HaveAPI::GoClient
|
4
|
+
class Parameters::Resource < Parameters::Base
|
5
|
+
handle do |role, direction, name, desc|
|
6
|
+
desc[:type] == 'Resource'
|
7
|
+
end
|
8
|
+
|
9
|
+
# Pointer to the associated resource
|
10
|
+
# @return [Parameters::Association]
|
11
|
+
attr_reader :association
|
12
|
+
|
13
|
+
protected
|
14
|
+
def do_resolve
|
15
|
+
@association = Parameters::Association.new(self, desc)
|
16
|
+
@go_in_type = 'int64'
|
17
|
+
@go_out_type = association.go_type
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'haveapi/go_client/parameters/base'
|
2
|
+
|
3
|
+
module HaveAPI::GoClient
|
4
|
+
class Parameters::Typed < Parameters::Base
|
5
|
+
handle do |role, direction, name, desc|
|
6
|
+
!%w(Custom Resource).include?(desc[:type])
|
7
|
+
end
|
8
|
+
|
9
|
+
protected
|
10
|
+
def do_resolve
|
11
|
+
@go_in_type = get_go_type(desc[:type])
|
12
|
+
@go_out_type = get_go_type(desc[:type])
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_go_type(v)
|
16
|
+
case v
|
17
|
+
when 'String', 'Text', 'Datetime'
|
18
|
+
'string'
|
19
|
+
when 'Integer'
|
20
|
+
'int64'
|
21
|
+
when 'Float'
|
22
|
+
'float64'
|
23
|
+
when 'Boolean'
|
24
|
+
'bool'
|
25
|
+
else
|
26
|
+
fail "unsupported data type '#{v}'"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'haveapi/go_client/utils'
|
2
|
+
|
3
|
+
module HaveAPI::GoClient
|
4
|
+
class Resource
|
5
|
+
include Utils
|
6
|
+
|
7
|
+
# Resource name as returned by the API
|
8
|
+
# @return [String]
|
9
|
+
attr_reader :name
|
10
|
+
|
11
|
+
# Parent resource or API version
|
12
|
+
# @return [ApiServer, Resource]
|
13
|
+
attr_reader :parent
|
14
|
+
|
15
|
+
# Full name with underscores
|
16
|
+
# @return [String]
|
17
|
+
attr_reader :full_name
|
18
|
+
|
19
|
+
# Full name with dots
|
20
|
+
# @return [String]
|
21
|
+
attr_reader :full_dot_name
|
22
|
+
|
23
|
+
# Name in Go
|
24
|
+
# @return [String]
|
25
|
+
attr_reader :go_name
|
26
|
+
|
27
|
+
# Type in Go
|
28
|
+
# @return [String]
|
29
|
+
attr_reader :go_type
|
30
|
+
|
31
|
+
# Child resources
|
32
|
+
# @return [Array<Resource>]
|
33
|
+
attr_reader :resources
|
34
|
+
|
35
|
+
# Resource actions
|
36
|
+
# @return [Array<Action>]
|
37
|
+
attr_reader :actions
|
38
|
+
|
39
|
+
def initialize(parent, name, desc, prefix: nil)
|
40
|
+
@parent = parent
|
41
|
+
@name = name.to_s
|
42
|
+
@prefix = prefix
|
43
|
+
@full_name = resource_path.map(&:name).join('_')
|
44
|
+
@full_dot_name = resource_path.map(&:name).map(&:capitalize).join('.')
|
45
|
+
@go_name = camelize(name)
|
46
|
+
@go_type = full_go_type
|
47
|
+
@resources = desc[:resources].map { |k, v| Resource.new(self, k, v) }
|
48
|
+
@actions = desc[:actions].map do |k, v|
|
49
|
+
Action.new(self, k.to_s, v, prefix: prefix)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# @return [ApiVersion]
|
54
|
+
def api_version
|
55
|
+
tmp = parent
|
56
|
+
tmp = tmp.parent until tmp.is_a?(ApiVersion)
|
57
|
+
tmp
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [Array<Resource>]
|
61
|
+
def parent_resources
|
62
|
+
parents = []
|
63
|
+
tmp = parent
|
64
|
+
|
65
|
+
while tmp.is_a?(Resource)
|
66
|
+
parents << tmp
|
67
|
+
tmp = tmp.parent
|
68
|
+
end
|
69
|
+
|
70
|
+
parents.reverse
|
71
|
+
end
|
72
|
+
|
73
|
+
# @return [Array<Resource>]
|
74
|
+
def resource_path
|
75
|
+
parent_resources + [self]
|
76
|
+
end
|
77
|
+
|
78
|
+
def resolve_associations
|
79
|
+
actions.each { |a| a.resolve_associations }
|
80
|
+
resources.each { |r| r.resolve_associations }
|
81
|
+
end
|
82
|
+
|
83
|
+
def generate(gen)
|
84
|
+
ErbTemplate.render_to_if_changed(
|
85
|
+
'resource.go',
|
86
|
+
{
|
87
|
+
package: gen.package,
|
88
|
+
resource: self,
|
89
|
+
},
|
90
|
+
File.join(gen.dst, prefix_underscore("resource_#{full_name}.go"))
|
91
|
+
)
|
92
|
+
|
93
|
+
resources.each { |r| r.generate(gen) }
|
94
|
+
|
95
|
+
actions.each do |a|
|
96
|
+
ErbTemplate.render_to_if_changed(
|
97
|
+
'action.go',
|
98
|
+
{
|
99
|
+
package: gen.package,
|
100
|
+
action: a,
|
101
|
+
},
|
102
|
+
File.join(gen.dst, prefix_underscore("resource_#{full_name}_action_#{a.name}.go"))
|
103
|
+
)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
protected
|
108
|
+
attr_reader :prefix
|
109
|
+
|
110
|
+
def prefix_underscore(s)
|
111
|
+
if prefix
|
112
|
+
"#{prefix}_#{s}"
|
113
|
+
else
|
114
|
+
s
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def prefix_camel(s)
|
119
|
+
if prefix
|
120
|
+
camelize(prefix) + s
|
121
|
+
else
|
122
|
+
s
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def full_go_type
|
127
|
+
names = ['Resource']
|
128
|
+
names.concat(parent_resources.map(&:go_name))
|
129
|
+
names << go_name
|
130
|
+
prefix_camel(names.join(''))
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'require_all'
|
2
|
+
|
3
|
+
module HaveAPI
|
4
|
+
module GoClient
|
5
|
+
# @param name [String] template within the `../../template/` directory,
|
6
|
+
# without `.erb` suffix
|
7
|
+
# @return [String] absolute path to the template
|
8
|
+
def self.tpl(name)
|
9
|
+
File.join(
|
10
|
+
File.dirname(__FILE__),
|
11
|
+
'..', '..',
|
12
|
+
'template',
|
13
|
+
"#{name}.erb"
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require_rel 'go_client/*.rb'
|
20
|
+
require_rel 'go_client/authentication'
|
21
|
+
require_rel 'go_client/parameters'
|
data/shell.nix
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
let
|
2
|
+
pkgs = import <nixpkgs> {};
|
3
|
+
stdenv = pkgs.stdenv;
|
4
|
+
|
5
|
+
in stdenv.mkDerivation rec {
|
6
|
+
name = "haveapi-go-client";
|
7
|
+
|
8
|
+
buildInputs = with pkgs;[
|
9
|
+
git
|
10
|
+
go
|
11
|
+
gotools
|
12
|
+
openssl
|
13
|
+
ruby
|
14
|
+
];
|
15
|
+
|
16
|
+
shellHook = ''
|
17
|
+
export GEM_HOME=$(pwd)/.gems
|
18
|
+
export PATH="$GEM_HOME/.gems/bin:$PATH"
|
19
|
+
gem install bundler
|
20
|
+
bundler install
|
21
|
+
#export RUBYOPT=-rbundler/setup
|
22
|
+
'';
|
23
|
+
}
|