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