lita-keyword-arguments 0.0.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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +8 -0
- data/Gemfile +3 -0
- data/LICENSE +19 -0
- data/README.md +81 -0
- data/Rakefile +6 -0
- data/lib/lita-keyword-arguments.rb +8 -0
- data/lib/lita/extensions/keyword_arguments.rb +17 -0
- data/lib/lita/extensions/keyword_arguments/parser.rb +41 -0
- data/lita-keyword-arguments.gemspec +25 -0
- data/locales/en.yml +4 -0
- data/spec/lita/extensions/keyword_arguments/parser_spec.rb +84 -0
- data/spec/lita/extensions/keyword_arguments_spec.rb +22 -0
- data/spec/spec_helper.rb +10 -0
- metadata +160 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 50b14a28465dd29840f23d773f7f0fcfb6f07202
|
4
|
+
data.tar.gz: 4b8146bc1102622ad055ecf62dabd5bbc5e34b61
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 459b9de5fc7a45f5cb32caf220426057c1ec5fda0dcad65453fa88ee94a619420fe3bbfae194e44422cf1dc8a02e3f540c117a08b08ca513170e23e5f2ea0da2
|
7
|
+
data.tar.gz: 770e7093e1721832936c0820e43cca3dc0f5b91ff0fd13c6aa177b38a69c0fa4a5bc6ae75a088c33a1ea2ff3d578741c980603bd4e0b9478319ef9963832ce73
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2014 Jimmy Cuadra
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# lita-keyword-arguments
|
2
|
+
|
3
|
+
**lita-keyword-arguments** is an extension for [Lita](https://www.lita.io/) that extracts keyword arguments from messages in the style of command line flags.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add lita-keyword-arguments to your Lita plugin's gemspec:
|
8
|
+
|
9
|
+
``` ruby
|
10
|
+
spec.add_runtime_dependency "lita-keyword-arguments"
|
11
|
+
```
|
12
|
+
|
13
|
+
## Usage
|
14
|
+
|
15
|
+
Define keyword arguments for a route using the `kwargs` option. The value should be a hash, mapping keywords to a hash detailing the rules about that keyword.
|
16
|
+
|
17
|
+
When the route matches, the response object passed to the handler method will have the `:kwargs` key in its `extensions` attribute populated with the parsed keyword argument values.
|
18
|
+
|
19
|
+
Example:
|
20
|
+
|
21
|
+
``` ruby
|
22
|
+
class MyHandler < Lita::Handler
|
23
|
+
route(
|
24
|
+
/^my_command/,
|
25
|
+
:callback
|
26
|
+
command: true,
|
27
|
+
kwargs: {
|
28
|
+
foo: {},
|
29
|
+
bar: {
|
30
|
+
short: "b",
|
31
|
+
default: "unset"
|
32
|
+
},
|
33
|
+
verbose: {
|
34
|
+
short: "v",
|
35
|
+
boolean: true
|
36
|
+
}
|
37
|
+
}
|
38
|
+
)
|
39
|
+
|
40
|
+
def callback(response)
|
41
|
+
# response.extensions[:kwargs] will be populated with a hash of keywords and their values.
|
42
|
+
end
|
43
|
+
end
|
44
|
+
```
|
45
|
+
|
46
|
+
The above `:kwargs` hash would make lita-keyword-arguments recognize the following in messages:
|
47
|
+
|
48
|
+
```
|
49
|
+
[--foo VALUE] [-b | --bar VALUE] [-v | --verbose | --no-verbose]
|
50
|
+
```
|
51
|
+
|
52
|
+
The `:bar` keyword be set to the string "unset" if no value was provided in the message.
|
53
|
+
|
54
|
+
|
55
|
+
The possible keys for each keyword argument's specification are:
|
56
|
+
|
57
|
+
* `:short` - A single letter to use for the short flag. Invoked with a single preceeding dash. For example: "-f".
|
58
|
+
* `:boolean` - The kwarg represents a boolean and does not have an argument. Set to true by providing the flag. Set to false by providing the long version of the flag, prefixing the keyword with "no-". For example: "--no-verbose".
|
59
|
+
* `:default` - A default value to give the keyword argument if the flag is not provided in the message.
|
60
|
+
|
61
|
+
The long flag (e.g. --foo) is automatically created from the key.
|
62
|
+
|
63
|
+
Example messages and their resulting hashes:
|
64
|
+
|
65
|
+
``` ruby
|
66
|
+
# Lita: my_command -b hello
|
67
|
+
{ bar: "hello" }
|
68
|
+
|
69
|
+
# Lita: my_command --foo baz
|
70
|
+
{ foo: "baz", bar: "unset" }
|
71
|
+
|
72
|
+
# Lita: my_command -v
|
73
|
+
{ bar: "unset", verbose: true }
|
74
|
+
|
75
|
+
# Lita: my_command --no-verbose
|
76
|
+
{ bar: "unset", verbose: false }
|
77
|
+
```
|
78
|
+
|
79
|
+
## License
|
80
|
+
|
81
|
+
[MIT](http://opensource.org/licenses/MIT)
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Lita
|
2
|
+
module Extensions
|
3
|
+
class KeywordArguments
|
4
|
+
def self.call(payload)
|
5
|
+
spec = payload[:route].extensions[:kwargs]
|
6
|
+
|
7
|
+
if spec
|
8
|
+
response = payload[:response]
|
9
|
+
kwargs = Parser.new(spec, response.message.args).parse
|
10
|
+
response.extensions[:kwargs] = kwargs
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Lita.register_hook(:trigger_route, KeywordArguments)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'slop'
|
2
|
+
|
3
|
+
module Lita
|
4
|
+
module Extensions
|
5
|
+
class KeywordArguments
|
6
|
+
class Parser
|
7
|
+
attr_reader :args, :spec
|
8
|
+
|
9
|
+
def initialize(spec, args)
|
10
|
+
@spec = spec
|
11
|
+
@args = args
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse
|
15
|
+
spec.each { |name, option_spec| add_option(name, option_spec) }
|
16
|
+
parser.parse(args)
|
17
|
+
parser.to_hash
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def add_option(name, spec)
|
23
|
+
opt_args = []
|
24
|
+
opt_options = {}
|
25
|
+
|
26
|
+
opt_args << spec[:short] if spec[:short]
|
27
|
+
opt_args << name
|
28
|
+
opt_options[:default] = spec[:default] if spec[:default]
|
29
|
+
opt_options[:optional_argument] = true unless spec[:boolean]
|
30
|
+
opt_args << opt_options
|
31
|
+
|
32
|
+
parser.on(*opt_args)
|
33
|
+
end
|
34
|
+
|
35
|
+
def parser
|
36
|
+
@parser ||= Slop.new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = "lita-keyword-arguments"
|
3
|
+
spec.version = "0.0.1"
|
4
|
+
spec.authors = ["Jimmy Cuadra"]
|
5
|
+
spec.email = ["jimmy@jimmycuadra.com"]
|
6
|
+
spec.description = %q{A Lita extension to extract CLI-style arguments from messages.}
|
7
|
+
spec.summary = %q{A Lita extension to extract CLI-style arguments from messages.}
|
8
|
+
spec.homepage = "https://github.com/jimmycuadra/lita-keyword-arguments"
|
9
|
+
spec.license = "MIT"
|
10
|
+
spec.metadata = { "lita_plugin_type" => "extension" }
|
11
|
+
|
12
|
+
spec.files = `git ls-files`.split($/)
|
13
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
14
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
|
+
spec.require_paths = ["lib"]
|
16
|
+
|
17
|
+
spec.add_runtime_dependency "lita", ">= 3.2"
|
18
|
+
spec.add_runtime_dependency "slop", ">= 3.5"
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
21
|
+
spec.add_development_dependency "rake"
|
22
|
+
spec.add_development_dependency "rspec", ">= 3.0.0.beta2"
|
23
|
+
spec.add_development_dependency "simplecov"
|
24
|
+
spec.add_development_dependency "coveralls"
|
25
|
+
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Lita::Extensions::KeywordArguments::Parser do
|
4
|
+
it "parses long flags" do
|
5
|
+
subject = described_class.new(
|
6
|
+
{ foo: {} },
|
7
|
+
"--foo bar".split
|
8
|
+
)
|
9
|
+
|
10
|
+
expect(subject.parse).to eq(foo: "bar")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "sets missing arguments to nil" do
|
14
|
+
subject = described_class.new(
|
15
|
+
{ foo: {} },
|
16
|
+
"--foo".split
|
17
|
+
)
|
18
|
+
|
19
|
+
expect(subject.parse).to eq(foo: nil)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "parses short flags" do
|
23
|
+
subject = described_class.new(
|
24
|
+
{ foo: { short: "f" } },
|
25
|
+
"-f bar".split
|
26
|
+
)
|
27
|
+
|
28
|
+
expect(subject.parse).to eq(foo: "bar")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "parses long boolean flags" do
|
32
|
+
subject = described_class.new(
|
33
|
+
{ foo: { boolean: true } },
|
34
|
+
"--foo".split
|
35
|
+
)
|
36
|
+
|
37
|
+
expect(subject.parse).to eq(foo: true)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "parses inverted long boolean flags" do
|
41
|
+
subject = described_class.new(
|
42
|
+
{ foo: { boolean: true, default: true } },
|
43
|
+
"--no-foo".split
|
44
|
+
)
|
45
|
+
|
46
|
+
expect(subject.parse).to eq(foo: false)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "parses short boolean flags" do
|
50
|
+
subject = described_class.new(
|
51
|
+
{ foo: { short: "f", boolean: true } },
|
52
|
+
"-f".split
|
53
|
+
)
|
54
|
+
|
55
|
+
expect(subject.parse).to eq(foo: true)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "includes defaults" do
|
59
|
+
subject = described_class.new(
|
60
|
+
{ foo: { default: "bar" } },
|
61
|
+
"".split
|
62
|
+
)
|
63
|
+
|
64
|
+
expect(subject.parse).to eq(foo: "bar")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "overrides defaults when values are supplied" do
|
68
|
+
subject = described_class.new(
|
69
|
+
{ foo: { default: "bar" } },
|
70
|
+
"--foo baz".split
|
71
|
+
)
|
72
|
+
|
73
|
+
expect(subject.parse).to eq(foo: "baz")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "parses known options even when an unknown option is encountered first" do
|
77
|
+
subject = described_class.new(
|
78
|
+
{ foo: { short: "f", boolean: true } },
|
79
|
+
"-x -f".split
|
80
|
+
)
|
81
|
+
|
82
|
+
expect(subject.parse).to eq(foo: true)
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Lita::Extensions::KeywordArguments, lita: true do
|
4
|
+
let(:message) { instance_double("Lita::Message", args: []) }
|
5
|
+
let(:parser) { instance_double("Lita::Extensions::KeywordArguments::Parser", parse: {}) }
|
6
|
+
let(:response) { instance_double("Lita::Response", extensions: {}, message: message) }
|
7
|
+
let(:route) { instance_double("Lita::Handler::Route", extensions: { kwargs: {} }) }
|
8
|
+
|
9
|
+
describe ".call" do
|
10
|
+
before { allow(Lita::Extensions::KeywordArguments::Parser).to receive(:new).and_return(parser) }
|
11
|
+
it "adds kwargs to the response's extensions data" do
|
12
|
+
described_class.call(response: response, route: route)
|
13
|
+
expect(response.extensions[:kwargs]).not_to be_nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it "does nothing if the route did not include a kwargs spec" do
|
17
|
+
route.extensions.delete(:kwargs)
|
18
|
+
described_class.call(response: response, route: route)
|
19
|
+
expect(response.extensions[:kwargs]).to be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require "simplecov"
|
2
|
+
require "coveralls"
|
3
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
4
|
+
SimpleCov::Formatter::HTMLFormatter,
|
5
|
+
Coveralls::SimpleCov::Formatter
|
6
|
+
]
|
7
|
+
SimpleCov.start { add_filter "/spec/" }
|
8
|
+
|
9
|
+
require "lita-keyword-arguments"
|
10
|
+
require "lita/rspec"
|
metadata
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lita-keyword-arguments
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jimmy Cuadra
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-05-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: lita
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: slop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.5'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.0.0.beta2
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.0.0.beta2
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: coveralls
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: A Lita extension to extract CLI-style arguments from messages.
|
112
|
+
email:
|
113
|
+
- jimmy@jimmycuadra.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- ".gitignore"
|
119
|
+
- ".travis.yml"
|
120
|
+
- Gemfile
|
121
|
+
- LICENSE
|
122
|
+
- README.md
|
123
|
+
- Rakefile
|
124
|
+
- lib/lita-keyword-arguments.rb
|
125
|
+
- lib/lita/extensions/keyword_arguments.rb
|
126
|
+
- lib/lita/extensions/keyword_arguments/parser.rb
|
127
|
+
- lita-keyword-arguments.gemspec
|
128
|
+
- locales/en.yml
|
129
|
+
- spec/lita/extensions/keyword_arguments/parser_spec.rb
|
130
|
+
- spec/lita/extensions/keyword_arguments_spec.rb
|
131
|
+
- spec/spec_helper.rb
|
132
|
+
homepage: https://github.com/jimmycuadra/lita-keyword-arguments
|
133
|
+
licenses:
|
134
|
+
- MIT
|
135
|
+
metadata:
|
136
|
+
lita_plugin_type: extension
|
137
|
+
post_install_message:
|
138
|
+
rdoc_options: []
|
139
|
+
require_paths:
|
140
|
+
- lib
|
141
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
151
|
+
requirements: []
|
152
|
+
rubyforge_project:
|
153
|
+
rubygems_version: 2.2.2
|
154
|
+
signing_key:
|
155
|
+
specification_version: 4
|
156
|
+
summary: A Lita extension to extract CLI-style arguments from messages.
|
157
|
+
test_files:
|
158
|
+
- spec/lita/extensions/keyword_arguments/parser_spec.rb
|
159
|
+
- spec/lita/extensions/keyword_arguments_spec.rb
|
160
|
+
- spec/spec_helper.rb
|