rounders 0.2.0 → 0.4.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 +4 -4
- data/.gitignore +2 -2
- data/.rspec +2 -0
- data/.rubocop.yml +10 -1
- data/.travis.yml +9 -0
- data/README.ja.md +196 -0
- data/README.md +56 -8
- data/lib/rounders.rb +18 -10
- data/lib/rounders/commands/global_command.rb +13 -5
- data/lib/rounders/commands/sub_commands/generate.rb +24 -8
- data/lib/rounders/generators/app/app_generator.rb +46 -0
- data/lib/rounders/generators/app/templates/.rspec +2 -0
- data/lib/rounders/generators/app/templates/Gemfile +10 -0
- data/lib/rounders/generators/app/templates/MIT-LICENSE +20 -0
- data/lib/rounders/generators/app/templates/README.md.tt +21 -0
- data/lib/rounders/generators/app/templates/Rakefile +4 -0
- data/lib/rounders/generators/app/templates/app/handlers/.gitkeep +0 -0
- data/lib/rounders/generators/app/templates/app/matchers/.gitkeep +0 -0
- data/lib/rounders/generators/app/templates/app/receivers/.gitkeep +0 -0
- data/{templates/app → lib/rounders/generators/app/templates}/config/initializers/mail.rb +2 -2
- data/lib/rounders/generators/app/templates/gitignore +54 -0
- data/lib/rounders/generators/app/templates/spec/handlers/.gitkeep +0 -0
- data/lib/rounders/generators/app/templates/spec/matchers/.gitkeep +0 -0
- data/lib/rounders/generators/app/templates/spec/receivers/.gitkeep +0 -0
- data/lib/rounders/generators/app/templates/spec/spec_helper.rb.tt +105 -0
- data/lib/rounders/generators/app/templates/travis.yml +9 -0
- data/lib/rounders/generators/base.rb +69 -0
- data/lib/rounders/generators/handler/handler_generator.rb +16 -0
- data/lib/rounders/generators/handler/templates/%underscored_name%_handler.rb.tt +12 -0
- data/lib/rounders/generators/matcher/matcher_generator.rb +15 -0
- data/{templates/generators/matcher.mustache.rb → lib/rounders/generators/matcher/templates/%underscored_name%_matcher.rb.tt} +1 -1
- data/lib/rounders/generators/plugin/plugin_generator.rb +49 -0
- data/lib/rounders/generators/plugin/templates/.rspec +2 -0
- data/lib/rounders/generators/plugin/templates/Gemfile +4 -0
- data/lib/rounders/generators/plugin/templates/MIT-LICENSE +20 -0
- data/lib/rounders/generators/plugin/templates/README.md.tt +35 -0
- data/lib/rounders/generators/plugin/templates/Rakefile +4 -0
- data/lib/rounders/generators/plugin/templates/gitignore +54 -0
- data/lib/rounders/generators/plugin/templates/lib/rounders/%underscored_name%.rb.tt +6 -0
- data/lib/rounders/generators/plugin/templates/lib/rounders/%underscored_name%/version.rb.tt +5 -0
- data/lib/rounders/generators/plugin/templates/rounders-%underscored_name%.gemspec.tt +25 -0
- data/lib/rounders/generators/plugin/templates/spec/rounders/%underscored_name%_spec.rb.tt +7 -0
- data/lib/rounders/generators/plugin/templates/spec/rounders/.gitkeep +0 -0
- data/lib/rounders/generators/plugin/templates/spec/spec_helper.rb.tt +123 -0
- data/lib/rounders/generators/plugin/templates/travis.yml +9 -0
- data/lib/rounders/generators/receiver/receiver_generator.rb +15 -0
- data/lib/rounders/generators/receiver/templates/%underscored_name%_receiver.rb.tt +16 -0
- data/lib/rounders/handlers/handler.rb +3 -2
- data/lib/rounders/matchers/matcher.rb +4 -3
- data/lib/rounders/plugins/pluggable.rb +12 -2
- data/lib/rounders/receivers/mail.rb +41 -0
- data/lib/rounders/receivers/receiver.rb +29 -0
- data/lib/rounders/rounder.rb +1 -1
- data/lib/rounders/util.rb +20 -0
- data/lib/rounders/version.rb +1 -1
- data/rounders.gemspec +6 -5
- metadata +65 -33
- data/circle.yml +0 -36
- data/lib/rounders/generators/app.rb +0 -28
- data/lib/rounders/generators/generator.rb +0 -48
- data/lib/rounders/generators/handler.rb +0 -12
- data/lib/rounders/generators/matcher.rb +0 -9
- data/lib/rounders/receiver.rb +0 -67
- data/templates/app/Gemfile +0 -2
- data/templates/generators/handler.mustache.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45547d405ca80484bf5a309a7f0784b0c6d0d16d
|
4
|
+
data.tar.gz: b1935a235c262dc8517499725dd60c56701b5a1a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5ddda05355cc11f219ff0cc6e62a77c8161a8034535f4c9f4277a92a6ca0eaec6e46805ea1c1d05053324958e85e6889a6fa48cfbfe86df1f2342a932fa369c
|
7
|
+
data.tar.gz: '049ab0e60c9eb09a101909ec29cde953285824520b04e2a86a34f3c6fd4715226a60cd40953d54a6b0dad48886dd6326b02ce2f3767e2f8635c492e41e8732b7'
|
data/.gitignore
CHANGED
@@ -8,15 +8,15 @@
|
|
8
8
|
/spec/reports/
|
9
9
|
/tmp/
|
10
10
|
### https://raw.github.com/github/gitignore/0aeefb48c0ac885a516fb92f7f5bfd7e85ce7a37/Rails.gitignore
|
11
|
+
/verndor/bundle
|
11
12
|
|
12
13
|
*.rbc
|
13
14
|
*.sassc
|
14
15
|
.sass-cache
|
15
16
|
capybara-*.html
|
16
|
-
.rspec
|
17
17
|
.rvmrc
|
18
18
|
/.bundle
|
19
|
-
/vendor/bundle
|
19
|
+
/vendor/bundle/
|
20
20
|
/log/*
|
21
21
|
/tmp/*
|
22
22
|
/db/*.sqlite3
|
data/.rspec
ADDED
data/.rubocop.yml
CHANGED
@@ -4,7 +4,7 @@ AllCops:
|
|
4
4
|
- 'vendor/**/*'
|
5
5
|
- 'spec/fixtures/**/*'
|
6
6
|
- 'tmp/**/*'
|
7
|
-
- 'templates
|
7
|
+
- 'templates/**/*'
|
8
8
|
##################### Metrics ##################################
|
9
9
|
|
10
10
|
Metrics/LineLength:
|
@@ -35,3 +35,12 @@ Style/DotPosition:
|
|
35
35
|
|
36
36
|
Style/FrozenStringLiteralComment:
|
37
37
|
Enabled: false
|
38
|
+
|
39
|
+
Metrics/BlockLength:
|
40
|
+
Exclude:
|
41
|
+
- 'rounders.gemspec'
|
42
|
+
- 'spec/**/*'
|
43
|
+
|
44
|
+
Metrics/MethodLength:
|
45
|
+
CountComments: false # count full line comments?
|
46
|
+
Max: 30
|
data/.travis.yml
ADDED
data/README.ja.md
ADDED
@@ -0,0 +1,196 @@
|
|
1
|
+
# Rounders [](https://travis-ci.org/rike422/rounders) [](https://codeclimate.com/github/rike422/rounders) [](https://coveralls.io/github/rike422/rounders?branch=master)
|
2
|
+
|
3
|
+
Roundersは拡張性を重視した、メール処理フレームワークです。
|
4
|
+
RubotyなどのBotを参考に作られました。
|
5
|
+
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'rounders'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install rounders
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
### botの作成
|
26
|
+
|
27
|
+
botを作成するには、下記のコマンドを実行します。
|
28
|
+
|
29
|
+
```
|
30
|
+
rounders new [name]
|
31
|
+
```
|
32
|
+
|
33
|
+
### メールアカウントの設定
|
34
|
+
|
35
|
+
生成されたbotの`config/initiarizers/mail.rb`にメールアカウント情報を設定します。
|
36
|
+
```
|
37
|
+
Rounders::Receivers::Mail.configure do |config|
|
38
|
+
# please show more option
|
39
|
+
#
|
40
|
+
config.protocol = :imap
|
41
|
+
# メールアカウント情報を設定します。
|
42
|
+
config.mail_server_setting = {
|
43
|
+
address: 'imap.gmail.com',
|
44
|
+
port: 993,
|
45
|
+
user_name: ENV['GMAIL_USER_NAME'],
|
46
|
+
password: ENV['GMAIL_PASSWORD'],
|
47
|
+
enable_ssl: true
|
48
|
+
}
|
49
|
+
config.options = {
|
50
|
+
# flag for whether to delete each receive mail after find Default: false
|
51
|
+
# delete_after_find: true
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
```
|
56
|
+
|
57
|
+
### botの実行
|
58
|
+
|
59
|
+
`bundle exec rounders start`でbotをスタートできます。
|
60
|
+
|
61
|
+
## Modules
|
62
|
+
|
63
|
+
Roundersはそれぞれのモジュールの基底クラスを継承することにより、
|
64
|
+
Hookが行われ、システム内に組み込むことができます。
|
65
|
+
|
66
|
+
各モジュールのテンプレートを作成するジェネレータを用意しています。
|
67
|
+
|
68
|
+
#### Handlers
|
69
|
+
|
70
|
+
Handlersはメールのハンドングを行うモジュールです。
|
71
|
+
`.on`の第一引数で渡した条件で下記のMatcherインスタンスを作成し、
|
72
|
+
マッチしたメールを、第二引数で渡したメソッドに引き渡します
|
73
|
+
|
74
|
+
#### Generate Command
|
75
|
+
|
76
|
+
下記のように`rounders generate handler`をroudersディレクトリ内で実行することで、
|
77
|
+
./app/handlersの中にテンプレートファイルが生成されます。
|
78
|
+
|
79
|
+
```
|
80
|
+
rounders generate handler [name] [method1, method2...] `
|
81
|
+
```
|
82
|
+
|
83
|
+
##### example
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
module Rounders
|
87
|
+
module Handlers
|
88
|
+
class MyHandler < Rounders::Handlers::Handler
|
89
|
+
# mail.body is include 'exmpale'
|
90
|
+
on({ body: 'example' }, :callback_method1)
|
91
|
+
# body include 'exmpale' AND subject match the /programing (?<name>.+)$/
|
92
|
+
on({
|
93
|
+
body: 'example',
|
94
|
+
subject: /programing (?<name>.+)$/},
|
95
|
+
:callback_method2)
|
96
|
+
|
97
|
+
def method1(mail)
|
98
|
+
# BodyMatcherの戻り値画が格納されています。
|
99
|
+
matches[:body]
|
100
|
+
# => #<MatchData "example">
|
101
|
+
# 引数のmail、matchesを利用して処理を行えます。
|
102
|
+
end
|
103
|
+
|
104
|
+
def method2(mail)
|
105
|
+
matches[:subject]
|
106
|
+
# => <MatchData "programing ruby" name:"ruby">
|
107
|
+
matches[:subject][:name]
|
108
|
+
# => "ruby"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
```
|
115
|
+
|
116
|
+
#### Matchers
|
117
|
+
|
118
|
+
Matcherはメールのフィルタリングを行うモジュールです。
|
119
|
+
`#match`メソッドを実装する必要があり、このメソッドが返した値は、
|
120
|
+
Handlersメソッド内で扱えるmatchesに格納されます。
|
121
|
+
|
122
|
+
#### Generate Command
|
123
|
+
|
124
|
+
下記のように`rounders generate matchers`をroudersディレクトリ内で実行することで、
|
125
|
+
./app/matchers/の中にテンプレートファイルが生成されます。
|
126
|
+
|
127
|
+
```
|
128
|
+
rounders generate matchers [name]`
|
129
|
+
```
|
130
|
+
|
131
|
+
下記はHTMLメールに対して、CSSセレクタでフィルタ・抽出を行うためのMatcherの実装例です。
|
132
|
+
|
133
|
+
#### exmaple
|
134
|
+
|
135
|
+
/app/matchers/css_selector.rb
|
136
|
+
|
137
|
+
```ruby
|
138
|
+
module Rounders
|
139
|
+
module Matchers
|
140
|
+
# クラス名をsnake_caseにした値が、handlerでのkeyになります。
|
141
|
+
class CssSelector < Rounders::Matchers::Matcher
|
142
|
+
attr_reader :pattern
|
143
|
+
|
144
|
+
def initialize(pattern)
|
145
|
+
@pattern = pattern
|
146
|
+
end
|
147
|
+
|
148
|
+
def match(mail)
|
149
|
+
return if mail.html_part.blank?
|
150
|
+
html_part = Nokogiri::HTML(mail.html_part.body.to_s)
|
151
|
+
node = html_part.css(pattern)
|
152
|
+
# 戻り値がmatches[:css_selector]に格納されます。
|
153
|
+
node.present? ? node : nil
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
```
|
160
|
+
|
161
|
+
/app/handlers/your_hander.rb
|
162
|
+
```ruby
|
163
|
+
module Rounders
|
164
|
+
module Handlers
|
165
|
+
class YourHandler < Rounders::Handlers::Handler
|
166
|
+
# 上記のCssSelectorを利用するためにキーを指定して、CSSセレクタを値として渡します。
|
167
|
+
on({ css_selector: 'body .header h2' }, method1)
|
168
|
+
|
169
|
+
def method1(mail)
|
170
|
+
# CssSelectorの戻り値が格納されています。
|
171
|
+
matches[:css_selector]
|
172
|
+
# =>[#<Nokogiri::XML::Element:0x3fc6d77f6ccc name="h2" children=[#<Nokogiri::XML::Text:0x3fc6d77f6ad8 " head text ">]>]
|
173
|
+
matches[:css_selector].to_s
|
174
|
+
# => '<h2> head text </h2>'
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
```
|
181
|
+
|
182
|
+
#### Gems
|
183
|
+
|
184
|
+
RoundersのモジュールはGemとして配布できます。
|
185
|
+
上記のCssSelectorをGemにしたものが下記のリポジトリになります。
|
186
|
+
- [rounders-css_selector_matcher](https://github.com/rike422/rounders-css_selector_matcher)
|
187
|
+
|
188
|
+
#### reciever
|
189
|
+
|
190
|
+
coming soon...
|
191
|
+
|
192
|
+
|
193
|
+
## License
|
194
|
+
|
195
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
196
|
+
|
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
-
# Rounders [](https://travis-ci.org/rike422/rounders) [](https://codeclimate.com/github/rike422/rounders) [](https://coveralls.io/github/rike422/rounders?branch=master)
|
2
2
|
|
3
|
-
|
3
|
+
[日本語README](https://github.com/rike422/rounders/blob/master/README.ja.md)
|
4
|
+
|
5
|
+
Rounders is a mail handling framework that emphasizes pluggability.
|
6
|
+
It was made with reference to Bot such as [Ruboty](https://github.com/r7kamura/ruboty),[Lita](https://github.com/litaio/lita).
|
4
7
|
|
5
8
|
## Installation
|
6
9
|
|
@@ -22,16 +25,53 @@ Or install it yourself as:
|
|
22
25
|
|
23
26
|
### create bot
|
24
27
|
|
25
|
-
create a
|
28
|
+
To create a bot, execute the following command.
|
26
29
|
|
27
30
|
```
|
28
31
|
rounders new [name]
|
29
32
|
```
|
30
33
|
|
31
|
-
###
|
34
|
+
### Mail account settings
|
35
|
+
|
36
|
+
Set mail account information in `bot/config/initiarizers/ mail.rb` of the generated bot.
|
37
|
+
|
38
|
+
```
|
39
|
+
Rounders::Receivers::Mail.configure do |config|
|
40
|
+
# please show more option
|
41
|
+
#
|
42
|
+
config.protocol = :imap
|
43
|
+
# メールアカウント情報を設定します。
|
44
|
+
config.mail_server_setting = {
|
45
|
+
address: 'imap.gmail.com',
|
46
|
+
port: 993,
|
47
|
+
user_name: ENV['GMAIL_USER_NAME'],
|
48
|
+
password: ENV['GMAIL_PASSWORD'],
|
49
|
+
enable_ssl: true
|
50
|
+
}
|
51
|
+
config.options = {
|
52
|
+
# flag for whether to delete each receive mail after find Default: false
|
53
|
+
# delete_after_find: true
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
```
|
58
|
+
|
59
|
+
### start bot
|
60
|
+
|
61
|
+
You can start the bot with `bundle exec rounders start`.
|
62
|
+
|
63
|
+
### Modules
|
64
|
+
|
65
|
+
|
66
|
+
If you want to extend the processing of Rounders. inherit the base class of following modules.
|
67
|
+
it is hooked and can be incorporated into the Rounders.
|
32
68
|
|
33
69
|
#### Handlers
|
34
70
|
|
71
|
+
Handlers is a module that handles mails.
|
72
|
+
Create the Matcher instance with the condition passed as the first argument of `.on`,
|
73
|
+
If there is a matching email, If there is a matching email, It passe to the method that passed as the second argument
|
74
|
+
|
35
75
|
The `rounders generate handler` command create template of handler into ./plugins/handlers/
|
36
76
|
|
37
77
|
```
|
@@ -44,14 +84,15 @@ module Rounders
|
|
44
84
|
module Handlers
|
45
85
|
class MyHandler < Rounders::Handlers::Handler
|
46
86
|
# mail.body is include 'exmpale'
|
47
|
-
on({ body: 'example' }, :
|
87
|
+
on({ body: 'example' }, :method1)
|
48
88
|
# body include 'exmpale' AND subject match the /programing (?<name>.+)$/
|
49
89
|
on({
|
50
90
|
body: 'example',
|
51
91
|
subject: /programing (?<name>.+)$/},
|
52
|
-
:
|
92
|
+
:method2)
|
53
93
|
|
54
94
|
def method1(mail)
|
95
|
+
# The return value of BodyMatcher is assign to Handler#matches.
|
55
96
|
matches[:body]
|
56
97
|
# => #<MatchData "example">
|
57
98
|
# any process
|
@@ -71,13 +112,18 @@ end
|
|
71
112
|
|
72
113
|
#### Matchers
|
73
114
|
|
115
|
+
Matcher is a module that performs mail filtering.
|
116
|
+
The Matcher must implement 'match' method, and the value returned by this method which returns value assign to Handler#matches
|
117
|
+
|
118
|
+
|
74
119
|
The `rounders generate matchers` command create template of matchers into ./plugins/matchers/
|
75
120
|
|
76
121
|
```
|
77
122
|
rounders generate matchers [name]`
|
78
123
|
```
|
79
124
|
|
80
|
-
|
125
|
+
|
126
|
+
Below is an example of Matcher for filtering / extracting with CSSSelector for HTML mail.
|
81
127
|
|
82
128
|
#### exmaple
|
83
129
|
|
@@ -111,7 +157,7 @@ module Rounders
|
|
111
157
|
module Handlers
|
112
158
|
class YourHandler < Rounders::Handlers::Handler
|
113
159
|
# css selector match
|
114
|
-
on({ css_selector: 'body .header h2' }, method1)
|
160
|
+
on({ css_selector: 'body .header h2' }, :method1)
|
115
161
|
|
116
162
|
def method1(mail)
|
117
163
|
matches[:css_selector]
|
@@ -127,6 +173,8 @@ end
|
|
127
173
|
|
128
174
|
#### Gems
|
129
175
|
|
176
|
+
Rounder's module can be distributed as Gem.
|
177
|
+
|
130
178
|
- [rounders-css_selector_matcher](https://github.com/rike422/rounders-css_selector_matcher)
|
131
179
|
|
132
180
|
#### reciever
|
data/lib/rounders.rb
CHANGED
@@ -3,25 +3,30 @@ require 'rounders/version'
|
|
3
3
|
module Rounders
|
4
4
|
# Your code goes here...
|
5
5
|
CONFIG_DIR_PATH = File.join(Dir.pwd, 'config').freeze
|
6
|
-
|
6
|
+
APP_PATH = File.join(Dir.pwd, 'app').freeze
|
7
7
|
class << self
|
8
8
|
def handlers
|
9
|
-
@
|
9
|
+
@_handlers ||= []
|
10
10
|
end
|
11
11
|
|
12
12
|
def matchers
|
13
|
-
@
|
13
|
+
@_matchers ||= {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def receivers
|
17
|
+
@_receivers ||= []
|
14
18
|
end
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|
18
|
-
require 'active_support/core_ext/object'
|
19
|
-
require 'active_support/inflector'
|
20
22
|
require 'thor'
|
23
|
+
require 'thor/group'
|
24
|
+
require 'dry-configurable'
|
21
25
|
require 'forwardable'
|
22
26
|
require 'mail'
|
23
27
|
require 'dotenv'
|
24
28
|
|
29
|
+
require 'rounders/util'
|
25
30
|
require 'rounders/mail'
|
26
31
|
require 'rounders/plugins/plugin_loader'
|
27
32
|
require 'rounders/plugins/pluggable'
|
@@ -33,11 +38,14 @@ require 'rounders/matchers/from'
|
|
33
38
|
require 'rounders/matchers/to'
|
34
39
|
require 'rounders/handlers/handler'
|
35
40
|
require 'rounders/commander'
|
36
|
-
require 'rounders/receiver'
|
41
|
+
require 'rounders/receivers/receiver'
|
42
|
+
require 'rounders/receivers/mail'
|
37
43
|
require 'rounders/rounder'
|
38
44
|
require 'rounders/brains/base'
|
39
45
|
|
40
|
-
require 'rounders/generators/
|
41
|
-
require 'rounders/generators/app'
|
42
|
-
require 'rounders/generators/
|
43
|
-
require 'rounders/generators/
|
46
|
+
require 'rounders/generators/base'
|
47
|
+
require 'rounders/generators/app/app_generator'
|
48
|
+
require 'rounders/generators/plugin/plugin_generator'
|
49
|
+
require 'rounders/generators/handler/handler_generator'
|
50
|
+
require 'rounders/generators/matcher/matcher_generator'
|
51
|
+
require 'rounders/generators/receiver/receiver_generator'
|
@@ -4,11 +4,19 @@ module Rounders
|
|
4
4
|
class_option :help, type: :boolean, aliases: '-h', desc: 'Help message.'
|
5
5
|
package_name 'rounders'
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
register(
|
8
|
+
Rounders::Generators::AppGenerator,
|
9
|
+
'new',
|
10
|
+
'new <name> <path>',
|
11
|
+
'generate new application'
|
12
|
+
)
|
13
|
+
|
14
|
+
register(
|
15
|
+
Rounders::Generators::PluginGenerator,
|
16
|
+
'plugin',
|
17
|
+
'plugin <name>',
|
18
|
+
'Generate new rounders plugin'
|
19
|
+
)
|
12
20
|
end
|
13
21
|
end
|
14
22
|
end
|