Sha256: 9398e85ea20ff935014e8c0f878c26cf221b6893247aa0eb7a5201d169b81b2b

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 KB

Contents

require 'ego/filesystem'

module Ego
  # The PluginHelper assists the user in writing extensions by generating
  # boilerplate code.
  #
  # @see Plugin
  class PluginHelper
    # @param query [String] example user query
    # @param program_name [String] the executable name
    def initialize(query:, program_name:)
      @query = query
      @program_name = program_name
    end

    # Derive a slug from the user query.
    #
    # @return [String] slug
    def slug
      @slug ||= @query
        .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
        .gsub(/([a-z\d])([A-Z])/, '\1_\2')
        .tr('\'', '')
        .gsub(/\W+/, '_')
        .gsub(/__+/, '_')
        .sub(/_$/, '')
        .downcase
    end

    # Derive a plug-in path from the user query.
    #
    # @return [String] plug-in path
    def path
      @path ||= Filesystem.config("plugins/#{slug}.rb")
        .sub(/^#{ENV['HOME']}/, '~')
    end

    # Provide a hint for initializing a new plug-in.
    #
    # @return [String] hint text
    def hint
      require 'shellwords'
      @hint ||= <<~EOF
        I don't understand "#{@query}".

        If you would like to add this capability, start by running:
          #{@program_name} #{@query.shellescape} > #{path}
      EOF
    end

    # Provide a template for initializing a new plug-in.
    #
    # @return [String] template contents
    def template
      @template ||= <<~EOF
        Ego.plugin do |robot|
          robot.can 'do something new'

          robot.on(/^#{@query}$/i) do |params|
            alert 'Not implemented yet. Go ahead and edit #{path}.'
          end
        end
      EOF
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ego-0.5.0 lib/ego/plugin_helper.rb