rushed 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +6 -0
- data/.travis.yml +7 -0
- data/Appraisals +7 -0
- data/Gemfile +3 -0
- data/MIT-LICENSE +20 -0
- data/README.md +253 -0
- data/Rakefile +12 -0
- data/bin/ru +26 -0
- data/doc/logo.png +0 -0
- data/gemfiles/activesupport_3.gemfile +7 -0
- data/gemfiles/activesupport_3.gemfile.lock +42 -0
- data/gemfiles/activesupport_4.gemfile +7 -0
- data/gemfiles/activesupport_4.gemfile.lock +49 -0
- data/lib/rushed.rb +7 -0
- data/lib/rushed/array.rb +86 -0
- data/lib/rushed/file.rb +94 -0
- data/lib/rushed/iterator.rb +44 -0
- data/lib/rushed/process.rb +29 -0
- data/lib/rushed/version.rb +3 -0
- data/rushed.gemspec +20 -0
- data/spec/examples/misc_examples_spec.rb +39 -0
- data/spec/examples/sed_examples_spec.rb +95 -0
- data/spec/fixtures/files/access.log +5 -0
- data/spec/fixtures/files/bar.txt +1 -0
- data/spec/fixtures/files/foo.txt +3 -0
- data/spec/lib/array_spec.rb +38 -0
- data/spec/lib/iterator_spec.rb +24 -0
- data/spec/lib/process_spec.rb +67 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/support/fixtures_helper.rb +6 -0
- data/spec/support/process_helper.rb +14 -0
- metadata +57 -14
- data/lib/dotsh.rb +0 -5
- data/lib/dotsh/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9298010fb349cb3dbfcb5daf568877950fd6b740
|
4
|
+
data.tar.gz: 101d17cf9b43fec0d153e1feb9cf7329c26da798
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05113721883a37413444b9e1b637d1480acbc203f03392e676a78792df5f6c4b71db04aed32bb1d45fb4ab428d258c4680b151b54cd725ee3f7c6902aca55282
|
7
|
+
data.tar.gz: e44b016b715e39190bf28c0730b989cee82558213141a51aeb164827637ba59cda9350e917f320645b9c9266e5af5837163e5d2573487f0d69af8e13e836c2ae
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Appraisals
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2014 Tom Benner
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,253 @@
|
|
1
|
+
Rushed
|
2
|
+
=====
|
3
|
+
Ruby in your shell!
|
4
|
+
|
5
|
+
<img src="https://raw.github.com/tombenner/rushed/master/doc/logo.png" />
|
6
|
+
|
7
|
+
Overview
|
8
|
+
--------
|
9
|
+
|
10
|
+
Rushed brings Ruby's expressiveness, cleanliness, and readability to the command line.
|
11
|
+
|
12
|
+
It lets you avoid looking up pesky options in man pages and Googling how to write a transformation in bash that would take you approximately 1s to write in Ruby.
|
13
|
+
|
14
|
+
For example, to center a file's lines, use [String#center](http://ruby-doc.org/core-2.0/String.html#method-i-center):
|
15
|
+
|
16
|
+
```bash
|
17
|
+
ru 'map(:center, 80)' myfile
|
18
|
+
```
|
19
|
+
|
20
|
+
Using traditional tools, this isn't as easy or readable:
|
21
|
+
|
22
|
+
```bash
|
23
|
+
awk 'printf "%" int(40+length($0)/2) "s\n", $0' myfile
|
24
|
+
```
|
25
|
+
|
26
|
+
For another example, let's compare summing the lines of a list of integers using Rushed vs. a traditional approach:
|
27
|
+
|
28
|
+
```bash
|
29
|
+
ru 'map(:to_i).sum' myfile
|
30
|
+
```
|
31
|
+
|
32
|
+
```bash
|
33
|
+
awk '{s+=$1} END {print s}' myfile
|
34
|
+
```
|
35
|
+
|
36
|
+
Any method from Ruby Core and Active Support can be used. Rushed also provides some new methods to make transformations easier. Here are some variations on the above example:
|
37
|
+
|
38
|
+
```bash
|
39
|
+
ru 'map(:to_i, 10).sum' myfile
|
40
|
+
ru 'map(:to_i).reduce(&:+)' myfile
|
41
|
+
ru 'each_line.to_i.to_a.sum' myfile
|
42
|
+
ru 'grep(/^\d+$/).map(:to_i).sum' myfile
|
43
|
+
ru 'reduce(0) { |sum, n| sum + n.to_i }' myfile
|
44
|
+
ru 'each_line.match(/(\d+)/)[1].to_i.to_a.sum' myfile
|
45
|
+
```
|
46
|
+
|
47
|
+
See [Examples](#examples) and [Methods](#methods) for more.
|
48
|
+
|
49
|
+
Installation
|
50
|
+
------------
|
51
|
+
|
52
|
+
```bash
|
53
|
+
gem install rushed
|
54
|
+
```
|
55
|
+
|
56
|
+
You can now use Ruby in your shell!
|
57
|
+
|
58
|
+
For example, to sum a list of integers:
|
59
|
+
|
60
|
+
```bash
|
61
|
+
$ echo "2\n3" | ru 'map(:to_i).sum'
|
62
|
+
5
|
63
|
+
```
|
64
|
+
|
65
|
+
Usage
|
66
|
+
-----
|
67
|
+
|
68
|
+
See [Examples](#examples) below, too!
|
69
|
+
|
70
|
+
Rushed reads from stdin:
|
71
|
+
|
72
|
+
```bash
|
73
|
+
$ echo "2\n3" | ru 'map(:to_i).sum'
|
74
|
+
5
|
75
|
+
$ cat myfile | ru 'map(:to_i).sum'
|
76
|
+
5
|
77
|
+
```
|
78
|
+
|
79
|
+
Or from file(s):
|
80
|
+
|
81
|
+
```bash
|
82
|
+
$ ru 'map(:to_i).sum' myfile
|
83
|
+
5
|
84
|
+
$ ru 'map(:to_i).sum' myfile myfile
|
85
|
+
10
|
86
|
+
```
|
87
|
+
|
88
|
+
You can also run Ruby code without any input by prepending a `! `:
|
89
|
+
|
90
|
+
```bash
|
91
|
+
$ ru '! 2 + 3'
|
92
|
+
5
|
93
|
+
```
|
94
|
+
|
95
|
+
In addition to the methods provided by Ruby Core and Active Support, Rushed provides other methods for performing transformations, like `each_line`, `files`, and `grep`. See [Methods](#methods) for more.
|
96
|
+
|
97
|
+
Examples
|
98
|
+
--------
|
99
|
+
|
100
|
+
Let's compare the readability and conciseness of Rushed relative to existing tools:
|
101
|
+
|
102
|
+
#### Center lines
|
103
|
+
|
104
|
+
##### ru
|
105
|
+
```bash
|
106
|
+
ru 'map(:center, 80)' myfile
|
107
|
+
```
|
108
|
+
|
109
|
+
##### awk
|
110
|
+
```bash
|
111
|
+
awk 'printf "%" int(40+length($0)/2) "s\n", $0' myfile
|
112
|
+
```
|
113
|
+
|
114
|
+
##### sed
|
115
|
+
[Script](https://www.gnu.org/software/sed/manual/sed.html#Centering-lines)
|
116
|
+
|
117
|
+
#### Sum a list of integers
|
118
|
+
|
119
|
+
##### ru
|
120
|
+
```bash
|
121
|
+
ru 'map(:to_i).sum' myfile
|
122
|
+
```
|
123
|
+
|
124
|
+
##### awk
|
125
|
+
```bash
|
126
|
+
awk '{s+=$1} END {print s}' myfile
|
127
|
+
```
|
128
|
+
|
129
|
+
##### paste
|
130
|
+
```bash
|
131
|
+
paste -s -d+ myfile | bc
|
132
|
+
```
|
133
|
+
|
134
|
+
#### Print the 5th line
|
135
|
+
|
136
|
+
##### ru
|
137
|
+
```bash
|
138
|
+
ru '[4]' myfile
|
139
|
+
```
|
140
|
+
|
141
|
+
##### sed
|
142
|
+
```bash
|
143
|
+
sed '5q;d' myfile
|
144
|
+
```
|
145
|
+
|
146
|
+
#### Print all lines except the first and last
|
147
|
+
|
148
|
+
##### ru
|
149
|
+
```bash
|
150
|
+
ru '[1..-2]' myfile
|
151
|
+
```
|
152
|
+
|
153
|
+
##### sed
|
154
|
+
```bash
|
155
|
+
sed '1d;$d' myfile
|
156
|
+
```
|
157
|
+
|
158
|
+
#### Sort an Apache access log by response time (decreasing, with time prepended)
|
159
|
+
|
160
|
+
##### ru
|
161
|
+
```bash
|
162
|
+
ru 'map { |line| [line[/(\d+)( ".+"){2}$/, 1].to_i, line] }.sort.reverse.map(:join, " ")' access.log
|
163
|
+
```
|
164
|
+
|
165
|
+
##### awk
|
166
|
+
```bash
|
167
|
+
awk --re-interval '{ match($0, /(([^[:space:]]+|\[[^\]]+\]|"[^"]+")[[:space:]]+){7}/, m); print m[2], $0 }' access.log | sort -nk 1
|
168
|
+
```
|
169
|
+
[Source](https://coderwall.com/p/ueazhw)
|
170
|
+
|
171
|
+
Methods
|
172
|
+
-------
|
173
|
+
|
174
|
+
In addition to the methods provided by Ruby Core and Active Support, Rushed provides other methods for performing transformations.
|
175
|
+
|
176
|
+
#### each_line
|
177
|
+
|
178
|
+
Provides a shorthand for calling methods on each iteration of the input. Best explained by example:
|
179
|
+
|
180
|
+
```bash
|
181
|
+
ru 'each_line.strip.center(80)' myfile
|
182
|
+
```
|
183
|
+
|
184
|
+
If you'd like to transform it back into a list, call `to_a`:
|
185
|
+
|
186
|
+
```bash
|
187
|
+
ru 'each_line.strip.to_a.map(:center, 80)' myfile
|
188
|
+
```
|
189
|
+
|
190
|
+
#### files
|
191
|
+
|
192
|
+
Converts the lines to `Rushed::File` objects (see Dotsch::File below).
|
193
|
+
|
194
|
+
```bash
|
195
|
+
$ echo "foo.txt" | ru 'files.map(:updated_at).map(:strftime, ""%Y-%m-%d")'
|
196
|
+
2014-11-08
|
197
|
+
```
|
198
|
+
|
199
|
+
#### format(format='l')
|
200
|
+
|
201
|
+
Formats a list of `Dotsch::File`s. You'll typically call this after calling `files` to transform them into strings:
|
202
|
+
|
203
|
+
```bash
|
204
|
+
$ ru 'files.format'
|
205
|
+
644 tom staff 3 2014-10-26 09:06 bar.txt
|
206
|
+
644 tom staff 11 2014-11-04 08:29 foo.txt
|
207
|
+
```
|
208
|
+
|
209
|
+
The default format, `'l'`, is shown above. It prints `[omode, owner, group, size, date, name]`.
|
210
|
+
|
211
|
+
#### grep
|
212
|
+
|
213
|
+
Selects lines which match the given regex.
|
214
|
+
|
215
|
+
```bash
|
216
|
+
$ echo "john\npaul\ngeorge" | ru 'grep(/o[h|r]/)'
|
217
|
+
john
|
218
|
+
george
|
219
|
+
```
|
220
|
+
|
221
|
+
#### map
|
222
|
+
|
223
|
+
This is the same as `Array#map`, but it adds a new syntax that allows you to easily pass arguments to a method. For example:
|
224
|
+
|
225
|
+
```bash
|
226
|
+
$ echo "john\npaul" | ru 'map(:[], 0)'
|
227
|
+
j
|
228
|
+
p
|
229
|
+
$ echo "john\npaul" | ru 'map(:center, 8, ".")'
|
230
|
+
..john..
|
231
|
+
..paul..
|
232
|
+
```
|
233
|
+
|
234
|
+
Note that the examples above can also be performed with `each_line`:
|
235
|
+
|
236
|
+
```bash
|
237
|
+
$ echo "john\npaul" | ru 'each_line[0]'
|
238
|
+
$ echo "john\npaul" | ru 'each_line.center(8, ".")'
|
239
|
+
```
|
240
|
+
|
241
|
+
Testing
|
242
|
+
-------
|
243
|
+
|
244
|
+
Nested Hstore is tested against ActiveRecord 3 and 4. If you'd like to submit a PR, please be sure to use [Appraisal](https://github.com/thoughtbot/appraisal) to test your changes in both contexts:
|
245
|
+
|
246
|
+
```bash
|
247
|
+
appraisal rspec
|
248
|
+
```
|
249
|
+
|
250
|
+
License
|
251
|
+
-------
|
252
|
+
|
253
|
+
Rushed is released under the MIT License. Please see the MIT-LICENSE file for details.
|
data/Rakefile
ADDED
data/bin/ru
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/rushed'
|
4
|
+
|
5
|
+
begin
|
6
|
+
args = ARGV
|
7
|
+
command = args.shift
|
8
|
+
stdin = nil
|
9
|
+
# If the command starts with a '!', run it without stdin
|
10
|
+
if command.present? && command.start_with?('! ')
|
11
|
+
command = command[2..-1]
|
12
|
+
# If args is empty, read from stdin
|
13
|
+
elsif args.empty?
|
14
|
+
stdin = STDIN.read
|
15
|
+
end
|
16
|
+
process = Rushed::Process.new({
|
17
|
+
command: command,
|
18
|
+
args: args,
|
19
|
+
stdin: stdin
|
20
|
+
})
|
21
|
+
puts process.run
|
22
|
+
rescue => e
|
23
|
+
STDERR.puts e.message
|
24
|
+
STDERR.puts e.backtrace.join("\n")
|
25
|
+
exit 1
|
26
|
+
end
|
data/doc/logo.png
ADDED
Binary file
|
@@ -0,0 +1,42 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../
|
3
|
+
specs:
|
4
|
+
rushed (0.0.1)
|
5
|
+
activesupport
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activesupport (3.2.20)
|
11
|
+
i18n (~> 0.6, >= 0.6.4)
|
12
|
+
multi_json (~> 1.0)
|
13
|
+
appraisal (1.0.2)
|
14
|
+
bundler
|
15
|
+
rake
|
16
|
+
thor (>= 0.14.0)
|
17
|
+
diff-lcs (1.2.5)
|
18
|
+
i18n (0.6.11)
|
19
|
+
multi_json (1.10.1)
|
20
|
+
rake (10.3.2)
|
21
|
+
rspec (3.1.0)
|
22
|
+
rspec-core (~> 3.1.0)
|
23
|
+
rspec-expectations (~> 3.1.0)
|
24
|
+
rspec-mocks (~> 3.1.0)
|
25
|
+
rspec-core (3.1.7)
|
26
|
+
rspec-support (~> 3.1.0)
|
27
|
+
rspec-expectations (3.1.2)
|
28
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
29
|
+
rspec-support (~> 3.1.0)
|
30
|
+
rspec-mocks (3.1.3)
|
31
|
+
rspec-support (~> 3.1.0)
|
32
|
+
rspec-support (3.1.2)
|
33
|
+
thor (0.19.1)
|
34
|
+
|
35
|
+
PLATFORMS
|
36
|
+
ruby
|
37
|
+
|
38
|
+
DEPENDENCIES
|
39
|
+
activesupport (= 3.2.20)
|
40
|
+
appraisal
|
41
|
+
rspec
|
42
|
+
rushed!
|
@@ -0,0 +1,49 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../
|
3
|
+
specs:
|
4
|
+
rushed (0.0.1)
|
5
|
+
activesupport
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activesupport (4.1.7)
|
11
|
+
i18n (~> 0.6, >= 0.6.9)
|
12
|
+
json (~> 1.7, >= 1.7.7)
|
13
|
+
minitest (~> 5.1)
|
14
|
+
thread_safe (~> 0.1)
|
15
|
+
tzinfo (~> 1.1)
|
16
|
+
appraisal (1.0.2)
|
17
|
+
bundler
|
18
|
+
rake
|
19
|
+
thor (>= 0.14.0)
|
20
|
+
diff-lcs (1.2.5)
|
21
|
+
i18n (0.6.11)
|
22
|
+
json (1.8.1)
|
23
|
+
minitest (5.4.2)
|
24
|
+
rake (10.3.2)
|
25
|
+
rspec (3.1.0)
|
26
|
+
rspec-core (~> 3.1.0)
|
27
|
+
rspec-expectations (~> 3.1.0)
|
28
|
+
rspec-mocks (~> 3.1.0)
|
29
|
+
rspec-core (3.1.7)
|
30
|
+
rspec-support (~> 3.1.0)
|
31
|
+
rspec-expectations (3.1.2)
|
32
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
33
|
+
rspec-support (~> 3.1.0)
|
34
|
+
rspec-mocks (3.1.3)
|
35
|
+
rspec-support (~> 3.1.0)
|
36
|
+
rspec-support (3.1.2)
|
37
|
+
thor (0.19.1)
|
38
|
+
thread_safe (0.3.4)
|
39
|
+
tzinfo (1.2.2)
|
40
|
+
thread_safe (~> 0.1)
|
41
|
+
|
42
|
+
PLATFORMS
|
43
|
+
ruby
|
44
|
+
|
45
|
+
DEPENDENCIES
|
46
|
+
activesupport (= 4.1.7)
|
47
|
+
appraisal
|
48
|
+
rspec
|
49
|
+
rushed!
|
data/lib/rushed.rb
ADDED
data/lib/rushed/array.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
module Rushed
|
2
|
+
class Array
|
3
|
+
def initialize(array)
|
4
|
+
@data = array.to_a
|
5
|
+
end
|
6
|
+
|
7
|
+
def each_line
|
8
|
+
Rushed::Iterator.new(self)
|
9
|
+
end
|
10
|
+
|
11
|
+
def files
|
12
|
+
@data.map! do |line|
|
13
|
+
Rushed::File.new(line)
|
14
|
+
end
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def format(format='l')
|
19
|
+
@data.map! do |item|
|
20
|
+
item.format(format)
|
21
|
+
end
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def grep(pattern)
|
26
|
+
if pattern.kind_of?(String)
|
27
|
+
pattern = Regexp.new(pattern)
|
28
|
+
end
|
29
|
+
select! do |item|
|
30
|
+
item.to_s =~ pattern
|
31
|
+
end
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
def map(method=nil, *args, &block)
|
36
|
+
if method.nil? && !block_given?
|
37
|
+
to_a.map
|
38
|
+
elsif method.nil?
|
39
|
+
array = to_a.map(&block)
|
40
|
+
self.class.new(array)
|
41
|
+
else
|
42
|
+
array = to_a.map { |item| item.send(method, *args) }
|
43
|
+
self.class.new(array)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def select(*args, &block)
|
48
|
+
delegate_to_array(:select, *args, &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_stdout
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_a
|
56
|
+
@data
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_ary
|
60
|
+
to_a
|
61
|
+
end
|
62
|
+
|
63
|
+
def to_s
|
64
|
+
self.to_a.join("\n")
|
65
|
+
end
|
66
|
+
|
67
|
+
def ==(other)
|
68
|
+
self.to_a == other.to_a
|
69
|
+
end
|
70
|
+
|
71
|
+
def method_missing(method, *args, &block)
|
72
|
+
delegate_to_array(method, *args, &block)
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def delegate_to_array(method, *args, &block)
|
78
|
+
result = to_a.send(method, *args, &block)
|
79
|
+
if result.kind_of?(Enumerable)
|
80
|
+
self.class.new(result)
|
81
|
+
else
|
82
|
+
result
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/rushed/file.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'etc'
|
2
|
+
|
3
|
+
module Rushed
|
4
|
+
class File
|
5
|
+
def initialize(path)
|
6
|
+
@path = path
|
7
|
+
end
|
8
|
+
|
9
|
+
def basename
|
10
|
+
delegate_to_file(:basename)
|
11
|
+
end
|
12
|
+
|
13
|
+
def ctime
|
14
|
+
delegate_to_file(:ctime)
|
15
|
+
end
|
16
|
+
|
17
|
+
def extname
|
18
|
+
delegate_to_file(:extname)
|
19
|
+
end
|
20
|
+
|
21
|
+
def format(format='l')
|
22
|
+
separator = "\t"
|
23
|
+
case format
|
24
|
+
when 'l'
|
25
|
+
datetime = ctime.strftime(%w{%Y-%m-%d %H:%M}.join(separator))
|
26
|
+
return [omode, owner, group, size, datetime, name].join(separator)
|
27
|
+
else
|
28
|
+
raise 'format not supported'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def ftype
|
33
|
+
delegate_to_file(:ftype)
|
34
|
+
end
|
35
|
+
|
36
|
+
def gid
|
37
|
+
delegate_to_stat(:gid)
|
38
|
+
end
|
39
|
+
|
40
|
+
def group
|
41
|
+
Etc.getgrgid(gid).name
|
42
|
+
end
|
43
|
+
|
44
|
+
def mode
|
45
|
+
delegate_to_stat(:mode)
|
46
|
+
end
|
47
|
+
|
48
|
+
def mtime
|
49
|
+
delegate_to_file(:mtime)
|
50
|
+
end
|
51
|
+
|
52
|
+
def omode
|
53
|
+
'%o' % world_readable?
|
54
|
+
end
|
55
|
+
|
56
|
+
def owner
|
57
|
+
Etc.getpwuid(uid).name
|
58
|
+
end
|
59
|
+
|
60
|
+
def size
|
61
|
+
delegate_to_file(:size)
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_s
|
65
|
+
name
|
66
|
+
end
|
67
|
+
|
68
|
+
def uid
|
69
|
+
delegate_to_stat(:uid)
|
70
|
+
end
|
71
|
+
|
72
|
+
def world_readable?
|
73
|
+
delegate_to_stat(:world_readable?)
|
74
|
+
end
|
75
|
+
|
76
|
+
def <=>(other)
|
77
|
+
name <=> other.name
|
78
|
+
end
|
79
|
+
|
80
|
+
alias_method :name, :basename
|
81
|
+
alias_method :created_at, :ctime
|
82
|
+
alias_method :updated_at, :mtime
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def delegate_to_file(method)
|
87
|
+
::File.send(method, @path)
|
88
|
+
end
|
89
|
+
|
90
|
+
def delegate_to_stat(method)
|
91
|
+
::File.stat(@path).send(method)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Rushed
|
2
|
+
class Iterator
|
3
|
+
class << self
|
4
|
+
def redefined_methods
|
5
|
+
@redefined_methods ||= begin
|
6
|
+
preserved_methods = %{initialize method_missing respond_to? to_a}
|
7
|
+
[].public_methods.select do |method|
|
8
|
+
method = method.to_s
|
9
|
+
method =~ /^[a-z]/ && !preserved_methods.include?(method)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(array)
|
16
|
+
@array = array
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_a
|
20
|
+
Rushed::Array.new(@array)
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_dotsch_output
|
24
|
+
to_a.join("\n")
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def method_missing(method, *args, &block)
|
30
|
+
map_method(method, *args, &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def map_method(method, *args, &block)
|
34
|
+
@array.map! { |item| item.send(method, *args, &block) }
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
redefined_methods.each do |method|
|
39
|
+
define_method(method) do |*args|
|
40
|
+
map_method(method, *args)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Rushed
|
2
|
+
class Process
|
3
|
+
def initialize(options={})
|
4
|
+
@command = options[:command]
|
5
|
+
@args = options[:args]
|
6
|
+
@stdin = options[:stdin]
|
7
|
+
if @command.kind_of?(String) && @command.start_with?('[')
|
8
|
+
@command = 'to_stdout' + @command
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
paths = @args
|
14
|
+
if @stdin.blank? && paths.present?
|
15
|
+
@stdin = paths.map { |path| ::File.open(path).read }.join("\n")
|
16
|
+
end
|
17
|
+
lines = @stdin.present? ? @stdin.split("\n") : []
|
18
|
+
array = Rushed::Array.new(lines)
|
19
|
+
output = array.instance_eval(@command) || @stdin
|
20
|
+
if output.respond_to?(:to_dotsch_output)
|
21
|
+
output = output.to_dotsch_output
|
22
|
+
end
|
23
|
+
if output.kind_of?(::Array)
|
24
|
+
output = output.join("\n")
|
25
|
+
end
|
26
|
+
output.to_s
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/rushed.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path('../lib/rushed/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.authors = ['Tom Benner']
|
5
|
+
s.email = ['tombenner@gmail.com']
|
6
|
+
s.description = s.summary = %q{Ruby in your shell!}
|
7
|
+
s.homepage = 'https://github.com/tombenner/rushed'
|
8
|
+
|
9
|
+
s.files = `git ls-files`.split($\)
|
10
|
+
s.name = 'rushed'
|
11
|
+
s.executables = ['ru']
|
12
|
+
s.require_paths = ['lib']
|
13
|
+
s.version = Rushed::VERSION
|
14
|
+
s.license = 'MIT'
|
15
|
+
|
16
|
+
s.add_dependency 'activesupport'
|
17
|
+
|
18
|
+
s.add_development_dependency 'appraisal'
|
19
|
+
s.add_development_dependency 'rspec'
|
20
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'misc examples' do
|
4
|
+
include FixturesHelper
|
5
|
+
include ProcessHelper
|
6
|
+
|
7
|
+
# http://stackoverflow.com/questions/450799/shell-command-to-sum-integers-one-per-line
|
8
|
+
context "summing integers" do
|
9
|
+
it "sums" do
|
10
|
+
lines = (1..10).to_a.map(&:to_s)
|
11
|
+
out = run(lines, 'map(:to_i).sum')
|
12
|
+
out.should == '55'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# http://stackoverflow.com/questions/6022384/bash-tool-to-get-nth-line-from-a-file
|
17
|
+
context "printing the nth line" do
|
18
|
+
it "prints" do
|
19
|
+
lines = (1..10).to_a.map(&:to_s)
|
20
|
+
out = run(lines, '[4]')
|
21
|
+
out.should == '5'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# https://coderwall.com/p/ueazhw
|
26
|
+
context "sorting an Apache access log by response time" do
|
27
|
+
it "sorts" do
|
28
|
+
file = fixture_path('files', 'access.log')
|
29
|
+
out = run('', 'map { |line| [line[/(\d+)( ".+"){2}$/, 1].to_i, line] }.sort.reverse.map(:join, " ")', file)
|
30
|
+
out.should == <<-EOF.strip
|
31
|
+
584912 66.249.64.14 - - [18/Sep/2004:11:07:48 +1000] "GET /file.txt HTTP/1.0" 200 584912 "-" "Googlebot/2.1"
|
32
|
+
6433 66.249.64.14 - - [18/Sep/2004:11:07:48 +1000] "GET / HTTP/1.0" 200 6433 "-" "Googlebot/2.1"
|
33
|
+
6433 66.249.64.13 - - [18/Sep/2004:11:07:48 +1000] "GET / HTTP/1.0" 200 6433 "-" "Googlebot/2.1"
|
34
|
+
468 66.249.64.14 - - [18/Sep/2004:11:07:48 +1000] "GET /robots.txt HTTP/1.0" 200 468 "-" "Googlebot/2.1"
|
35
|
+
468 66.249.64.13 - - [18/Sep/2004:11:07:48 +1000] "GET /robots.txt HTTP/1.0" 200 468 "-" "Googlebot/2.1"
|
36
|
+
EOF
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# https://www.gnu.org/software/sed/manual/sed.html#Examples
|
4
|
+
describe 'sed examples' do
|
5
|
+
include FixturesHelper
|
6
|
+
include ProcessHelper
|
7
|
+
|
8
|
+
context "centering lines" do
|
9
|
+
it "centers" do
|
10
|
+
lines = %w{john paul george} + [' ringo ']
|
11
|
+
out = run(lines, 'each_line.strip.center(10)')
|
12
|
+
out.should == " john \n paul \n george \n ringo "
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "increment a number" do
|
17
|
+
it "increments" do
|
18
|
+
lines = ('5'..'10').to_a
|
19
|
+
out = run(lines, '(each_line.to_i+1)')
|
20
|
+
out.should == ('6'..'11').to_a.join("\n")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "reverse characters of lines" do
|
25
|
+
it "reverses" do
|
26
|
+
lines = %w{john paul george ringo}
|
27
|
+
out = run(lines, 'each_line.reverse')
|
28
|
+
out.should == "nhoj\nluap\negroeg\nognir"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "numbering lines" do
|
33
|
+
it "numbers" do
|
34
|
+
lines = %w{john paul george ringo}
|
35
|
+
out = run(lines, 'map.with_index { |line, index| "#{(index+1).to_s.rjust(6)} #{line}" }')
|
36
|
+
out.should == " 1 john\n 2 paul\n 3 george\n 4 ringo"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "counting lines" do
|
41
|
+
it "counts" do
|
42
|
+
lines = %w{john paul george ringo}
|
43
|
+
out = run(lines, 'length')
|
44
|
+
out.should == "4"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "printing the first lines" do
|
49
|
+
it "prints" do
|
50
|
+
lines = %w{john paul george ringo}
|
51
|
+
out = run(lines, '[0,2]')
|
52
|
+
out.should == "john\npaul"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "printing the last lines" do
|
57
|
+
it "prints" do
|
58
|
+
lines = %w{john paul george ringo}
|
59
|
+
out = run(lines, '[2..-1]')
|
60
|
+
out.should == "george\nringo"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "make duplicate lines unique" do
|
65
|
+
it "dedupes" do
|
66
|
+
lines = %w{john john paul george george george ringo}
|
67
|
+
out = run(lines, 'uniq')
|
68
|
+
out.should == "john\npaul\ngeorge\nringo"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "print duplicated lines of input" do
|
73
|
+
it "prints" do
|
74
|
+
lines = %w{john john paul george george george ringo}
|
75
|
+
out = run(lines, 'select { |line| self.count(line) > 1 }')
|
76
|
+
out.should == "john\njohn\ngeorge\ngeorge\ngeorge"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "remove all duplicated lines" do
|
81
|
+
it "removes" do
|
82
|
+
lines = %w{john john paul george george george ringo}
|
83
|
+
out = run(lines, 'select { |line| self.count(line) == 1 }')
|
84
|
+
out.should == "paul\nringo"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "squeezing blank lines" do
|
89
|
+
it "squeezes" do
|
90
|
+
lines = "john\n\npaul\ngeorge\n\n\nringo"
|
91
|
+
out = run(lines, 'to_s.squeeze("\n")')
|
92
|
+
out.should == "john\npaul\ngeorge\nringo"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
66.249.64.13 - - [18/Sep/2004:11:07:48 +1000] "GET /robots.txt HTTP/1.0" 200 468 "-" "Googlebot/2.1"
|
2
|
+
66.249.64.13 - - [18/Sep/2004:11:07:48 +1000] "GET / HTTP/1.0" 200 6433 "-" "Googlebot/2.1"
|
3
|
+
66.249.64.14 - - [18/Sep/2004:11:07:48 +1000] "GET /robots.txt HTTP/1.0" 200 468 "-" "Googlebot/2.1"
|
4
|
+
66.249.64.14 - - [18/Sep/2004:11:07:48 +1000] "GET / HTTP/1.0" 200 6433 "-" "Googlebot/2.1"
|
5
|
+
66.249.64.14 - - [18/Sep/2004:11:07:48 +1000] "GET /file.txt HTTP/1.0" 200 584912 "-" "Googlebot/2.1"
|
@@ -0,0 +1 @@
|
|
1
|
+
bar
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rushed::Array do
|
4
|
+
describe "Array method" do
|
5
|
+
it "returns a Rushed::Array" do
|
6
|
+
array = described_class.new(%w{john paul george ringo})
|
7
|
+
array.sort.should be_a(Rushed::Array)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#each_line" do
|
12
|
+
it "calls to_s" do
|
13
|
+
array = described_class.new((1..3).to_a)
|
14
|
+
array.each_line.to_s.to_a.should == described_class.new(('1'..'3'))
|
15
|
+
end
|
16
|
+
|
17
|
+
it "calls methods with arguments" do
|
18
|
+
array = described_class.new((1..3).to_a)
|
19
|
+
array.each_line.modulo(2).to_a.should == [1, 0, 1]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#map" do
|
24
|
+
it "takes one argument" do
|
25
|
+
array = described_class.new(%w{john paul george ringo})
|
26
|
+
array.map(:reverse).should == %w{nhoj luap egroeg ognir}
|
27
|
+
end
|
28
|
+
it "takes two arguments" do
|
29
|
+
array = described_class.new(%w{john paul george ringo})
|
30
|
+
array.map(:[], 0).should == %w{j p g r}
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns a Rushed::Array" do
|
34
|
+
array = described_class.new(%w{john paul george ringo})
|
35
|
+
array.map(:[], 0).should be_a(Rushed::Array)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rushed::Iterator do
|
4
|
+
describe "#to_a" do
|
5
|
+
it "returns the array" do
|
6
|
+
iterator = described_class.new(%w{john paul george ringo})
|
7
|
+
iterator.to_a.should == %w{john paul george ringo}
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#to_dotsch_output" do
|
12
|
+
it "returns the string" do
|
13
|
+
iterator = described_class.new(%w{john paul george ringo})
|
14
|
+
iterator.to_dotsch_output.should == "john\npaul\ngeorge\nringo"
|
15
|
+
end
|
16
|
+
|
17
|
+
context "with a method called on it" do
|
18
|
+
it "returns the string" do
|
19
|
+
iterator = described_class.new(%w{john paul george ringo})
|
20
|
+
iterator.to_s.to_dotsch_output.should == "john\npaul\ngeorge\nringo"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rushed::Process do
|
4
|
+
include FixturesHelper
|
5
|
+
include ProcessHelper
|
6
|
+
|
7
|
+
describe "#run" do
|
8
|
+
it "runs []" do
|
9
|
+
lines = %w{john paul george ringo}
|
10
|
+
out = run(lines, '[1,2]')
|
11
|
+
out.should == "paul\ngeorge"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "runs files" do
|
15
|
+
paths = [
|
16
|
+
fixture_path('files', 'bar.txt'),
|
17
|
+
fixture_path('files', 'foo.txt')
|
18
|
+
]
|
19
|
+
out = run(paths, 'files')
|
20
|
+
out.should == "bar.txt\nfoo.txt"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "runs format" do
|
24
|
+
paths = [
|
25
|
+
fixture_path('files', 'bar.txt'),
|
26
|
+
fixture_path('files', 'foo.txt')
|
27
|
+
]
|
28
|
+
out = run(paths, "files.format('l')")
|
29
|
+
lines = out.split("\n")
|
30
|
+
lines.length.should == 2
|
31
|
+
lines.each do |line|
|
32
|
+
# 644 tom staff 11 2014-11-04 08:29 foo.txt
|
33
|
+
line.should =~ /^\d{3}\t\w+\t\w+\t\d+\t\d{4}\-\d{2}-\d{2}\t\d{2}:\d{2}\t[\w\.]+$/
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it "runs grep" do
|
38
|
+
lines = %w{john paul george ringo}
|
39
|
+
out = run(lines, "grep(/o[h|r]/)")
|
40
|
+
out.should == "john\ngeorge"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "runs map with two arguments" do
|
44
|
+
lines = %w{john paul george ringo}
|
45
|
+
out = run(lines, 'map(:[], 0)')
|
46
|
+
out.should == %w{j p g r}.join("\n")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "runs sort" do
|
50
|
+
lines = %w{john paul george ringo}
|
51
|
+
out = run(lines, 'sort')
|
52
|
+
out.should == lines.sort.join("\n")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "takes files as arguments" do
|
56
|
+
out = run('', 'to_s', fixture_path('files', 'foo.txt'))
|
57
|
+
out.should == "foo\nfoo\nfoo"
|
58
|
+
end
|
59
|
+
|
60
|
+
context "an undefined method" do
|
61
|
+
it "raises a NoMethodError" do
|
62
|
+
lines = %w{john paul george ringo}
|
63
|
+
expect { out = run(lines, 'foo') }.to raise_error(NoMethodError)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rushed'
|
2
|
+
|
3
|
+
require 'support/fixtures_helper'
|
4
|
+
require 'support/process_helper'
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
# ## Mock Framework
|
8
|
+
#
|
9
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
10
|
+
#
|
11
|
+
# config.mock_with :mocha
|
12
|
+
# config.mock_with :flexmock
|
13
|
+
# config.mock_with :rr
|
14
|
+
|
15
|
+
# Run specs in random order to surface order dependencies. If you find an
|
16
|
+
# order dependency and want to debug it, you can fix the order by providing
|
17
|
+
# the seed, which is printed after each run.
|
18
|
+
# --seed 1234
|
19
|
+
config.order = "random"
|
20
|
+
end
|
metadata
CHANGED
@@ -1,52 +1,96 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rushed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Benner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: appraisal
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
|
-
- -
|
31
|
+
- - ">="
|
18
32
|
- !ruby/object:Gem::Version
|
19
33
|
version: '0'
|
20
34
|
type: :development
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
|
-
- -
|
38
|
+
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rspec
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- -
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: '0'
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- -
|
52
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
|
-
description:
|
55
|
+
description: Ruby in your shell!
|
42
56
|
email:
|
43
57
|
- tombenner@gmail.com
|
44
|
-
executables:
|
58
|
+
executables:
|
59
|
+
- ru
|
45
60
|
extensions: []
|
46
61
|
extra_rdoc_files: []
|
47
62
|
files:
|
48
|
-
-
|
49
|
-
-
|
63
|
+
- ".gitignore"
|
64
|
+
- ".travis.yml"
|
65
|
+
- Appraisals
|
66
|
+
- Gemfile
|
67
|
+
- MIT-LICENSE
|
68
|
+
- README.md
|
69
|
+
- Rakefile
|
70
|
+
- bin/ru
|
71
|
+
- doc/logo.png
|
72
|
+
- gemfiles/activesupport_3.gemfile
|
73
|
+
- gemfiles/activesupport_3.gemfile.lock
|
74
|
+
- gemfiles/activesupport_4.gemfile
|
75
|
+
- gemfiles/activesupport_4.gemfile.lock
|
76
|
+
- lib/rushed.rb
|
77
|
+
- lib/rushed/array.rb
|
78
|
+
- lib/rushed/file.rb
|
79
|
+
- lib/rushed/iterator.rb
|
80
|
+
- lib/rushed/process.rb
|
81
|
+
- lib/rushed/version.rb
|
82
|
+
- rushed.gemspec
|
83
|
+
- spec/examples/misc_examples_spec.rb
|
84
|
+
- spec/examples/sed_examples_spec.rb
|
85
|
+
- spec/fixtures/files/access.log
|
86
|
+
- spec/fixtures/files/bar.txt
|
87
|
+
- spec/fixtures/files/foo.txt
|
88
|
+
- spec/lib/array_spec.rb
|
89
|
+
- spec/lib/iterator_spec.rb
|
90
|
+
- spec/lib/process_spec.rb
|
91
|
+
- spec/spec_helper.rb
|
92
|
+
- spec/support/fixtures_helper.rb
|
93
|
+
- spec/support/process_helper.rb
|
50
94
|
homepage: https://github.com/tombenner/rushed
|
51
95
|
licenses:
|
52
96
|
- MIT
|
@@ -57,12 +101,12 @@ require_paths:
|
|
57
101
|
- lib
|
58
102
|
required_ruby_version: !ruby/object:Gem::Requirement
|
59
103
|
requirements:
|
60
|
-
- -
|
104
|
+
- - ">="
|
61
105
|
- !ruby/object:Gem::Version
|
62
106
|
version: '0'
|
63
107
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
108
|
requirements:
|
65
|
-
- -
|
109
|
+
- - ">="
|
66
110
|
- !ruby/object:Gem::Version
|
67
111
|
version: '0'
|
68
112
|
requirements: []
|
@@ -70,6 +114,5 @@ rubyforge_project:
|
|
70
114
|
rubygems_version: 2.2.2
|
71
115
|
signing_key:
|
72
116
|
specification_version: 4
|
73
|
-
summary:
|
117
|
+
summary: Ruby in your shell!
|
74
118
|
test_files: []
|
75
|
-
has_rdoc:
|
data/lib/dotsh.rb
DELETED
data/lib/dotsh/version.rb
DELETED