Class: Licensed::Sources::Go
- Includes:
- ContentVersioning
- Defined in:
- lib/licensed/sources/go.rb
Constant Summary
Constants included from ContentVersioning
ContentVersioning::CONTENTS, ContentVersioning::GIT
Instance Attribute Summary
Attributes inherited from Source
Instance Method Summary collapse
-
#contents_version_arguments ⇒ Object
Determines the arguments to pass to contents_version based on which version strategy is selected.
- #enabled? ⇒ Boolean
- #enumerate_dependencies ⇒ Object
-
#go_list_deps ⇒ Object
Returns the list of dependencies as returned by “go list -json -deps” available in go 1.11.
-
#go_source? ⇒ Boolean
Returns whether go source is found.
-
#go_std_package?(package) ⇒ Boolean
Returns whether the given package import path belongs to the go std library or not.
-
#go_std_packages ⇒ Object
Returns a list of go standard packages.
-
#gopath ⇒ Object
Returns a GOPATH value from either a configuration value or ENV, with the configuration value preferred over the ENV var.
-
#homepage(import_path) ⇒ Object
Returns the pkg.go.dev page for a package.
-
#local_package?(package) ⇒ Boolean
Returns whether the package is local to the current project.
-
#non_vendored_import_path(package) ⇒ Object
Returns the non-vendored portion of the package import path if vendored, otherwise returns the package’s import path as given.
-
#package_info_command(*args) ⇒ Object
Returns package information as a JSON string.
-
#package_version(package) ⇒ Object
Returns the version for a given package.
-
#packages ⇒ Object
Returns an array of dependency package import paths.
-
#search_root(package) ⇒ Object
Returns the root directory to search for a package license.
-
#vendored_path_parts(package) ⇒ Object
If the package is vendored, returns a Match object containing named :vendor_path and :import_path match groups based on the packages “Dir” value.
Methods included from ContentVersioning
#contents_hash, #contents_version, #git_version, #version_strategy
Methods inherited from Source
#dependencies, full_type, #ignored?, inherited, #initialize, register_source, require_matched_dependency_version, #source_config, type, type_and_version
Constructor Details
This class inherits a constructor from Licensed::Sources::Source
Instance Method Details
#contents_version_arguments ⇒ Object
Determines the arguments to pass to contents_version based on which version strategy is selected
Returns an array of arguments to pass to contents version
114 115 116 117 118 119 120 |
# File 'lib/licensed/sources/go.rb', line 114 def contents_version_arguments if version_strategy == Licensed::Sources::ContentVersioning::GIT ["."] else Dir["*"] end end |
#enabled? ⇒ Boolean
11 12 13 |
# File 'lib/licensed/sources/go.rb', line 11 def enabled? Licensed::Shell.tool_available?("go") && go_source? end |
#enumerate_dependencies ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/licensed/sources/go.rb', line 15 def enumerate_dependencies with_configured_gopath do packages.map do |package| import_path = non_vendored_import_path(package) error = package.dig("Error", "Err") if package["Error"] Dependency.new( name: import_path, version: package_version(package), path: package["Dir"], search_root: search_root(package), errors: Array(error), metadata: { "type" => Go.type, "summary" => package["Doc"], "homepage" => homepage(import_path) } ) end end end |
#go_list_deps ⇒ Object
Returns the list of dependencies as returned by “go list -json -deps” available in go 1.11
48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/licensed/sources/go.rb', line 48 def go_list_deps args = ["-deps"] args << "-mod=vendor" if config.dig("go", "mod") == "vendor" # the CLI command returns packages in a pretty-printed JSON format but # not separated by commas. this gsub adds commas after all non-indented # "}" that close root level objects. # (?!\z) uses negative lookahead to not match the final "}" deps = package_info_command(*args).gsub(/^}(?!\z)$/m, "},") JSON.parse("[#{deps}]") end |
#go_source? ⇒ Boolean
Returns whether go source is found
185 186 187 |
# File 'lib/licensed/sources/go.rb', line 185 def go_source? with_configured_gopath { Licensed::Shell.success?("go", "doc") } end |
#go_std_package?(package) ⇒ Boolean
Returns whether the given package import path belongs to the go std library or not
package - package to check as part of the go standard library
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/licensed/sources/go.rb', line 64 def go_std_package?(package) return false unless package # return true if package self-identifies return true if package["Standard"] import_path = non_vendored_import_path(package) return false unless import_path # check different variations of the import path to match against # what's returned from `go list std` [ import_path, import_path.sub("golang.org", "internal"), import_path.sub("golang.org", "golang_org"), ].any? do |path| # true if go standard packages includes the path or "vendor/<path>" go_std_packages.include?(path) || go_std_packages.include?("vendor/#{path}") end end |
#go_std_packages ⇒ Object
Returns a list of go standard packages
190 191 192 |
# File 'lib/licensed/sources/go.rb', line 190 def go_std_packages @std_packages ||= Licensed::Shell.execute("go", "list", "std").lines.map(&:strip) end |
#gopath ⇒ Object
Returns a GOPATH value from either a configuration value or ENV, with the configuration value preferred over the ENV var
196 197 198 199 200 201 202 203 204 205 |
# File 'lib/licensed/sources/go.rb', line 196 def gopath return @gopath if defined?(@gopath) @gopath = begin path = config.dig("go", "GOPATH") return File.(path, config.root) unless path.to_s.empty? return ENV["GOPATH"] if ENV["GOPATH"] Licensed::Shell.execute("go", "env", "GOPATH") end end |
#homepage(import_path) ⇒ Object
Returns the pkg.go.dev page for a package.
123 124 125 126 |
# File 'lib/licensed/sources/go.rb', line 123 def homepage(import_path) return unless import_path "https://pkg.go.dev/#{import_path}" end |
#local_package?(package) ⇒ Boolean
Returns whether the package is local to the current project
86 87 88 89 90 |
# File 'lib/licensed/sources/go.rb', line 86 def local_package?(package) return false unless package && package["Dir"] return false unless File.fnmatch?("#{config.root}*", package["Dir"], File::FNM_CASEFOLD) vendored_path_parts(package).nil? end |
#non_vendored_import_path(package) ⇒ Object
Returns the non-vendored portion of the package import path if vendored, otherwise returns the package’s import path as given
package - Package to get the non-vendored import path for
168 169 170 171 172 173 174 175 |
# File 'lib/licensed/sources/go.rb', line 168 def non_vendored_import_path(package) return if package.nil? parts = vendored_path_parts(package) return parts[:import_path] if parts # if a package isn't vendored, return the packages "ImportPath" package["ImportPath"] end |
#package_info_command(*args) ⇒ Object
Returns package information as a JSON string
args - additional arguments to ‘go list`, e.g. Go package import path
180 181 182 |
# File 'lib/licensed/sources/go.rb', line 180 def package_info_command(*args) Licensed::Shell.execute("go", "list", "-e", "-json", *Array(args)).strip end |
#package_version(package) ⇒ Object
Returns the version for a given package
package - package to get version of
95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/licensed/sources/go.rb', line 95 def package_version(package) # use module version if it exists go_mod = package["Module"] return go_mod["Version"] if go_mod package_directory = package["Dir"] return unless package_directory && File.exist?(package_directory) # find most recent git SHA for a package, or nil if SHA is # not available Dir.chdir package_directory do contents_version(*contents_version_arguments) end end |
#packages ⇒ Object
Returns an array of dependency package import paths
38 39 40 41 42 43 44 |
# File 'lib/licensed/sources/go.rb', line 38 def packages # don't include go std packages # don't include packages under the root project that aren't vendored go_list_deps .reject { |pkg| go_std_package?(pkg) } .reject { |pkg| local_package?(pkg) } end |
#search_root(package) ⇒ Object
Returns the root directory to search for a package license
package - package object obtained from package_info
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/licensed/sources/go.rb', line 131 def search_root(package) return if package.nil? # search root choices: # 1. module directory if using go modules and directory is available module_dir = package.dig("Module", "Dir") return module_dir if module_dir # 2. vendor folder if package is vendored parts = vendored_path_parts(package) return parts[:vendor_path] if parts # 3. package root value if available return package["Root"] if package["Root"] # 4. GOPATH if the package directory is under the gopath return gopath if package["Dir"]&.start_with?(gopath) # 5. nil nil end |
#vendored_path_parts(package) ⇒ Object
If the package is vendored, returns a Match object containing named :vendor_path and :import_path match groups based on the packages “Dir” value
If the package is not vendored, returns nil
package - Package to get vendored path information for
159 160 161 162 |
# File 'lib/licensed/sources/go.rb', line 159 def vendored_path_parts(package) return if package.nil? || package["Dir"].nil? package["Dir"].match(/^(?<vendor_path>#{config.root}(\/.+)*\/[^\/]*vendor[^\/]*)\/(?<import_path>.+)$/i) end |