haveapi-go-client 0.13.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 +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
|
+
}
|