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.
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
+ }