acts_as_shellscript_executable 0.0.3 → 0.0.4
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/.ruby-version +1 -1
- data/.travis.yml +0 -1
- data/Gemfile +1 -0
- data/README.md +15 -1
- data/acts_as_shellscript_executable.gemspec +1 -2
- data/lib/acts_as_shellscript_executable/active_record/acts/shellscript_executable.rb +39 -16
- data/lib/acts_as_shellscript_executable/version.rb +1 -1
- data/spec/features/acts_as_shellscript_executable_spec.rb +146 -19
- metadata +3 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b465054cb5119511d8b8738e3d78b542f07da1e
|
4
|
+
data.tar.gz: 77f65e6a73801397000f4dd4521780ffeb2fa4f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61f07132577ee040f24022ba2f5265fda7b6bb2fe6b80d1738d203fc5c2e6ff4896ed35c4932797e86349805b1ed4d905acc712ee8ef4f315012c062135d55ee
|
7
|
+
data.tar.gz: d8f373854a11636078f781304aac40f7d5beb1ae5ed5c18ce3fc9de79ef892d8f55e56425f1fc0acfb21f39d5c3e8e331029298a80c64f2dea4e7760ba1fd463
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1
|
1
|
+
2.1.3
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -34,7 +34,7 @@ script.save!
|
|
34
34
|
## #execute!
|
35
35
|
|
36
36
|
* `#execute!(no args)`
|
37
|
-
* returns
|
37
|
+
* returns the shellscript's stdout of whole of the shellscript
|
38
38
|
|
39
39
|
* `#execute!(block)`
|
40
40
|
* returns `nil`, yields the shellscript's stdout st each line(splited by `\n`)
|
@@ -48,6 +48,20 @@ script.save!
|
|
48
48
|
* `method:` (default: `execute!`)
|
49
49
|
* the execute method's name
|
50
50
|
|
51
|
+
* `command:` (default: `'/bin/sh'`)
|
52
|
+
|
53
|
+
## Options of `.acts_as_rubyscript_executable`
|
54
|
+
|
55
|
+
* `script:` (default: `:script`)
|
56
|
+
* if `Symbol`, the same name column's value will be evaluated as shellscript
|
57
|
+
* if `String`, the string will be evaluated as shellscript
|
58
|
+
|
59
|
+
* `method:` (default: `ruby_execute!`)
|
60
|
+
* the execute method's name
|
61
|
+
|
62
|
+
* `command:` (default: `'ruby'`)
|
63
|
+
* Set path like `'/usr/bin/ruby'`, or array to set option like `['ruby', '-c']`, `['bundle exec rails', 'r']`
|
64
|
+
|
51
65
|
## Installation
|
52
66
|
|
53
67
|
Add this line to your application's Gemfile:
|
@@ -21,10 +21,9 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.5"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "rspec"
|
24
|
-
spec.add_development_dependency "pry"
|
25
24
|
spec.add_development_dependency "sqlite3"
|
26
25
|
|
27
|
-
spec.required_ruby_version = '>=
|
26
|
+
spec.required_ruby_version = '>= 2.0.0'
|
28
27
|
|
29
28
|
spec.add_dependency("activerecord", [">= 4.1.6"])
|
30
29
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Acts
|
3
5
|
module ShellscriptExecutable
|
@@ -6,26 +8,41 @@ module ActiveRecord
|
|
6
8
|
end
|
7
9
|
|
8
10
|
module ClassMethods
|
9
|
-
def
|
10
|
-
configuration = { method: :execute!, script: :script }
|
11
|
-
configuration.update(options) if options.is_a?(Hash)
|
12
|
-
method = configuration[:method]
|
11
|
+
def __define_execute_method(method, type)
|
13
12
|
class_eval <<-EOV
|
14
13
|
def #{method}(&block)
|
15
|
-
script = @@
|
14
|
+
script = @@__executable_methods__[:#{method}][:script]
|
15
|
+
command = @@__executable_methods__[:#{method}][:command]
|
16
16
|
answer = ''
|
17
|
-
__execute__(script, answer, block)
|
17
|
+
__execute__(script, :#{type}, answer, command, block)
|
18
18
|
block_given? ? nil : answer
|
19
19
|
end
|
20
20
|
EOV
|
21
|
+
end
|
21
22
|
|
23
|
+
def __configs_set(command, script, method)
|
22
24
|
configurations = begin
|
23
|
-
class_variable_get(:@@
|
25
|
+
class_variable_get(:@@__executable_methods__)
|
24
26
|
rescue NameError
|
25
27
|
{}
|
26
28
|
end
|
27
|
-
configurations[method] =
|
28
|
-
class_variable_set(:@@
|
29
|
+
configurations[method] = { command: command, script: script }
|
30
|
+
class_variable_set(:@@__executable_methods__, configurations)
|
31
|
+
end
|
32
|
+
|
33
|
+
def acts_as_shellscript_executable(opt)
|
34
|
+
__add_method(:shell, opt)
|
35
|
+
end
|
36
|
+
|
37
|
+
def acts_as_rubyscript_executable(opt)
|
38
|
+
__add_method(:ruby, opt)
|
39
|
+
end
|
40
|
+
|
41
|
+
def __add_method(type, method: nil, script: :script, command: nil)
|
42
|
+
method ||= (type == :ruby ? :ruby_execute! : :execute!)
|
43
|
+
command ||= (type == :ruby ? 'ruby' : '/bin/sh')
|
44
|
+
__define_execute_method method, type
|
45
|
+
__configs_set command, script, method
|
29
46
|
include ::ActiveRecord::Acts::ShellscriptExecutable::InstanceMethods
|
30
47
|
end
|
31
48
|
end
|
@@ -33,18 +50,24 @@ module ActiveRecord
|
|
33
50
|
module InstanceMethods
|
34
51
|
private
|
35
52
|
|
36
|
-
def __execute__(script, answer, block = nil)
|
53
|
+
def __execute__(script, type, answer, command, block = nil)
|
37
54
|
script = send script if script.is_a? Symbol
|
55
|
+
path = __temp_script_path(script, type)
|
56
|
+
|
38
57
|
retval = []
|
39
|
-
|
40
|
-
|
41
|
-
block.call `#{line}`
|
42
|
-
else
|
43
|
-
retval << `#{line}`
|
44
|
-
end
|
58
|
+
IO.popen([*command, path], err: [:child, :out]).each do |io|
|
59
|
+
block ? block.call(io) : retval << io
|
45
60
|
end
|
46
61
|
answer.replace retval.join
|
47
62
|
end
|
63
|
+
|
64
|
+
def __temp_script_path(script, type)
|
65
|
+
Tempfile.open('') do |temp|
|
66
|
+
temp.puts 'STDOUT.sync = true' if type == :ruby
|
67
|
+
temp.puts script
|
68
|
+
temp.path
|
69
|
+
end
|
70
|
+
end
|
48
71
|
end
|
49
72
|
end
|
50
73
|
end
|
@@ -1,29 +1,29 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveRecord::Base do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
4
|
+
def db_setup!
|
5
|
+
ActiveRecord::Base.establish_connection \
|
6
|
+
adapter: 'sqlite3', database: ':memory:'
|
7
|
+
ActiveRecord::Schema.verbose = false
|
8
|
+
ActiveRecord::Base.connection.schema_cache.clear!
|
9
|
+
db_schema_define!
|
10
|
+
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
12
|
+
def db_schema_define!
|
13
|
+
ActiveRecord::Schema.define(version: 1) do
|
14
|
+
create_table :scripts do |t|
|
15
|
+
t.column :script, :string
|
16
|
+
t.column :script2, :string
|
17
|
+
t.column :result, :string
|
20
18
|
end
|
21
19
|
end
|
20
|
+
end
|
22
21
|
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
before do
|
23
|
+
db_setup!
|
24
|
+
end
|
26
25
|
|
26
|
+
describe '.acts_as_shellscript_executable' do
|
27
27
|
context 'given option {script: :script}' do
|
28
28
|
before do
|
29
29
|
class Script < ActiveRecord::Base
|
@@ -104,7 +104,7 @@ describe ActiveRecord::Base do
|
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
107
|
-
context 'given
|
107
|
+
context 'given 2 options' do
|
108
108
|
before do
|
109
109
|
class Script < ActiveRecord::Base
|
110
110
|
acts_as_shellscript_executable \
|
@@ -124,4 +124,131 @@ describe ActiveRecord::Base do
|
|
124
124
|
end
|
125
125
|
end
|
126
126
|
end
|
127
|
+
|
128
|
+
describe '.acts_as_rubyscript_executable' do
|
129
|
+
context 'given option {script: :script}' do
|
130
|
+
before do
|
131
|
+
class Script < ActiveRecord::Base
|
132
|
+
acts_as_rubyscript_executable script: :script
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it do
|
137
|
+
script = Script.create
|
138
|
+
script.script = 'puts "lalala"'
|
139
|
+
expect(script.ruby_execute!).to eq "lalala\n"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'given option {script: "puts 1\nputs 2"}' do
|
144
|
+
before do
|
145
|
+
class Script < ActiveRecord::Base
|
146
|
+
acts_as_rubyscript_executable script: "puts 1\nputs 2"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe 'block given' do
|
151
|
+
it do
|
152
|
+
script = Script.create
|
153
|
+
watcher = []
|
154
|
+
|
155
|
+
retval = script.ruby_execute! do |each_line_result|
|
156
|
+
watcher << each_line_result
|
157
|
+
end
|
158
|
+
|
159
|
+
expect(retval).to be_nil
|
160
|
+
expect(watcher).to eq ["1\n", "2\n"]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'given option {command: ["ruby", "-c"]}' do
|
166
|
+
before do
|
167
|
+
class Script < ActiveRecord::Base
|
168
|
+
acts_as_rubyscript_executable \
|
169
|
+
script: "puts 1\nputs 2", command: ['ruby', '-c']
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
describe 'block given' do
|
174
|
+
it do
|
175
|
+
script = Script.create
|
176
|
+
watcher = []
|
177
|
+
|
178
|
+
retval = script.ruby_execute! do |each_line_result|
|
179
|
+
watcher << each_line_result
|
180
|
+
end
|
181
|
+
|
182
|
+
expect(retval).to be_nil
|
183
|
+
expect(watcher).to eq ["Syntax OK\n"]
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
context 'given option {command: "ruby"}' do
|
189
|
+
before do
|
190
|
+
class Script < ActiveRecord::Base
|
191
|
+
acts_as_rubyscript_executable \
|
192
|
+
script: "puts 1\nputs 2", command: 'ruby'
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
describe 'block given' do
|
197
|
+
it do
|
198
|
+
script = Script.create
|
199
|
+
watcher = []
|
200
|
+
|
201
|
+
retval = script.ruby_execute! do |each_line_result|
|
202
|
+
watcher << each_line_result
|
203
|
+
end
|
204
|
+
|
205
|
+
expect(retval).to be_nil
|
206
|
+
expect(watcher).to eq ["1\n", "2\n"]
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
context 'given option {command: "ruby"}, magic comment with non-ascii' do
|
212
|
+
before do
|
213
|
+
class Script < ActiveRecord::Base
|
214
|
+
acts_as_rubyscript_executable \
|
215
|
+
script: "#! coding:utf-8\nputs 1\nputs '日本語'", command: 'ruby'
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
describe 'block given' do
|
220
|
+
it do
|
221
|
+
script = Script.create
|
222
|
+
watcher = []
|
223
|
+
|
224
|
+
retval = script.ruby_execute! do |each_line_result|
|
225
|
+
watcher << each_line_result
|
226
|
+
end
|
227
|
+
|
228
|
+
expect(retval).to be_nil
|
229
|
+
expect(watcher).to eq ["1\n", "日本語\n"]
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
context 'given 2 options' do
|
235
|
+
before do
|
236
|
+
class Script < ActiveRecord::Base
|
237
|
+
acts_as_rubyscript_executable \
|
238
|
+
script: "puts 1\nputs 2"
|
239
|
+
acts_as_rubyscript_executable \
|
240
|
+
script: "puts 3\nputs 4", method: :awesome!
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
it do
|
245
|
+
script = Script.create
|
246
|
+
result = script.ruby_execute!
|
247
|
+
awesome_result = script.awesome!
|
248
|
+
|
249
|
+
expect(result).to eq "1\n2\n"
|
250
|
+
expect(awesome_result).to eq "3\n4\n"
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
127
254
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_shellscript_executable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hoshinotsuyoshi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: pry
|
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
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: sqlite3
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,7 +114,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
128
114
|
requirements:
|
129
115
|
- - ">="
|
130
116
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
117
|
+
version: 2.0.0
|
132
118
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
119
|
requirements:
|
134
120
|
- - ">="
|