pennyworth 10.0.1 → 11.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.adoc +352 -31
- data/bin/pennyworth +1 -3
- data/lib/pennyworth.rb +11 -2
- data/lib/pennyworth/cli/actions/config.rb +35 -0
- data/lib/pennyworth/cli/actions/encodings.rb +23 -0
- data/lib/pennyworth/cli/actions/git_hub.rb +27 -0
- data/lib/pennyworth/cli/actions/http_statuses.rb +23 -0
- data/lib/pennyworth/cli/actions/ruby_gems.rb +27 -0
- data/lib/pennyworth/cli/actions/system/errors.rb +25 -0
- data/lib/pennyworth/cli/actions/system/signals.rb +25 -0
- data/lib/pennyworth/cli/actions/text.rb +23 -0
- data/lib/pennyworth/cli/configuration/content.rb +28 -0
- data/lib/pennyworth/cli/configuration/defaults.yml +25 -0
- data/lib/pennyworth/cli/configuration/loader.rb +37 -0
- data/lib/pennyworth/cli/parsers.rb +11 -0
- data/lib/pennyworth/cli/parsers/assembler.rb +32 -0
- data/lib/pennyworth/cli/parsers/core.rb +100 -0
- data/lib/pennyworth/cli/parsers/git_hub.rb +51 -0
- data/lib/pennyworth/cli/parsers/ruby_gems.rb +35 -0
- data/lib/pennyworth/cli/shell.rb +81 -0
- data/lib/pennyworth/container.rb +40 -0
- data/lib/pennyworth/identity.rb +2 -1
- data/lib/pennyworth/inflector.rb +18 -0
- data/lib/pennyworth/integrations/git_hub/client.rb +59 -0
- data/lib/pennyworth/integrations/git_hub/response.rb +33 -0
- data/lib/pennyworth/integrations/ruby_gems/client.rb +29 -0
- data/lib/pennyworth/loaders/encodings.rb +31 -0
- data/lib/pennyworth/loaders/http_statuses.rb +28 -0
- data/lib/pennyworth/loaders/projects.rb +22 -0
- data/lib/pennyworth/loaders/system/errors.rb +33 -0
- data/lib/pennyworth/loaders/system/signals.rb +21 -0
- data/lib/pennyworth/loaders/text.rb +27 -0
- data/lib/pennyworth/models/encoding.rb +8 -0
- data/lib/pennyworth/models/http_status.rb +8 -0
- data/lib/pennyworth/models/system/error.rb +10 -0
- data/lib/pennyworth/models/system/signal.rb +10 -0
- data/lib/pennyworth/models/text.rb +8 -0
- data/lib/pennyworth/presenters/encoding.rb +22 -0
- data/lib/pennyworth/presenters/gem.rb +48 -0
- data/lib/pennyworth/presenters/http_status.rb +41 -0
- data/lib/pennyworth/presenters/repository.rb +35 -0
- data/lib/pennyworth/presenters/system/error.rb +28 -0
- data/lib/pennyworth/presenters/system/signal.rb +22 -0
- data/lib/pennyworth/presenters/text.rb +25 -0
- data/lib/pennyworth/processor.rb +68 -0
- data/lib/pennyworth/serializers/encoding.rb +33 -0
- data/lib/pennyworth/serializers/http_status.rb +41 -0
- data/lib/pennyworth/serializers/project.rb +52 -0
- data/lib/pennyworth/serializers/system/error.rb +46 -0
- data/lib/pennyworth/serializers/system/signal.rb +40 -0
- data/lib/pennyworth/serializers/text.rb +31 -0
- metadata +110 -19
- metadata.gz.sig +0 -0
- data/lib/pennyworth/cli.rb +0 -140
- data/lib/pennyworth/templates/workflows/user.workflow.B59B22A2-1880-4765-9358-412791BE9202/icon.png +0 -0
- data/lib/pennyworth/templates/workflows/user.workflow.B59B22A2-1880-4765-9358-412791BE9202/info.plist +0 -159
- data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/icon.png +0 -0
- data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/info.plist +0 -272
- data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-camelcase.png +0 -0
- data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-capitalize.png +0 -0
- data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-lowercase.png +0 -0
- data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-size.png +0 -0
- data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-snakecase.png +0 -0
- data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-titleize.png +0 -0
- data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-uppercase.png +0 -0
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "refinements/arrays"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Pennyworth
         | 
| 6 | 
            +
              module Loaders
         | 
| 7 | 
            +
                module System
         | 
| 8 | 
            +
                  # Loads an array of system error records.
         | 
| 9 | 
            +
                  class Errors
         | 
| 10 | 
            +
                    using Refinements::Arrays
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    def initialize errno: Errno, model: Models::System::Error
         | 
| 13 | 
            +
                      @errno = errno
         | 
| 14 | 
            +
                      @model = model
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    def call _omit = nil
         | 
| 18 | 
            +
                      errno.constants
         | 
| 19 | 
            +
                           .map { |name| errno.const_get name }
         | 
| 20 | 
            +
                           .uniq
         | 
| 21 | 
            +
                           .sort_by { |error| error::Errno }
         | 
| 22 | 
            +
                           .map do |error|
         | 
| 23 | 
            +
                             model[id: error::Errno, name: error.name, description: error.exception.message]
         | 
| 24 | 
            +
                           end
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    private
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    attr_reader :errno, :model
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Pennyworth
         | 
| 4 | 
            +
              module Loaders
         | 
| 5 | 
            +
                module System
         | 
| 6 | 
            +
                  # Loads an array of signal records.
         | 
| 7 | 
            +
                  class Signals
         | 
| 8 | 
            +
                    def initialize list: Signal.list, model: Models::System::Signal
         | 
| 9 | 
            +
                      @list = list
         | 
| 10 | 
            +
                      @model = model
         | 
| 11 | 
            +
                    end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    def call(_omit = nil) = list.map { |name, number| model[number: number, name: name] }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    private
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    attr_reader :list, :model
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "refinements/strings"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Pennyworth
         | 
| 6 | 
            +
              module Loaders
         | 
| 7 | 
            +
                # Loads an array of text records.
         | 
| 8 | 
            +
                class Text
         | 
| 9 | 
            +
                  using Refinements::Strings
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  TRANSFORMS = %w[camelcase capitalize downcase size snakecase titleize upcase].freeze
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def initialize transforms: TRANSFORMS, model: Models::Text
         | 
| 14 | 
            +
                    @transforms = transforms
         | 
| 15 | 
            +
                    @model = model
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def call content
         | 
| 19 | 
            +
                    transforms.map { |kind| model[id: kind, content: content.public_send(kind)] }
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  private
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  attr_reader :transforms, :model
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Pennyworth
         | 
| 4 | 
            +
              module Presenters
         | 
| 5 | 
            +
                # Renders encoding into a compatible format for use in Alfred script filters.
         | 
| 6 | 
            +
                class Encoding
         | 
| 7 | 
            +
                  def initialize record
         | 
| 8 | 
            +
                    @record = record
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def id = record.name
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def label = record.name
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def aliases = record.aliases
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  private
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  attr_reader :record
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "refinements/strings"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Pennyworth
         | 
| 6 | 
            +
              module Presenters
         | 
| 7 | 
            +
                # Renders RubyGems records into a compatible format for use in Alfred script filters.
         | 
| 8 | 
            +
                class Gem
         | 
| 9 | 
            +
                  using Refinements::Strings
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def initialize record, inflector: Inflector.new
         | 
| 12 | 
            +
                    @record = record
         | 
| 13 | 
            +
                    @inflector = inflector
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def id = record.fetch(:name)
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def label = inflector.call(id.titleize)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def subtitle
         | 
| 21 | 
            +
                    "Version: #{version}. " \
         | 
| 22 | 
            +
                    "Updated: #{updated_at[..9]}. " \
         | 
| 23 | 
            +
                    "Licenses: #{licenses}. " \
         | 
| 24 | 
            +
                    "Downloads: #{downloads}."
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  def version = record.fetch(__method__)
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  def licenses = record.fetch(__method__).join(", ")
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  def downloads = record.fetch(__method__)
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  def site_url = record.fetch(:homepage_uri)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  def source_url = record.fetch(:source_code_uri)
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  def changes_url = record.fetch(:changelog_uri)
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  def issues_url = record.fetch(:bug_tracker_uri)
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  def updated_at = record.fetch(:version_created_at)
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  private
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  attr_reader :record, :inflector
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
            end
         | 
| @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "forwardable"
         | 
| 4 | 
            +
            require "refinements/strings"
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Pennyworth
         | 
| 7 | 
            +
              module Presenters
         | 
| 8 | 
            +
                # Renders system error into a compatible format for use in Alfred script filters.
         | 
| 9 | 
            +
                class HTTPStatus
         | 
| 10 | 
            +
                  extend Forwardable
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  using Refinements::Strings
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  delegate %i[code label url] => :record
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def initialize record, inflector: Inflector.new
         | 
| 17 | 
            +
                    @record = record
         | 
| 18 | 
            +
                    @inflector = inflector
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  def id = record.code
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def subtitle = "#{id} #{label}"
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def symbol = ":#{inflector.call name}"
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  private
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  attr_reader :record, :inflector
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  def name
         | 
| 32 | 
            +
                    label.snakecase
         | 
| 33 | 
            +
                         .tr("/", "_")
         | 
| 34 | 
            +
                         .gsub(/(\(|\))/, "")
         | 
| 35 | 
            +
                         .sub("h_t_t_p_version_not_supported", "http_version_not_supported")
         | 
| 36 | 
            +
                         .sub("i_m_used", "im_used")
         | 
| 37 | 
            +
                         .sub("u_r_i_too_long", "uri_too_long")
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "refinements/strings"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Pennyworth
         | 
| 6 | 
            +
              module Presenters
         | 
| 7 | 
            +
                # Renders a GitHub repository record into a compatible format for use in Alfred script filters.
         | 
| 8 | 
            +
                class Repository
         | 
| 9 | 
            +
                  using Refinements::Strings
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def initialize record, inflector: Inflector.new
         | 
| 12 | 
            +
                    @record = record
         | 
| 13 | 
            +
                    @inflector = inflector
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def id = record.fetch(:name)
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def label = inflector.call(id.titleize)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def subtitle = record.fetch(:description)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def site_url = record.fetch(:homepage)
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def source_url = record.fetch(:html_url)
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  def changes_url = "#{site_url}/changes.html"
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  def issues_url = "#{source_url}/issues"
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  private
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  attr_reader :record, :inflector
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "forwardable"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Pennyworth
         | 
| 6 | 
            +
              module Presenters
         | 
| 7 | 
            +
                module System
         | 
| 8 | 
            +
                  # Renders system error into a compatible format for use in Alfred script filters.
         | 
| 9 | 
            +
                  class Error
         | 
| 10 | 
            +
                    extend Forwardable
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    delegate %i[id description] => :record
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    def initialize record
         | 
| 15 | 
            +
                      @record = record
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    def label = record.name
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    def subtitle = "#{label}: #{description}."
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    private
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    attr_reader :record
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Pennyworth
         | 
| 4 | 
            +
              module Presenters
         | 
| 5 | 
            +
                module System
         | 
| 6 | 
            +
                  # Renders strings into a compatible format for use in Alfred script filters.
         | 
| 7 | 
            +
                  class Signal
         | 
| 8 | 
            +
                    def initialize record
         | 
| 9 | 
            +
                      @record = record
         | 
| 10 | 
            +
                    end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    def id = record.number
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    def label = record.name
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    private
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    attr_reader :record
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "forwardable"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Pennyworth
         | 
| 6 | 
            +
              module Presenters
         | 
| 7 | 
            +
                # Renders text into a compatible format for use in Alfred script filters.
         | 
| 8 | 
            +
                class Text
         | 
| 9 | 
            +
                  extend Forwardable
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  delegate %i[id content] => :record
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def initialize record, inflector: Inflector.new
         | 
| 14 | 
            +
                    @record = record
         | 
| 15 | 
            +
                    @inflector = inflector
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def label = inflector.call(record.content.to_s)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  private
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  attr_reader :record, :inflector
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,68 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Pennyworth
         | 
| 4 | 
            +
              # Processes all steps required to render an Alfred Script Filter response.
         | 
| 5 | 
            +
              class Processor
         | 
| 6 | 
            +
                def self.for_encodings
         | 
| 7 | 
            +
                  new loader: Loaders::Encodings.new,
         | 
| 8 | 
            +
                      presenter: Presenters::Encoding,
         | 
| 9 | 
            +
                      serializer: Serializers::Encoding
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def self.for_gems
         | 
| 13 | 
            +
                  new loader: Loaders::Projects.for_ruby_gems,
         | 
| 14 | 
            +
                      presenter: Presenters::Gem,
         | 
| 15 | 
            +
                      serializer: Serializers::Project
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def self.for_http_statuses
         | 
| 19 | 
            +
                  new loader: Loaders::HTTPStatuses.new,
         | 
| 20 | 
            +
                      presenter: Presenters::HTTPStatus,
         | 
| 21 | 
            +
                      serializer: Serializers::HTTPStatus
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def self.for_projects
         | 
| 25 | 
            +
                  new loader: Loaders::Projects.for_git_hub,
         | 
| 26 | 
            +
                      presenter: Presenters::Repository,
         | 
| 27 | 
            +
                      serializer: Serializers::Project
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def self.for_system_signals
         | 
| 31 | 
            +
                  new loader: Loaders::System::Signals.new,
         | 
| 32 | 
            +
                      presenter: Presenters::System::Signal,
         | 
| 33 | 
            +
                      serializer: Serializers::System::Signal
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def self.for_system_errors
         | 
| 37 | 
            +
                  new loader: Loaders::System::Errors.new,
         | 
| 38 | 
            +
                      presenter: Presenters::System::Error,
         | 
| 39 | 
            +
                      serializer: Serializers::System::Error
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def self.for_text
         | 
| 43 | 
            +
                  new loader: Loaders::Text.new, presenter: Presenters::Text, serializer: Serializers::Text
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def initialize steps
         | 
| 47 | 
            +
                  @steps = steps
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                def call content = nil
         | 
| 51 | 
            +
                  loader.call(content)
         | 
| 52 | 
            +
                        .map { |record| presenter.new record }
         | 
| 53 | 
            +
                        .sort_by(&:label)
         | 
| 54 | 
            +
                        .map { |record| serializer.new record }
         | 
| 55 | 
            +
                        .then { |records| {items: records.map(&:to_h)} }
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                private
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                attr_reader :steps
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def loader = steps.fetch(__method__)
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                def presenter = steps.fetch(__method__)
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                def serializer = steps.fetch(__method__)
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
            end
         | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Pennyworth
         | 
| 4 | 
            +
              module Serializers
         | 
| 5 | 
            +
                # Serializes a encoding into a compatible format for parsing within Alfred script filters.
         | 
| 6 | 
            +
                class Encoding
         | 
| 7 | 
            +
                  def initialize presenter
         | 
| 8 | 
            +
                    @presenter = presenter
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def to_h
         | 
| 12 | 
            +
                    {
         | 
| 13 | 
            +
                      uid: presenter.id,
         | 
| 14 | 
            +
                      title: label,
         | 
| 15 | 
            +
                      subtitle: %(Aliases: #{aliases}.),
         | 
| 16 | 
            +
                      arg: label,
         | 
| 17 | 
            +
                      mods: {
         | 
| 18 | 
            +
                        alt: {subtitle: "Copy aliases.", arg: aliases}
         | 
| 19 | 
            +
                      },
         | 
| 20 | 
            +
                      text: {copy: label, largetype: label}
         | 
| 21 | 
            +
                    }
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  private
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  attr_reader :presenter
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  def label = presenter.label
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def aliases = presenter.aliases.join(", ")
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         |