Class: Gem::Skill::Fetcher

Inherits:
Object
  • Object
show all
Defined in:
lib/gem/skill/fetcher.rb

Overview

Fetches documentation for a gem from multiple sources, in priority order:

1. Local gem installation (Gem::Specification) — metadata + README + CHANGELOG + examples
2. RubyGems API — metadata only, when gem isn't installed locally
3. GitHub raw README — when gem isn't installed locally

Constant Summary collapse

RUBYGEMS_API =
"https://rubygems.org/api/v1/gems/%s.json"
GITHUB_RAW =
"https://raw.githubusercontent.com/%s/%s/%s"
MAX_REDIRECTS =
5
OPEN_TIMEOUT =
5
READ_TIMEOUT =
10
README_CANDIDATES =
%w[README.md README.rdoc README.txt README].freeze
CHANGELOG_CANDIDATES =
%w[CHANGELOG.md CHANGELOG.rdoc HISTORY.md CHANGES.md].freeze
SOURCE_MAX_CHARS =

Cap on concatenated source size handed to the verifier, to protect the context window on large gems. Files are added whole until the cap is hit.

150_000

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(gem_name, version) ⇒ Fetcher

Returns a new instance of Fetcher.



28
29
30
31
# File 'lib/gem/skill/fetcher.rb', line 28

def initialize(gem_name, version)
  @gem_name = gem_name
  @version  = version
end

Instance Attribute Details

#gem_nameObject (readonly)

Returns the value of attribute gem_name.



26
27
28
# File 'lib/gem/skill/fetcher.rb', line 26

def gem_name
  @gem_name
end

#versionObject (readonly)

Returns the value of attribute version.



26
27
28
# File 'lib/gem/skill/fetcher.rb', line 26

def version
  @version
end

Instance Method Details

#changelogObject



51
52
53
# File 'lib/gem/skill/fetcher.rb', line 51

def changelog
  @changelog ||= local_file(*CHANGELOG_CANDIDATES)
end

#examplesObject



55
56
57
# File 'lib/gem/skill/fetcher.rb', line 55

def examples
  @examples ||= local_examples
end

#fetch_allObject

Returns a hash of source_name => content strings (only populated keys).



34
35
36
37
38
39
40
41
# File 'lib/gem/skill/fetcher.rb', line 34

def fetch_all
  {
    metadata:  ,
    readme:    readme,
    changelog: changelog,
    examples:  examples
  }.compact
end

#metadataObject



43
44
45
# File 'lib/gem/skill/fetcher.rb', line 43

def 
  @metadata ||=  || 
end

#readmeObject



47
48
49
# File 'lib/gem/skill/fetcher.rb', line 47

def readme
  @readme ||= local_file(*README_CANDIDATES) || github_readme
end

#source_codeObject

The gem’s actual Ruby source (lib/*/.rb), concatenated with per-file headers. This is the ground truth the verifier checks the skill against. Returns nil when the gem isn’t installed locally or has no lib sources —verification is only possible against installed source.



63
64
65
# File 'lib/gem/skill/fetcher.rb', line 63

def source_code
  source_bundle&.fetch(:code)
end