Class: Kettle::Rb::GemFloors::Generator
- Inherits:
-
Object
- Object
- Kettle::Rb::GemFloors::Generator
- Defined in:
- lib/kettle/rb/gem_floors/generator.rb
Overview
Regenerates lib/kettle/rb/gem_floors/data.rb for tracked gems from the
rubygems.org versions API and ruby-advisory-db (through bundler-audit).
This is development tooling. It is loaded by the
kettle:rb:gem_floors:generate rake task, never by require "kettle/rb".
For each minor series of a tracked gem the floor is the newest released patch that does not raise the series' original minimum Ruby. When that patch is affected by an advisory but an older compatible patch is not, the newest unaffected patch is used instead. Advisories that still affect the chosen floor are recorded as unpatched.
Constant Summary collapse
- TRACKED =
Tracked gems and the oldest minor series to record for each.
[ ["activemodel", "5.2"], ["activerecord", "5.2"], ["activesupport", "5.2"], ["sqlite3", "1.3"] ].freeze
- DATA_PATH =
File.(File.join(File.dirname(__FILE__), "data.rb"))
- VERSIONS_URL =
"https://rubygems.org/api/v1/versions/%s.json"
Instance Attribute Summary collapse
-
#advisory_db_commit ⇒ String?
readonly
Ruby-advisory-db commit recorded in the data file.
-
#generated_on ⇒ String
readonly
Generation date recorded in the data file.
-
#tracked ⇒ Array<Array(String, String)>
readonly
Tracked gem names and oldest series.
Instance Method Summary collapse
-
#initialize(options = {}) ⇒ Generator
constructor
A new instance of Generator.
-
#render ⇒ String
Ruby source for
data.rb. -
#rows ⇒ Array<Array>
Rows for
GemFloors::ROWS. -
#write(path = DATA_PATH) ⇒ String
Writes the rendered data file.
Constructor Details
#initialize(options = {}) ⇒ Generator
Returns a new instance of Generator.
47 48 49 50 51 52 53 |
# File 'lib/kettle/rb/gem_floors/generator.rb', line 47 def initialize( = {}) @tracked = [:tracked] || TRACKED @versions_fetcher = [:versions_fetcher] || method(:fetch_versions) @advisories_fetcher = [:advisories_fetcher] || method(:fetch_advisories) @advisory_db_commit = .key?(:advisory_db_commit) ? [:advisory_db_commit] : database_commit @generated_on = [:generated_on] || Time.now.utc.strftime("%Y-%m-%d") end |
Instance Attribute Details
#advisory_db_commit ⇒ String? (readonly)
36 37 38 |
# File 'lib/kettle/rb/gem_floors/generator.rb', line 36 def advisory_db_commit @advisory_db_commit end |
#generated_on ⇒ String (readonly)
39 40 41 |
# File 'lib/kettle/rb/gem_floors/generator.rb', line 39 def generated_on @generated_on end |
#tracked ⇒ Array<Array(String, String)> (readonly)
33 34 35 |
# File 'lib/kettle/rb/gem_floors/generator.rb', line 33 def tracked @tracked end |
Instance Method Details
#render ⇒ String
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/kettle/rb/gem_floors/generator.rb', line 65 def render lines = [ "# frozen_string_literal: true", "", "# Generated by `rake kettle:rb:gem_floors:generate`; do not edit by hand.", "# Sources: rubygems.org versions API and ruby-advisory-db.", "", "module Kettle", " module Rb", " module GemFloors", " GENERATED_ON = #{generated_on.inspect}", " ADVISORY_DB_COMMIT = #{advisory_db_commit.inspect}", " TRACKED_GEMS = #{tracked.map { |pair| pair.first }.inspect}.freeze", " ROWS = [" ] lines << rows.map { |row| " #{row.inspect}" }.join(",\n") lines.concat([" ].freeze", " end", " end", "end", ""]) lines.join("\n") end |
#rows ⇒ Array<Array>
56 57 58 59 60 61 62 |
# File 'lib/kettle/rb/gem_floors/generator.rb', line 56 def rows result = [] tracked.each do |gem_name, oldest_series| result.concat(rows_for(gem_name, Gem::Version.new(oldest_series))) end result end |
#write(path = DATA_PATH) ⇒ String
Writes the rendered data file.
89 90 91 92 |
# File 'lib/kettle/rb/gem_floors/generator.rb', line 89 def write(path = DATA_PATH) File.open(path, "w") { |file| file.write(render) } path end |