pennyworth 9.3.0 → 11.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE.adoc +1 -1
  5. data/README.adoc +223 -44
  6. data/bin/pennyworth +1 -3
  7. data/lib/pennyworth.rb +11 -2
  8. data/lib/pennyworth/cli/actions/config.rb +35 -0
  9. data/lib/pennyworth/cli/actions/encodings.rb +23 -0
  10. data/lib/pennyworth/cli/actions/git_hub.rb +27 -0
  11. data/lib/pennyworth/cli/actions/http_statuses.rb +23 -0
  12. data/lib/pennyworth/cli/actions/ruby_gems.rb +27 -0
  13. data/lib/pennyworth/cli/actions/system/errors.rb +25 -0
  14. data/lib/pennyworth/cli/actions/system/signals.rb +25 -0
  15. data/lib/pennyworth/cli/actions/text.rb +23 -0
  16. data/lib/pennyworth/cli/configuration/content.rb +28 -0
  17. data/lib/pennyworth/cli/configuration/defaults.yml +25 -0
  18. data/lib/pennyworth/cli/configuration/loader.rb +37 -0
  19. data/lib/pennyworth/cli/parsers.rb +11 -0
  20. data/lib/pennyworth/cli/parsers/assembler.rb +32 -0
  21. data/lib/pennyworth/cli/parsers/core.rb +100 -0
  22. data/lib/pennyworth/cli/parsers/git_hub.rb +51 -0
  23. data/lib/pennyworth/cli/parsers/ruby_gems.rb +35 -0
  24. data/lib/pennyworth/cli/shell.rb +82 -0
  25. data/lib/pennyworth/container.rb +40 -0
  26. data/lib/pennyworth/identity.rb +2 -1
  27. data/lib/pennyworth/inflector.rb +18 -0
  28. data/lib/pennyworth/integrations/git_hub/client.rb +59 -0
  29. data/lib/pennyworth/integrations/git_hub/response.rb +33 -0
  30. data/lib/pennyworth/integrations/ruby_gems/client.rb +29 -0
  31. data/lib/pennyworth/loaders/encodings.rb +31 -0
  32. data/lib/pennyworth/loaders/http_statuses.rb +28 -0
  33. data/lib/pennyworth/loaders/projects.rb +22 -0
  34. data/lib/pennyworth/loaders/system/errors.rb +33 -0
  35. data/lib/pennyworth/loaders/system/signals.rb +21 -0
  36. data/lib/pennyworth/loaders/text.rb +27 -0
  37. data/lib/pennyworth/models/encoding.rb +8 -0
  38. data/lib/pennyworth/models/http_status.rb +8 -0
  39. data/lib/pennyworth/models/system/error.rb +10 -0
  40. data/lib/pennyworth/models/system/signal.rb +10 -0
  41. data/lib/pennyworth/models/text.rb +8 -0
  42. data/lib/pennyworth/presenters/encoding.rb +22 -0
  43. data/lib/pennyworth/presenters/gem.rb +48 -0
  44. data/lib/pennyworth/presenters/http_status.rb +41 -0
  45. data/lib/pennyworth/presenters/repository.rb +35 -0
  46. data/lib/pennyworth/presenters/system/error.rb +28 -0
  47. data/lib/pennyworth/presenters/system/signal.rb +22 -0
  48. data/lib/pennyworth/presenters/text.rb +25 -0
  49. data/lib/pennyworth/processor.rb +68 -0
  50. data/lib/pennyworth/serializers/encoding.rb +33 -0
  51. data/lib/pennyworth/serializers/http_status.rb +41 -0
  52. data/lib/pennyworth/serializers/project.rb +52 -0
  53. data/lib/pennyworth/serializers/system/error.rb +46 -0
  54. data/lib/pennyworth/serializers/system/signal.rb +40 -0
  55. data/lib/pennyworth/serializers/text.rb +31 -0
  56. metadata +87 -192
  57. metadata.gz.sig +0 -0
  58. data/lib/pennyworth/cli.rb +0 -141
  59. data/lib/pennyworth/templates/workflows/user.workflow.B59B22A2-1880-4765-9358-412791BE9202/icon.png +0 -0
  60. data/lib/pennyworth/templates/workflows/user.workflow.B59B22A2-1880-4765-9358-412791BE9202/info.plist +0 -159
  61. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/icon.png +0 -0
  62. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/info.plist +0 -272
  63. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-camelcase.png +0 -0
  64. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-capitalize.png +0 -0
  65. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-lowercase.png +0 -0
  66. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-size.png +0 -0
  67. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-snakecase.png +0 -0
  68. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-titleize.png +0 -0
  69. data/lib/pennyworth/templates/workflows/user.workflow.C431E56A-0EC2-47EE-94D5-D67D9FE323BE/string-uppercase.png +0 -0
@@ -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
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pennyworth
4
+ module Serializers
5
+ # Serializes a HTTP status into a compatible format for parsing within Alfred script filters.
6
+ class HTTPStatus
7
+ def initialize presenter
8
+ @presenter = presenter
9
+ end
10
+
11
+ def to_h
12
+ {
13
+ uid: id,
14
+ title: code,
15
+ subtitle: label,
16
+ arg: presenter.symbol,
17
+ mods: modifications,
18
+ text: {copy: "#{code} #{label}", largetype: "#{code} #{label}"}
19
+ }
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :presenter
25
+
26
+ def id = presenter.id
27
+
28
+ def code = presenter.code
29
+
30
+ def label = presenter.label
31
+
32
+ def modifications
33
+ {
34
+ control: {subtitle: "Copy code.", arg: id},
35
+ alt: {subtitle: "Copy label.", arg: label},
36
+ cmd: {subtitle: "View documentation.", arg: presenter.url}
37
+ }
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pennyworth
4
+ module Serializers
5
+ # Serializes a project into a compatible format for parsing within Alfred script filters.
6
+ class Project
7
+ def initialize presenter
8
+ @presenter = presenter
9
+ end
10
+
11
+ def to_h
12
+ {
13
+ uid: presenter.id,
14
+ title: presenter.label,
15
+ subtitle: presenter.subtitle,
16
+ arg: site_url,
17
+ quicklookurl: site_url,
18
+ mods: modifications,
19
+ text: text
20
+ }
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :presenter
26
+
27
+ def modifications
28
+ {
29
+ control: modification(presenter.changes_url, "View changes."),
30
+ alt: modification(presenter.source_url, "View source."),
31
+ cmd: modification(presenter.issues_url, "View issues.")
32
+ }
33
+ end
34
+
35
+ def modification argument, subtitle
36
+ {
37
+ subtitle: subtitle,
38
+ arg: argument
39
+ }
40
+ end
41
+
42
+ def text
43
+ {
44
+ copy: site_url,
45
+ largetype: site_url
46
+ }
47
+ end
48
+
49
+ def site_url = presenter.site_url
50
+ end
51
+ end
52
+ end