Class: Gemstar::PyPIMetadata

Inherits:
Object
  • Object
show all
Defined in:
lib/gemstar/pypi_metadata.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(package_name) ⇒ PyPIMetadata

Returns a new instance of PyPIMetadata.



8
9
10
# File 'lib/gemstar/pypi_metadata.rb', line 8

def initialize(package_name)
  @package_name = package_name
end

Instance Attribute Details

#package_nameObject (readonly) Also known as: gem_name

Returns the value of attribute package_name.



12
13
14
# File 'lib/gemstar/pypi_metadata.rb', line 12

def package_name
  @package_name
end

Instance Method Details

#cache_keyObject



16
17
18
# File 'lib/gemstar/pypi_metadata.rb', line 16

def cache_key
  "pypi-#{package_name}"
end

#changelog_sections(versions: nil, cache_only: false, force_refresh: false, use_github_cli: false) ⇒ Object



57
58
59
60
61
62
63
64
65
# File 'lib/gemstar/pypi_metadata.rb', line 57

def changelog_sections(versions: nil, cache_only: false, force_refresh: false, use_github_cli: false)
  requested_versions = Array(versions).compact
  changelog = Gemstar::ChangeLog.new(self)
  if requested_versions.empty?
    changelog.sections(cache_only: cache_only, force_refresh: force_refresh)
  else
    changelog.sections_for_versions(requested_versions, cache_only: cache_only, force_refresh: force_refresh, use_github_cli: use_github_cli)
  end
end

#discover_github_tag_sections?Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/gemstar/pypi_metadata.rb', line 85

def discover_github_tag_sections?
  true
end

#github_tag_candidates(version) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/gemstar/pypi_metadata.rb', line 89

def github_tag_candidates(version)
  raw = version.to_s
  candidates = [raw, (raw.start_with?("v") ? raw : "v#{raw}")]
  candidates << "release_#{raw}"
  candidates << "release_v#{raw}" unless raw.start_with?("v")

  if raw.match?(/\A\d+\.\d\z/)
    padded_minor = "#{raw}0"
    candidates << padded_minor
    candidates << "v#{padded_minor}"
    candidates << "release_#{padded_minor}"
    candidates << "release_v#{padded_minor}"
  end

  if raw.match?(/\A\d{4}\.\d{1,2}\.\d{1,2}\z/)
    year, month, day = raw.split(".")
    dotted_date = [year, month.rjust(2, "0"), day.rjust(2, "0")].join(".")
    candidates << dotted_date
    candidates << "v#{dotted_date}"
    candidates << "release_#{dotted_date}"
    candidates << "release_v#{dotted_date}"
  end

  candidates.uniq
end

#github_tag_matches?(_tag_name) ⇒ Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/gemstar/pypi_metadata.rb', line 115

def github_tag_matches?(_tag_name)
  true
end

#meta(cache_only: false, force_refresh: false) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/gemstar/pypi_metadata.rb', line 20

def meta(cache_only: false, force_refresh: false)
  return @meta if !cache_only && defined?(@meta)

  json = if cache_only
    Cache.peek(cache_key)
  else
    url = "https://pypi.org/pypi/#{URI.encode_www_form_component(package_name)}/json"
    Cache.fetch(cache_key, force: force_refresh) do
      URI.parse(url).open(read_timeout: 8).read
    end
  end

  parsed = begin
    JSON.parse(json) if json
  rescue
    nil
  end

  normalized = normalize_meta(parsed)
  @meta = normalized unless cache_only
  normalized
end

#registry_release_dates(cache_only: false, force_refresh: false) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/gemstar/pypi_metadata.rb', line 67

def registry_release_dates(cache_only: false, force_refresh: false)
  parsed = raw_meta(cache_only: cache_only, force_refresh: force_refresh)
  Array(parsed&.dig("releases")).each_with_object({}) do |(version, files), dates|
    uploaded_at = Array(files).filter_map { |file| file["upload_time_iso_8601"] || file["upload_time"] }.min
    next if version.to_s.empty? || uploaded_at.to_s.empty?

    dates[version] = Time.parse(uploaded_at).utc.strftime("%b %-d, %Y")
  end
rescue JSON::ParserError, ArgumentError
  {}
end

#repo_uri(cache_only: false, force_refresh: false) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/gemstar/pypi_metadata.rb', line 43

def repo_uri(cache_only: false, force_refresh: false)
  resolved_meta = meta(cache_only: cache_only, force_refresh: force_refresh)
  return nil unless resolved_meta

  return @repo_uri if !cache_only && defined?(@repo_uri)

  uri = resolved_meta["source_code_uri"]
  uri ||= resolved_meta["homepage_uri"] if resolved_meta["homepage_uri"].to_s.include?("github.com")
  uri = normalize_repo_uri(uri)

  @repo_uri = uri unless cache_only
  uri
end

#warm_cache(versions: nil) ⇒ Object



79
80
81
82
83
# File 'lib/gemstar/pypi_metadata.rb', line 79

def warm_cache(versions: nil)
  meta
  repo_uri
  changelog_sections(versions: versions)
end