From 8cfedd0dfa4d646227b8741e22d56db24aac1c93 Mon Sep 17 00:00:00 2001 From: Alexander Senko Date: Sun, 24 Nov 2024 23:59:51 +0700 Subject: [PATCH] Framework / spec: refactored author info * Improved the API. * Extracted `Gem::Author` into Magic Support. * Replaced `Magic::Presenter::AUTHORS` with `Magic::Presenter::Author`. --- CHANGELOG.md | 3 +++ Gemfile | 1 + lib/magic/presenter/authors.rb | 38 +++++++++++++++++----------------- lib/magic/presenter/version.rb | 2 +- magic-presenter.gemspec | 6 +++--- sig/magic/presenter/author.rbs | 9 ++++++++ 6 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 sig/magic/presenter/author.rbs diff --git a/CHANGELOG.md b/CHANGELOG.md index 1125654..4f51825 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [1.1.0] — UNRELEASED + + ## [1.0.0] — 2024-11-23 This release marks the gem to be stable enough. diff --git a/Gemfile b/Gemfile index 3f4efa0..a1b3c0a 100644 --- a/Gemfile +++ b/Gemfile @@ -9,6 +9,7 @@ gem 'puma' gem 'sqlite3' gem 'combustion' +gem 'magic-support' group :test do gem 'rspec' diff --git a/lib/magic/presenter/authors.rb b/lib/magic/presenter/authors.rb index 50d81d9..95efaf0 100644 --- a/lib/magic/presenter/authors.rb +++ b/lib/magic/presenter/authors.rb @@ -1,27 +1,27 @@ # frozen_string_literal: true -Gem::Author ||= Struct.new( - :name, - :email, - :github, -) do - def github_url = github && "https://github.com/#{github}" +begin + gem_original_require lib = 'rubygems/author' +rescue LoadError => error # HACK: install magic-support + raise unless error.path == lib + + `gem install #{name = 'magic-support'} --ignore-dependencies --no-document` + .match(/^Successfully installed (?#{name}-.*)$/) + &.match(:full_name) + &.then { Bundler.bundle_path.join 'gems', _1, 'lib' } + &.then { $LOAD_PATH << _1 } + + require error.path # retry end module Magic - module Presenter # :nodoc: - AUTHORS = [ # rubocop:disable Style/MutableConstant - Gem::Author.new( - name: 'Alexander Senko', - email: 'Alexander.Senko@gmail.com', - github: 'Alexander-Senko', - ), - ] - - class << AUTHORS - def names = filter_map &:name - def emails = filter_map &:email - def github_url = filter_map(&:github_url).first + module Presenter + class Author < Gem::Author # :nodoc: + new( + name: 'Alexander Senko', + email: 'Alexander.Senko@gmail.com', + github: 'Alexander-Senko', + ) end end end diff --git a/lib/magic/presenter/version.rb b/lib/magic/presenter/version.rb index 573d1fb..a3335af 100644 --- a/lib/magic/presenter/version.rb +++ b/lib/magic/presenter/version.rb @@ -2,6 +2,6 @@ module Magic module Presenter - VERSION = '1.0.0' + VERSION = '1.1.0.alpha' end end diff --git a/magic-presenter.gemspec b/magic-presenter.gemspec index c9fefa8..9868418 100644 --- a/magic-presenter.gemspec +++ b/magic-presenter.gemspec @@ -6,9 +6,9 @@ require_relative 'lib/magic/presenter/authors' Gem::Specification.new do |spec| spec.name = 'magic-presenter' spec.version = Magic::Presenter::VERSION - spec.authors = Magic::Presenter::AUTHORS.names - spec.email = Magic::Presenter::AUTHORS.emails - spec.homepage = "#{Magic::Presenter::AUTHORS.github_url}/#{spec.name}" + spec.authors = Magic::Presenter::Author.names + spec.email = Magic::Presenter::Author.emails + spec.homepage = "#{Magic::Presenter::Author.github_url}/#{spec.name}" spec.summary = 'Presentation layer for Rails models' spec.description = 'Based on Magic Decorator, it’s meant to replace Draper.' spec.license = 'MIT' diff --git a/sig/magic/presenter/author.rbs b/sig/magic/presenter/author.rbs new file mode 100644 index 0000000..fd32665 --- /dev/null +++ b/sig/magic/presenter/author.rbs @@ -0,0 +1,9 @@ +module Magic + module Presenter + class Author < Gem::Author + extend Gem::Author::ClassMethods + + attr_reader self.all: Array[self] + end + end +end