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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.adoc +352 -31
  5. data/bin/pennyworth +1 -3
  6. data/lib/pennyworth.rb +11 -2
  7. data/lib/pennyworth/cli/actions/config.rb +35 -0
  8. data/lib/pennyworth/cli/actions/encodings.rb +23 -0
  9. data/lib/pennyworth/cli/actions/git_hub.rb +27 -0
  10. data/lib/pennyworth/cli/actions/http_statuses.rb +23 -0
  11. data/lib/pennyworth/cli/actions/ruby_gems.rb +27 -0
  12. data/lib/pennyworth/cli/actions/system/errors.rb +25 -0
  13. data/lib/pennyworth/cli/actions/system/signals.rb +25 -0
  14. data/lib/pennyworth/cli/actions/text.rb +23 -0
  15. data/lib/pennyworth/cli/configuration/content.rb +28 -0
  16. data/lib/pennyworth/cli/configuration/defaults.yml +25 -0
  17. data/lib/pennyworth/cli/configuration/loader.rb +37 -0
  18. data/lib/pennyworth/cli/parsers.rb +11 -0
  19. data/lib/pennyworth/cli/parsers/assembler.rb +32 -0
  20. data/lib/pennyworth/cli/parsers/core.rb +100 -0
  21. data/lib/pennyworth/cli/parsers/git_hub.rb +51 -0
  22. data/lib/pennyworth/cli/parsers/ruby_gems.rb +35 -0
  23. data/lib/pennyworth/cli/shell.rb +81 -0
  24. data/lib/pennyworth/container.rb +40 -0
  25. data/lib/pennyworth/identity.rb +2 -1
  26. data/lib/pennyworth/inflector.rb +18 -0
  27. data/lib/pennyworth/integrations/git_hub/client.rb +59 -0
  28. data/lib/pennyworth/integrations/git_hub/response.rb +33 -0
  29. data/lib/pennyworth/integrations/ruby_gems/client.rb +29 -0
  30. data/lib/pennyworth/loaders/encodings.rb +31 -0
  31. data/lib/pennyworth/loaders/http_statuses.rb +28 -0
  32. data/lib/pennyworth/loaders/projects.rb +22 -0
  33. data/lib/pennyworth/loaders/system/errors.rb +33 -0
  34. data/lib/pennyworth/loaders/system/signals.rb +21 -0
  35. data/lib/pennyworth/loaders/text.rb +27 -0
  36. data/lib/pennyworth/models/encoding.rb +8 -0
  37. data/lib/pennyworth/models/http_status.rb +8 -0
  38. data/lib/pennyworth/models/system/error.rb +10 -0
  39. data/lib/pennyworth/models/system/signal.rb +10 -0
  40. data/lib/pennyworth/models/text.rb +8 -0
  41. data/lib/pennyworth/presenters/encoding.rb +22 -0
  42. data/lib/pennyworth/presenters/gem.rb +48 -0
  43. data/lib/pennyworth/presenters/http_status.rb +41 -0
  44. data/lib/pennyworth/presenters/repository.rb +35 -0
  45. data/lib/pennyworth/presenters/system/error.rb +28 -0
  46. data/lib/pennyworth/presenters/system/signal.rb +22 -0
  47. data/lib/pennyworth/presenters/text.rb +25 -0
  48. data/lib/pennyworth/processor.rb +68 -0
  49. data/lib/pennyworth/serializers/encoding.rb +33 -0
  50. data/lib/pennyworth/serializers/http_status.rb +41 -0
  51. data/lib/pennyworth/serializers/project.rb +52 -0
  52. data/lib/pennyworth/serializers/system/error.rb +46 -0
  53. data/lib/pennyworth/serializers/system/signal.rb +40 -0
  54. data/lib/pennyworth/serializers/text.rb +31 -0
  55. metadata +110 -19
  56. metadata.gz.sig +0 -0
  57. data/lib/pennyworth/cli.rb +0 -140
  58. data/lib/pennyworth/templates/workflows/user.workflow.B59B22A2-1880-4765-9358-412791BE9202/icon.png +0 -0
  59. data/lib/pennyworth/templates/workflows/user.workflow.B59B22A2-1880-4765-9358-412791BE9202/info.plist +0 -159
  60. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/icon.png +0 -0
  61. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/info.plist +0 -272
  62. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-camelcase.png +0 -0
  63. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-capitalize.png +0 -0
  64. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-lowercase.png +0 -0
  65. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-size.png +0 -0
  66. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-snakecase.png +0 -0
  67. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-titleize.png +0 -0
  68. 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,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pennyworth
4
+ module Models
5
+ # Defines an encoding.
6
+ Encoding = Struct.new :name, :aliases, keyword_init: true
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pennyworth
4
+ module Models
5
+ # Defines HTTP status details.
6
+ HTTPStatus = Struct.new :code, :label, :url, keyword_init: true
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pennyworth
4
+ module Models
5
+ module System
6
+ # Defines a system error.
7
+ Error = Struct.new :id, :name, :description, keyword_init: true
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pennyworth
4
+ module Models
5
+ module System
6
+ # Defines a low-level operating system signal.
7
+ Signal = Struct.new :number, :name, keyword_init: true
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pennyworth
4
+ module Models
5
+ # Defines basic text.
6
+ Text = Struct.new :id, :content, keyword_init: true
7
+ end
8
+ 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