proto_plugin 0.1.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96f4f3743b30d3c4f264e7756c603da53e14566c2e414b45cf2da7918635a103
4
- data.tar.gz: 66cc63cd84cc91c179f0b25e9401d9f23e5d1d7cb678387dd604275abe09e240
3
+ metadata.gz: 3c7fb4f38a0f6f9a22f62228fbd39ac9995319b83b05667f83b510cd3e3407fb
4
+ data.tar.gz: d6f39e7a5a77c5f541ee2c52f12d114c8fb6795d8e27617542927008911a23dc
5
5
  SHA512:
6
- metadata.gz: d6830929a04b8e7464797a2d5c4129d6840246f09b4ace2e77c7cebc5ce63d49b1a4d016e66c85f8dd0d9acf86c5ae675ed99f22a882d85f8c4feb697ea5124d
7
- data.tar.gz: c2c9786adcf0530eec151fd445877788d2786b22fb0c9a3c23b8a9080a7ca27277f2b756a6deaead8a1c700e86ce66ccfb87672a1d7d4431798c9ad48880f5aa
6
+ metadata.gz: a1a877e5ee1ed9e55c882cbe312abaa83c1fc29bacad7ba4c35db5c668f40cefd19182263fadfe974e458e937fa30df30d8c30257afe682a98e5ad1d071f0412
7
+ data.tar.gz: 8fc91b1050f5661b616ebd209a116bb8e1edb2e13a2b66b6a20b7be517c78f0fd8b4ee8317af121cc313055e5adc9414855985f70ea754d9494bcc2598a372b8
data/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  gem install proto_plugin
11
11
  ```
12
12
 
13
- ## Usage
13
+ ## Getting Started
14
14
 
15
15
  Creating a `protoc` plugin is as simple as creating a new executable script.
16
16
 
@@ -36,6 +36,11 @@ end
36
36
  MyCoolPlugin.run!
37
37
  ```
38
38
 
39
+ > [!TIP]
40
+ > For more details on the available API, see the docs: https://cocoahero.github.io/proto_plugin
41
+
42
+ ### Usage
43
+
39
44
  To invoke the plugin, first make sure you have `protoc` [installed](https://github.com/protocolbuffers/protobuf#protobuf-compiler-installation). Then in a terminal, run:
40
45
 
41
46
  ```bash
@@ -7,7 +7,9 @@ class Demo < ProtoPlugin::Base
7
7
  def run
8
8
  request.file_to_generate.each do |f|
9
9
  name = File.basename(f, ".proto")
10
- add_file(name: "#{name}.txt", content: <<~TXT)
10
+ add_file(path: "#{name}.txt", content: <<~TXT)
11
+ Parameters: #{parameters}
12
+
11
13
  This file was generated from #{name}.proto!
12
14
  TXT
13
15
  end
@@ -4,8 +4,31 @@ require "google/protobuf"
4
4
  require "google/protobuf/plugin_pb"
5
5
 
6
6
  module ProtoPlugin
7
+ # The primary base class to inherit from when implementing a plugin.
8
+ #
9
+ # ```ruby
10
+ # require 'proto_plugin'
11
+ #
12
+ # class MyCoolPlugin < ProtoPlugin::Base
13
+ # def run
14
+ # # override to provide your implementation
15
+ # end
16
+ # end
17
+ #
18
+ # MyCoolPlugin.run!
19
+ # ````
20
+ # @abstract
7
21
  class Base
8
22
  class << self
23
+ ##
24
+ # The preferred way of invoking a plugin.
25
+ #
26
+ # Decodes a `Google::Protobuf::Compiler::CodeGeneratorRequest` message
27
+ # from `input:`, invokes the plugin by calling `#run`, and then encodes
28
+ # `response` to the stream specified by `output:`.
29
+ #
30
+ # @param input [IO] The stream that the request is decoded from.
31
+ # @param output [IO] The stream that the response is encoded to.
9
32
  def run!(input: $stdin, output: $stdout)
10
33
  plugin = new(
11
34
  request: Google::Protobuf::Compiler::CodeGeneratorRequest.decode(
@@ -21,10 +44,16 @@ module ProtoPlugin
21
44
  end
22
45
  end
23
46
 
47
+ # The request message the plugin was initialized with.
48
+ # @return [Google::Protobuf::Compiler::CodeGeneratorRequest]
24
49
  attr_reader :request
25
50
 
51
+ # The response message to be sent back to `protoc`.
52
+ # @return [Google::Protobuf::Compiler::CodeGeneratorResponse]
26
53
  attr_reader :response
27
54
 
55
+ # Initializes a new instance of the plugin with a given
56
+ # `Google::Protobuf::Compiler::CodeGeneratorRequest`.
28
57
  def initialize(request:)
29
58
  @request = request
30
59
  @response = Google::Protobuf::Compiler::CodeGeneratorResponse.new(
@@ -32,16 +61,42 @@ module ProtoPlugin
32
61
  )
33
62
  end
34
63
 
64
+ # Convenience method for accessing the parameters passed to the plugin.
65
+ #
66
+ # @example `protoc --myplugin_opt=key=value --myplugin_opt=bare`
67
+ # {"key" => "value", "bare" => nil}
68
+ #
69
+ # @return [Hash]
70
+ def parameters
71
+ @parameters ||= request.parameter&.split(",")&.each_with_object({}) do |param, hash|
72
+ key, value = param.split("=")
73
+ hash[key] = value
74
+ end
75
+ end
76
+
77
+ # Returns the list of supported `CodeGeneratorResponse::Feature` values by the plugin. The returned
78
+ # values are bitwise or-ed together and set on `response`.
79
+ #
80
+ # Defaults to `CodeGeneratorResponse::Feature::FEATURE_NONE`.
35
81
  def supported_features
36
82
  [Google::Protobuf::Compiler::CodeGeneratorResponse::Feature::FEATURE_NONE]
37
83
  end
38
84
 
39
- def add_file(name:, content:)
85
+ # Convenience method for appending a `CodeGeneratorResponse::File` message to `response`.
86
+ #
87
+ # The path is relative to the directory specified when invoking `protoc`. For example,
88
+ # specifiying `--myplugin_out=gen` will result in `gen/:path`.
89
+ #
90
+ # @param path [String] The relative path to write the file's content.
91
+ # @param content [String] The content which will be written to the file.
92
+ def add_file(path:, content:)
40
93
  @response.file << Google::Protobuf::Compiler::CodeGeneratorResponse::File.new(
41
- name: name, content: content,
94
+ name: path, content: content,
42
95
  )
43
96
  end
44
97
 
98
+ # The primary entrypoint. Override to provide your plugin's implementation.
99
+ # @abstract
45
100
  def run
46
101
  end
47
102
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ProtoPlugin
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proto_plugin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Baker
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-21 00:00:00.000000000 Z
11
+ date: 2024-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -44,7 +44,9 @@ licenses:
44
44
  metadata:
45
45
  homepage_uri: https://github.com/cocoahero/proto_plugin
46
46
  source_code_uri: https://github.com/cocoahero/proto_plugin
47
+ documentation_uri: https://cocoahero.github.io/proto_plugin
47
48
  allowed_push_host: https://rubygems.org
49
+ funding_uri: https://github.com/sponsors/cocoahero
48
50
  post_install_message:
49
51
  rdoc_options: []
50
52
  require_paths:
@@ -63,5 +65,5 @@ requirements: []
63
65
  rubygems_version: 3.5.11
64
66
  signing_key:
65
67
  specification_version: 4
66
- summary: Easily build `protoc` plugins in Ruby.
68
+ summary: Easily build protobuf compiler plugins in Ruby.
67
69
  test_files: []