xre 0.5.0 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Cargo.lock +36 -28
- data/README.md +78 -18
- data/ext/xre/Cargo.toml +1 -0
- data/ext/xre/src/regex_list.rs +7 -5
- data/lib/xre/version.rb +1 -1
- data/lib/xre.rb +1 -1
- metadata +6 -21
- data/tmp/arm64-darwin21/stage/Cargo.lock +0 -348
- data/tmp/arm64-darwin21/stage/Cargo.toml +0 -10
- data/tmp/arm64-darwin21/stage/ext/xre/Cargo.toml +0 -15
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.lock +0 -348
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.toml +0 -10
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/ext/xre/Cargo.toml +0 -15
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.lock +0 -348
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.toml +0 -10
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/ext/xre/Cargo.toml +0 -15
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.lock +0 -348
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.toml +0 -10
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/ext/xre/Cargo.toml +0 -15
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.lock +0 -348
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.toml +0 -10
- data/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/ext/xre/Cargo.toml +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93ba49bc70fd3401c2f77992616d79f1b0154546a5bd8179d73579c6e92a8c78
|
4
|
+
data.tar.gz: 171f4ac8e4ed4838c1933964bb67f0676931e47e3754e48a7a3b4fe2a77e8521
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f607af2e3d89f47bd22024a7c6e97c5ec4d18ff2c17f53d20c4fa9da6f70db4ee63153ca2a05681bf883cfdb6017e0c049fe5e583df35b23deef023dd68d8693
|
7
|
+
data.tar.gz: c44b557ca39348ee05bcd4ac4787d4f8c8743c6323f56d5a141a5f25fd5bf8c602dece627dbe0587756217d641813c311038593a1d08016e82ebaf25b115bff3
|
data/Cargo.lock
CHANGED
@@ -65,9 +65,9 @@ dependencies = [
|
|
65
65
|
|
66
66
|
[[package]]
|
67
67
|
name = "either"
|
68
|
-
version = "1.
|
68
|
+
version = "1.11.0"
|
69
69
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
70
|
-
checksum = "
|
70
|
+
checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
|
71
71
|
|
72
72
|
[[package]]
|
73
73
|
name = "glob"
|
@@ -159,36 +159,36 @@ dependencies = [
|
|
159
159
|
|
160
160
|
[[package]]
|
161
161
|
name = "proc-macro2"
|
162
|
-
version = "1.0.
|
162
|
+
version = "1.0.81"
|
163
163
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
164
|
-
checksum = "
|
164
|
+
checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba"
|
165
165
|
dependencies = [
|
166
166
|
"unicode-ident",
|
167
167
|
]
|
168
168
|
|
169
169
|
[[package]]
|
170
170
|
name = "quote"
|
171
|
-
version = "1.0.
|
171
|
+
version = "1.0.36"
|
172
172
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
173
|
-
checksum = "
|
173
|
+
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
|
174
174
|
dependencies = [
|
175
175
|
"proc-macro2",
|
176
176
|
]
|
177
177
|
|
178
178
|
[[package]]
|
179
179
|
name = "rb-sys"
|
180
|
-
version = "0.9.
|
180
|
+
version = "0.9.96"
|
181
181
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
182
|
-
checksum = "
|
182
|
+
checksum = "49afe6f8e47144fe597a228f5b817b11fbc53a4aaee436b7ad1c0a081a9dbd7c"
|
183
183
|
dependencies = [
|
184
184
|
"rb-sys-build",
|
185
185
|
]
|
186
186
|
|
187
187
|
[[package]]
|
188
188
|
name = "rb-sys-build"
|
189
|
-
version = "0.9.
|
189
|
+
version = "0.9.96"
|
190
190
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
191
|
-
checksum = "
|
191
|
+
checksum = "bd0d280a17a2c69a63cd9ba3381970f4c25e6104bc771678d1a70f19cac920c5"
|
192
192
|
dependencies = [
|
193
193
|
"bindgen",
|
194
194
|
"lazy_static",
|
@@ -260,9 +260,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
|
260
260
|
|
261
261
|
[[package]]
|
262
262
|
name = "syn"
|
263
|
-
version = "2.0.
|
263
|
+
version = "2.0.60"
|
264
264
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
265
|
-
checksum = "
|
265
|
+
checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3"
|
266
266
|
dependencies = [
|
267
267
|
"proc-macro2",
|
268
268
|
"quote",
|
@@ -283,13 +283,14 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
|
|
283
283
|
|
284
284
|
[[package]]
|
285
285
|
name = "windows-targets"
|
286
|
-
version = "0.52.
|
286
|
+
version = "0.52.5"
|
287
287
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
288
|
-
checksum = "
|
288
|
+
checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
|
289
289
|
dependencies = [
|
290
290
|
"windows_aarch64_gnullvm",
|
291
291
|
"windows_aarch64_msvc",
|
292
292
|
"windows_i686_gnu",
|
293
|
+
"windows_i686_gnullvm",
|
293
294
|
"windows_i686_msvc",
|
294
295
|
"windows_x86_64_gnu",
|
295
296
|
"windows_x86_64_gnullvm",
|
@@ -298,51 +299,58 @@ dependencies = [
|
|
298
299
|
|
299
300
|
[[package]]
|
300
301
|
name = "windows_aarch64_gnullvm"
|
301
|
-
version = "0.52.
|
302
|
+
version = "0.52.5"
|
302
303
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
303
|
-
checksum = "
|
304
|
+
checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
|
304
305
|
|
305
306
|
[[package]]
|
306
307
|
name = "windows_aarch64_msvc"
|
307
|
-
version = "0.52.
|
308
|
+
version = "0.52.5"
|
308
309
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
309
|
-
checksum = "
|
310
|
+
checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
|
310
311
|
|
311
312
|
[[package]]
|
312
313
|
name = "windows_i686_gnu"
|
313
|
-
version = "0.52.
|
314
|
+
version = "0.52.5"
|
314
315
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
315
|
-
checksum = "
|
316
|
+
checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
|
317
|
+
|
318
|
+
[[package]]
|
319
|
+
name = "windows_i686_gnullvm"
|
320
|
+
version = "0.52.5"
|
321
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
322
|
+
checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
|
316
323
|
|
317
324
|
[[package]]
|
318
325
|
name = "windows_i686_msvc"
|
319
|
-
version = "0.52.
|
326
|
+
version = "0.52.5"
|
320
327
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
321
|
-
checksum = "
|
328
|
+
checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
|
322
329
|
|
323
330
|
[[package]]
|
324
331
|
name = "windows_x86_64_gnu"
|
325
|
-
version = "0.52.
|
332
|
+
version = "0.52.5"
|
326
333
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
327
|
-
checksum = "
|
334
|
+
checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
|
328
335
|
|
329
336
|
[[package]]
|
330
337
|
name = "windows_x86_64_gnullvm"
|
331
|
-
version = "0.52.
|
338
|
+
version = "0.52.5"
|
332
339
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
333
|
-
checksum = "
|
340
|
+
checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
|
334
341
|
|
335
342
|
[[package]]
|
336
343
|
name = "windows_x86_64_msvc"
|
337
|
-
version = "0.52.
|
344
|
+
version = "0.52.5"
|
338
345
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
339
|
-
checksum = "
|
346
|
+
checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
|
340
347
|
|
341
348
|
[[package]]
|
342
349
|
name = "xre"
|
343
350
|
version = "0.1.0"
|
344
351
|
dependencies = [
|
345
352
|
"magnus",
|
353
|
+
"rb-sys",
|
346
354
|
"regex",
|
347
355
|
"unicode-segmentation",
|
348
356
|
]
|
data/README.md
CHANGED
@@ -1,35 +1,95 @@
|
|
1
|
-
#
|
1
|
+
# Xre
|
2
2
|
|
3
|
-
|
3
|
+
This is a rust extension for finding all the matches in a text.
|
4
|
+
It's a simple extension that is used in one part of our codebase and this extension makes it substantially faster.
|
4
5
|
|
5
|
-
##
|
6
|
+
## Why?
|
6
7
|
|
7
|
-
|
8
|
+
The main reason for this extension is that we have a unique use case where we need to find all captures
|
9
|
+
with their respectful offsets in a large text and we need to do this for a huge number of regexes and texts.
|
10
|
+
This is a slow operation in ruby since the regular `scan` does not provide the actual captures,
|
11
|
+
but only the offsets. This extension provides the captures and offsets in a single call for a
|
12
|
+
list of regexes to avoid the overhead of calling the regex engine multiple times.
|
8
13
|
|
9
|
-
|
14
|
+
Moreover, another part of the problem is that we also require the surrounding text of the capture
|
15
|
+
with some radius, which is also not possible with the regular `scan` method without resorting to iterating
|
16
|
+
the whole text multiple times.
|
10
17
|
|
11
|
-
|
18
|
+
> 🤓
|
19
|
+
> Another a bit more technical reason for why the rust extension is faster is that ruby strings are
|
20
|
+
> indexed in characters(`O(n)`), but rust strings are indexed in bytes(`O(1)`). And with a careful
|
21
|
+
> iteration over the characters on the rust side(see `regex_list.rs#captures_with_context` and `utils.rs#find_char_index`) as we go through the text we can avoid multiple(`n`)
|
22
|
+
> `O(n)` operations that ruby would have to do, reducing the algorithmic complexity from
|
23
|
+
> `O(n^2)` to `O(n)` for one regex, and from `O(m * n^2)` to `O(m * n)`(where `m` and `n` are the number
|
24
|
+
> of regexes and the number of texts respectfuly) for multiple regexes.
|
12
25
|
|
13
|
-
|
26
|
+
## Developing:
|
14
27
|
|
15
|
-
|
28
|
+
The simplest way to develop the gem locally without reinstalling the gem is to just:
|
16
29
|
|
17
|
-
|
30
|
+
1. change the
|
31
|
+
`gem "xre"` in the `Gemfile` to `gem "xre", path: "xre"`
|
32
|
+
2. run `bundle install`
|
18
33
|
|
19
|
-
|
34
|
+
and you're good to go. Just change the code(then compile the rust code if you changed it, more on that below),
|
35
|
+
go into `rails c` and hack away.
|
20
36
|
|
21
|
-
|
37
|
+
Another simple way is to:
|
22
38
|
|
23
|
-
|
39
|
+
1. change the gem code(then, once again, compile the rust code if you changed it)
|
40
|
+
2. go into `rails c` or the console of your choosing
|
41
|
+
3. run `require_relative "xre/lib/xre"`
|
24
42
|
|
25
|
-
|
43
|
+
all done.
|
26
44
|
|
27
|
-
|
45
|
+
> 💡Note: _The following part of the readme assumes that you're in the `xre` directory inside `clearscope` project._
|
28
46
|
|
29
|
-
|
47
|
+
### How to build rust code locally:
|
30
48
|
|
31
|
-
|
49
|
+
```bash
|
50
|
+
rake compile # or just rake
|
51
|
+
```
|
32
52
|
|
33
|
-
|
53
|
+
sometimes you might need to clean the build:
|
34
54
|
|
35
|
-
|
55
|
+
```bash
|
56
|
+
rake clean && rake compile
|
57
|
+
```
|
58
|
+
|
59
|
+
you might need to install rust toolchain for that:
|
60
|
+
|
61
|
+
```bash
|
62
|
+
curl https://sh.rustup.rs -sSf | sh
|
63
|
+
```
|
64
|
+
|
65
|
+
### How to run tests:
|
66
|
+
|
67
|
+
**Ruby tests:**
|
68
|
+
|
69
|
+
```bash
|
70
|
+
bundle exec rake spec
|
71
|
+
```
|
72
|
+
|
73
|
+
**Rust tests:**
|
74
|
+
|
75
|
+
```bash
|
76
|
+
cargo test # you will need rust toolchain for that
|
77
|
+
```
|
78
|
+
|
79
|
+
**Rust linting:**
|
80
|
+
|
81
|
+
````bash
|
82
|
+
# you will need rust toolchain for that
|
83
|
+
cargo fmt # will format the code
|
84
|
+
cargo clippy # will suggest improvements, not only style ones
|
85
|
+
```
|
86
|
+
|
87
|
+
## Publishing:
|
88
|
+
|
89
|
+
The codebase includes `xre/Rakefile` which in turn defines a `gem:native`
|
90
|
+
task that compiles the extension for the `x86_64-linux`, `x86_64-darwin`, and `arm64-darwin`
|
91
|
+
and puts the compiled gems into `xre/pkg/` directory, from where one should
|
92
|
+
`gem push xre-<version>-x86_64-linux.gem` to publish the gem.
|
93
|
+
|
94
|
+
> Note: You will need a docker installed on your machine for that
|
95
|
+
````
|
data/ext/xre/Cargo.toml
CHANGED
data/ext/xre/src/regex_list.rs
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
mod utils;
|
2
2
|
|
3
|
+
use std::cmp::Reverse;
|
4
|
+
|
3
5
|
use magnus::{exception, Error};
|
4
6
|
use regex::{escape, Match, Regex, RegexBuilder};
|
5
7
|
use unicode_segmentation::UnicodeSegmentation;
|
@@ -23,7 +25,7 @@ impl RegexList {
|
|
23
25
|
pub fn build_from_strings(targets: Vec<Vec<String>>) -> Result<Self, Error> {
|
24
26
|
let targets = targets
|
25
27
|
.iter()
|
26
|
-
.map(|t| combine_into_regex_like(t))
|
28
|
+
.map(|t| combine_into_regex_like(t as &[String]))
|
27
29
|
.collect::<Vec<String>>();
|
28
30
|
|
29
31
|
Self::new(targets)
|
@@ -71,13 +73,13 @@ fn fuzzy_escape(grapheme: &str) -> String {
|
|
71
73
|
}
|
72
74
|
}
|
73
75
|
|
74
|
-
fn combine_into_regex_like(targets: &
|
76
|
+
fn combine_into_regex_like(targets: &[String]) -> String {
|
75
77
|
let mut targets = targets
|
76
78
|
.iter()
|
77
|
-
.map(|t| t.graphemes(true).map(
|
79
|
+
.map(|t| t.graphemes(true).map(fuzzy_escape).collect())
|
78
80
|
.collect::<Vec<String>>();
|
79
81
|
|
80
|
-
targets.
|
82
|
+
targets.sort_unstable_by_key(|a| Reverse(a.len()));
|
81
83
|
|
82
84
|
format!("(?im:({}))", targets.join("|"))
|
83
85
|
}
|
@@ -130,7 +132,7 @@ fn captures<'a>(target: &'a Regex, subject: &'a str) -> Result<Vec<Match<'a>>, E
|
|
130
132
|
target
|
131
133
|
.captures_iter(subject)
|
132
134
|
.map(|m| {
|
133
|
-
m.get(
|
135
|
+
m.get(1).ok_or(Error::new(
|
134
136
|
exception::runtime_error(),
|
135
137
|
"No capture group found",
|
136
138
|
))
|
data/lib/xre/version.rb
CHANGED
data/lib/xre.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xre
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- barseek
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-04-
|
11
|
+
date: 2024-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rb_sys
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.9.96
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.9.96
|
27
27
|
description:
|
28
28
|
email:
|
29
29
|
- sergey.b@hey.com
|
@@ -42,21 +42,6 @@ files:
|
|
42
42
|
- ext/xre/src/regex_list/utils.rs
|
43
43
|
- lib/xre.rb
|
44
44
|
- lib/xre/version.rb
|
45
|
-
- tmp/arm64-darwin21/stage/Cargo.lock
|
46
|
-
- tmp/arm64-darwin21/stage/Cargo.toml
|
47
|
-
- tmp/arm64-darwin21/stage/ext/xre/Cargo.toml
|
48
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.lock
|
49
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.toml
|
50
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/ext/xre/Cargo.toml
|
51
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.lock
|
52
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.toml
|
53
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/ext/xre/Cargo.toml
|
54
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.lock
|
55
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.toml
|
56
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/ext/xre/Cargo.toml
|
57
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.lock
|
58
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/Cargo.toml
|
59
|
-
- tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/tmp/arm64-darwin21/stage/ext/xre/Cargo.toml
|
60
45
|
homepage: https://github.com/vagab/xre
|
61
46
|
licenses:
|
62
47
|
- MIT
|
@@ -71,14 +56,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
71
56
|
requirements:
|
72
57
|
- - ">="
|
73
58
|
- !ruby/object:Gem::Version
|
74
|
-
version: 3.
|
59
|
+
version: '3.1'
|
75
60
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
61
|
requirements:
|
77
62
|
- - ">="
|
78
63
|
- !ruby/object:Gem::Version
|
79
64
|
version: 3.3.11
|
80
65
|
requirements: []
|
81
|
-
rubygems_version: 3.
|
66
|
+
rubygems_version: 3.5.9
|
82
67
|
signing_key:
|
83
68
|
specification_version: 4
|
84
69
|
summary: short summary, because RubyGems requires one.
|