haveapi-go-client 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/Gemfile +4 -0
  4. data/README.md +64 -0
  5. data/bin/haveapi-go-client +3 -0
  6. data/haveapi-go-client.gemspec +25 -0
  7. data/lib/haveapi/go_client/action.rb +128 -0
  8. data/lib/haveapi/go_client/api_version.rb +21 -0
  9. data/lib/haveapi/go_client/authentication/base.rb +13 -0
  10. data/lib/haveapi/go_client/authentication/basic.rb +21 -0
  11. data/lib/haveapi/go_client/authentication/token.rb +56 -0
  12. data/lib/haveapi/go_client/authentication/unsupported.rb +13 -0
  13. data/lib/haveapi/go_client/authentication_methods.rb +24 -0
  14. data/lib/haveapi/go_client/cli.rb +39 -0
  15. data/lib/haveapi/go_client/erb_template.rb +46 -0
  16. data/lib/haveapi/go_client/generator.rb +65 -0
  17. data/lib/haveapi/go_client/input_output.rb +48 -0
  18. data/lib/haveapi/go_client/metadata.rb +63 -0
  19. data/lib/haveapi/go_client/parameter.rb +27 -0
  20. data/lib/haveapi/go_client/parameters/association.rb +54 -0
  21. data/lib/haveapi/go_client/parameters/base.rb +66 -0
  22. data/lib/haveapi/go_client/parameters/global_meta_includes.rb +17 -0
  23. data/lib/haveapi/go_client/parameters/resource.rb +20 -0
  24. data/lib/haveapi/go_client/parameters/typed.rb +30 -0
  25. data/lib/haveapi/go_client/resource.rb +133 -0
  26. data/lib/haveapi/go_client/utils.rb +10 -0
  27. data/lib/haveapi/go_client/version.rb +5 -0
  28. data/lib/haveapi/go_client.rb +21 -0
  29. data/shell.nix +23 -0
  30. data/template/action.go.erb +475 -0
  31. data/template/authentication/basic.go.erb +22 -0
  32. data/template/authentication/token.go.erb +164 -0
  33. data/template/authentication.go.erb +10 -0
  34. data/template/client.go.erb +26 -0
  35. data/template/go.mod.erb +1 -0
  36. data/template/request.go.erb +96 -0
  37. data/template/resource.go.erb +36 -0
  38. data/template/response.go.erb +13 -0
  39. data/template/types.go.erb +41 -0
  40. 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,10 @@
1
+ module HaveAPI::GoClient
2
+ module Utils
3
+ # Remove underscores and capitalize names
4
+ # @param v [String]
5
+ # @return [String]
6
+ def camelize(v)
7
+ v.to_s.split('_').map(&:capitalize).join('')
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ module HaveAPI
2
+ module GoClient
3
+ VERSION = '0.13.0'
4
+ end
5
+ 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
+ }