Class: Gemview::Gem

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

Defined Under Namespace

Classes: Dependency, Version

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Gem

Returns a new instance of Gem.

Parameters:

  • options (Hash)


23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/gemview/gem.rb', line 23

def initialize(options)
  @name = options.fetch("name")
  @downloads = options.fetch("downloads")
  @version = options.fetch("version")
  @version_downloads = options.fetch("version_downloads")
  # Note: This is not returned by `Gems.search`.
  @version_created_at = options["version_created_at"]
    &.then { |time| Time.parse(time) }
  @authors = options.fetch("authors")
  @info = options.fetch("info")
  # Note: This is occasionally nil so a default value is required.
  @licenses = (options.fetch("licenses") || []).freeze
  @project_uri = options.fetch("project_uri")
  @homepage_uri = options.fetch("homepage_uri")
  @source_code_uri = options.fetch("source_code_uri")
  @changelog_uri = options.fetch("changelog_uri")
  # Note: Dependencies are not returned by `Gems.search`.
  @development_dependencies = options
    .dig("dependencies", "development")
    &.map { |hash| Dependency.new(hash).freeze }
    &.freeze
  @runtime_dependencies = options
    .dig("dependencies", "runtime")
    &.map { |hash| Dependency.new(hash).freeze }
    &.freeze
end

Instance Attribute Details

#authorsObject (readonly)

Returns the value of attribute authors.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def authors
  @authors
end

#changelog_uriObject (readonly)

Returns the value of attribute changelog_uri.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def changelog_uri
  @changelog_uri
end

#development_dependenciesObject (readonly)

Returns the value of attribute development_dependencies.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def development_dependencies
  @development_dependencies
end

#downloadsObject (readonly)

Returns the value of attribute downloads.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def downloads
  @downloads
end

#homepage_uriObject (readonly)

Returns the value of attribute homepage_uri.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def homepage_uri
  @homepage_uri
end

#infoObject (readonly)

Returns the value of attribute info.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def info
  @info
end

#licensesObject (readonly)

Returns the value of attribute licenses.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def licenses
  @licenses
end

#nameObject (readonly)

Returns the value of attribute name.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def name
  @name
end

#project_uriObject (readonly)

Returns the value of attribute project_uri.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def project_uri
  @project_uri
end

#runtime_dependenciesObject (readonly)

Returns the value of attribute runtime_dependencies.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def runtime_dependencies
  @runtime_dependencies
end

#source_code_uriObject (readonly)

Returns the value of attribute source_code_uri.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def source_code_uri
  @source_code_uri
end

#versionObject (readonly)

Returns the value of attribute version.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def version
  @version
end

#version_created_atObject (readonly)

Returns the value of attribute version_created_at.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def version_created_at
  @version_created_at
end

#version_downloadsObject (readonly)

Returns the value of attribute version_downloads.



5
6
7
# File 'lib/gemview/gem.rb', line 5

def version_downloads
  @version_downloads
end

Class Method Details

.author(username:) ⇒ Array<Gemview::Gem>

Parameters:

  • username (String)

    rubygems.org username

Returns:



225
226
227
# File 'lib/gemview/gem.rb', line 225

def self.author(username:)
  Client.v1.gems(username).map { |gem_hash| new(gem_hash) }
end

.find(name:, version: nil) ⇒ Gemview::Gem

Parameters:

  • name (String)
  • version (String, nil) (defaults to: nil)

    will default to latest if not provided

Returns:



207
208
209
210
211
212
213
214
215
# File 'lib/gemview/gem.rb', line 207

def self.find(name:, version: nil)
  @find ||= {}
  @find[[name, version]] ||= new case version
                             when String
                               Client.v2.info(name, version)
                             else
                               Client.v1.info(name)
                             end
end

.just_updatedArray<Gemview::Gem>

Returns:



235
236
237
# File 'lib/gemview/gem.rb', line 235

def self.just_updated
  Client.v1.just_updated.map { |gem_hash| new(gem_hash) }
end

.latestArray<Gemview::Gem>

Returns:



230
231
232
# File 'lib/gemview/gem.rb', line 230

def self.latest
  Client.v1.latest.map { |gem_hash| new(gem_hash) }
end

.search(term:) ⇒ Array<Gemview::Gem>

Parameters:

  • term (String)

    search term

Returns:



219
220
221
# File 'lib/gemview/gem.rb', line 219

def self.search(term:)
  Client.v1.search(term).map { |gem_hash| new(gem_hash) }
end

.versions(name:) ⇒ Array<Gemview::Gem::Version>

Parameters:

  • name (String)

    gem name

Returns:



241
242
243
244
# File 'lib/gemview/gem.rb', line 241

def self.versions(name:)
  @versions ||= {}
  @versions[name] ||= Client.v1.versions(name).map { |gem_hash| Version.new(gem_hash).freeze }.freeze
end

Instance Method Details

#changelogString?

Returns:

  • (String, nil)


202
# File 'lib/gemview/gem.rb', line 202

def changelog = git_repo&.changelog

#changelog?Boolean

Returns:

  • (Boolean)


199
# File 'lib/gemview/gem.rb', line 199

def changelog? = git_repo? && git_repo.changelog?

#dependencies?Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/gemview/gem.rb', line 126

def dependencies?
  !runtime_dependencies.nil? && !development_dependencies.nil?
end

#dependencies_strString

Returns:

  • (String)


131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/gemview/gem.rb', line 131

def dependencies_str
  runtime_deps_str = runtime_dependencies.join("\n").strip
  runtime_deps_str = if runtime_deps_str.empty?
    "(none)"
  else
    "```rb\n#{runtime_deps_str}\n```"
  end

  dev_deps_str = development_dependencies.join("\n").strip
  dev_deps_str = if dev_deps_str.empty?
    "(none)"
  else
    "```rb\n#{dev_deps_str}\n```"
  end

  dependencies = <<~DEPENDENCIES
    ## [Dependencies]

    ### Runtime Dependencies:
    #{runtime_deps_str}

    ### Development Dependencies:
    #{dev_deps_str}
  DEPENDENCIES

  Terminal.prettify_markdown(dependencies)
end

#git_repoGemview::GitRepo?

Returns:



178
179
180
181
182
183
184
185
186
187
# File 'lib/gemview/gem.rb', line 178

def git_repo
  return @git_repo if defined? @git_repo

  @git_repo = GitRepo.from_urls(
    homepage_uri: homepage_uri,
    source_code_uri: source_code_uri,
    changelog_uri: changelog_uri,
    version: version
  )
end

#git_repo?Boolean

Returns:

  • (Boolean)


190
# File 'lib/gemview/gem.rb', line 190

def git_repo? = !git_repo.nil?

#header_strString

Returns:

  • (String)


100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/gemview/gem.rb', line 100

def header_str
  info_lines = Strings.wrap(info.gsub(/\s+/, " ").strip, 79).lines.map(&:strip)

  if info_lines.size > 3
    info_lines = info_lines.take(3)
    info_lines.last << ""
  end

  header = <<~HEADER
    ## [#{version}] #{name}
    
    ```
    #{info_lines.join("\n")}
    ```

    | Updated at       | #{version_created_at}  |
    | Total Downloads  | #{humanized_downloads} |
    | Authors          | #{authors}             |
    | Licenses         | #{licenses}            |
    | Project URI      | #{project_uri}         |
  HEADER

  Terminal.prettify_markdown(header)
end

#humanized_downloadsString

Ex. 1234567890 -> “1,234,567,890”

Returns:

  • (String)


78
79
80
# File 'lib/gemview/gem.rb', line 78

def humanized_downloads
  Number.humanized_integer(downloads)
end

#readmeString?

Returns:

  • (String, nil)


196
# File 'lib/gemview/gem.rb', line 196

def readme = git_repo&.readme

#readme?Boolean

Returns:

  • (Boolean)


193
# File 'lib/gemview/gem.rb', line 193

def readme? = git_repo? && git_repo.readme?

#selector_strString

Returns:

  • (String)


83
84
85
86
87
88
89
90
# File 'lib/gemview/gem.rb', line 83

def selector_str
  one_line_info = info.gsub(/\s+/, " ").strip

  <<~SELECT
    #{name} [#{version}]
      -- #{Strings.truncate(one_line_info, 75)}
  SELECT
end

#title_str(subsection:) ⇒ String

Returns:

  • (String)


93
94
95
96
97
# File 'lib/gemview/gem.rb', line 93

def title_str(subsection:)
  Terminal.prettify_markdown(<<~LINE)
    ## [#{version}] #{name} >> #{subsection}
  LINE
end

#versions_strString

Returns:

  • (String)


160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/gemview/gem.rb', line 160

def versions_str
  rows = self.class.versions(name: name).map do |version|
    pretty_downloads = Number.humanized_integer(version.downloads)
    "| #{version.release_date} | #{version.version} | #{pretty_downloads} | #{version.ruby_version}"
  end

  table = <<~TABLE
    ## [Versions]

    | *Release Date* | *Gem Version* | *Downloads* | *Ruby Version* |
    |----------------|---------------|-------------|----------------|
    #{rows.join("\n")}
  TABLE

  Terminal.prettify_markdown(table)
end