coque 0.1.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 +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +45 -0
- data/LICENSE.txt +21 -0
- data/README.md +135 -0
- data/Rakefile +10 -0
- data/bin/console +11 -0
- data/bin/setup +8 -0
- data/coque.gemspec +39 -0
- data/drake.rb +113 -0
- data/io.rb +215 -0
- data/lib/coque/cmd.rb +35 -0
- data/lib/coque/context.rb +35 -0
- data/lib/coque/errors.rb +4 -0
- data/lib/coque/pipeline.rb +62 -0
- data/lib/coque/rb.rb +54 -0
- data/lib/coque/redirectable.rb +96 -0
- data/lib/coque/result.rb +24 -0
- data/lib/coque/sh.rb +45 -0
- data/lib/coque/version.rb +3 -0
- data/lib/coque.rb +27 -0
- data/script.py +129 -0
- metadata +153 -0
data/script.py
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
# 1 reverse-engineer the protocol
|
2
|
+
# SO Post: https://stackoverflow.com/questions/6954116/ruby-s-method-missing-in-python
|
3
|
+
# A missing method was called.
|
4
|
+
# The object was <__main__.ProcessLike object at 0x7f31b98a2be0>, the method was 'popen'.
|
5
|
+
# It was called with () and {'stdin': <_io.BufferedReader name=3>} as arguments
|
6
|
+
|
7
|
+
import tempfile
|
8
|
+
from tempfile import NamedTemporaryFile
|
9
|
+
from plumbum import local
|
10
|
+
from io import StringIO
|
11
|
+
import io
|
12
|
+
import os
|
13
|
+
from collections import namedtuple
|
14
|
+
|
15
|
+
# ProcessReturn = namedtuple('ProcessReturn', ['code', 'stderr', 'stdout'])
|
16
|
+
# first tried namedtuple, but the problem is plumbum
|
17
|
+
# tries to assign these values crosswise based on the pipeline, and namedtuples
|
18
|
+
# are immutable, so you run into this:
|
19
|
+
# dstproc.stderr = srcproc.stderr
|
20
|
+
# AttributeError: can't set attribute
|
21
|
+
|
22
|
+
# Went to dummy ProcessReturn class to try to patch in the gaps
|
23
|
+
# class ProcessReturn(object):
|
24
|
+
# code = 0
|
25
|
+
# retcode = 0
|
26
|
+
# returncode = 0
|
27
|
+
|
28
|
+
# def wait(self, *args, **kwargs):
|
29
|
+
# pass
|
30
|
+
|
31
|
+
# def verify(self, *args, **kwargs):
|
32
|
+
# pass
|
33
|
+
|
34
|
+
# def communicate(self, *args, **kwargs):
|
35
|
+
# return (self.stdout, self.stderr)
|
36
|
+
|
37
|
+
class ProcessLike(object):
|
38
|
+
returncode = 0
|
39
|
+
|
40
|
+
# stdin = io.BufferedReader(StringIO())
|
41
|
+
# stderr = io.BufferedWriter(StringIO())
|
42
|
+
# stdout = io.BufferedWriter(StringIO())
|
43
|
+
|
44
|
+
stdin = io.BytesIO()
|
45
|
+
stderr = io.BytesIO()
|
46
|
+
stdout = io.BytesIO()
|
47
|
+
custom_encoding = None
|
48
|
+
run = None
|
49
|
+
wait = lambda *args, **kwargs: print('*** DEFAULT WAIT ***')
|
50
|
+
srcproc = None
|
51
|
+
verify = None
|
52
|
+
|
53
|
+
def __init__(self):
|
54
|
+
self.stdin = tempfile.TemporaryFile()
|
55
|
+
print('Init stdin:' + str(self.stdin))
|
56
|
+
self.stdout = tempfile.TemporaryFile()
|
57
|
+
self.stderr = tempfile.TemporaryFile()
|
58
|
+
|
59
|
+
def __setattr__(self, name, value):
|
60
|
+
if name in ['stdin', 'stderr', 'stdout', 'custom_encoding', 'run', 'wait', 'srcproc', 'verify']:
|
61
|
+
super(ProcessLike, self).__setattr__(name, value)
|
62
|
+
else:
|
63
|
+
print('*** Attempted to set unknown attr ***')
|
64
|
+
print('Attr: ' + name + ', value: ' + str(value))
|
65
|
+
|
66
|
+
def __enter__(self, *args, **kwargs):
|
67
|
+
print('*** __enter__ ***')
|
68
|
+
print(args)
|
69
|
+
print(kwargs)
|
70
|
+
|
71
|
+
def __getattr__(self, name):
|
72
|
+
def _missing(*args, **kwargs):
|
73
|
+
print("A missing method was called.")
|
74
|
+
print("The object was %r, the method was %r. " % (self, name))
|
75
|
+
print("It was called with %r and %r as arguments" % (args, kwargs))
|
76
|
+
return _missing
|
77
|
+
|
78
|
+
def communicate(self, *args, **kwargs):
|
79
|
+
print("tried to communicate with us")
|
80
|
+
print(str(args))
|
81
|
+
print(str(kwargs))
|
82
|
+
return (self.stdout, self.stderr)
|
83
|
+
|
84
|
+
def verify(self, retcode, timeout, stdout, stderr):
|
85
|
+
return True
|
86
|
+
|
87
|
+
def __del__(self, *args, **kwargs):
|
88
|
+
pass
|
89
|
+
|
90
|
+
# def wait(self, *args, **kwargs):
|
91
|
+
# print('wait' + str(args) + str(kwargs))
|
92
|
+
# print(self.srcproc)
|
93
|
+
# print(self.wait)
|
94
|
+
# # returns returncode
|
95
|
+
# print(self.stdin)
|
96
|
+
# # for line in self.stdin:
|
97
|
+
# # print(line)
|
98
|
+
# # print(' '.join(list(line.decode())).rstrip())
|
99
|
+
# # print(self.stdout)
|
100
|
+
# # self.stdout.write(' '.join(list(line.decode())).encode())
|
101
|
+
# return 0
|
102
|
+
|
103
|
+
def popen(self, *args, **kwargs):
|
104
|
+
print('*** POPEN ProcessLike')
|
105
|
+
print(str(args))
|
106
|
+
print(str(kwargs))
|
107
|
+
return self
|
108
|
+
|
109
|
+
def __or__(self, *args, **kwargs):
|
110
|
+
print('ORed ' + str(args) + str(kwargs))
|
111
|
+
|
112
|
+
class MyTask(object):
|
113
|
+
def __enter__(self):
|
114
|
+
self.tempfile = NamedTemporaryFile()
|
115
|
+
return self
|
116
|
+
|
117
|
+
def fileno(self):
|
118
|
+
return self.tempfile.fileno
|
119
|
+
|
120
|
+
# def __or__(self, other):
|
121
|
+
|
122
|
+
# def __exit__(self, exc_type, exc_value, traceback):
|
123
|
+
# self.tempfile.close()
|
124
|
+
|
125
|
+
|
126
|
+
cmd = local['cat']['/usr/share/dict/words'] | local['head']['-n 5'] | ProcessLike() | local['cat']
|
127
|
+
code, out, err = cmd.run()
|
128
|
+
print(out)
|
129
|
+
|
metadata
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: coque
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Horace Williams
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-06-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '12.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '12.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.11'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.11'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest-reporters
|
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: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
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
|
+
description: Like plumbum...for Ruby...with native Ruby streaming interop.
|
98
|
+
email:
|
99
|
+
- horace@worace.works
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- ".travis.yml"
|
106
|
+
- CODE_OF_CONDUCT.md
|
107
|
+
- Gemfile
|
108
|
+
- Gemfile.lock
|
109
|
+
- LICENSE.txt
|
110
|
+
- README.md
|
111
|
+
- Rakefile
|
112
|
+
- bin/console
|
113
|
+
- bin/setup
|
114
|
+
- coque.gemspec
|
115
|
+
- drake.rb
|
116
|
+
- io.rb
|
117
|
+
- lib/coque.rb
|
118
|
+
- lib/coque/cmd.rb
|
119
|
+
- lib/coque/context.rb
|
120
|
+
- lib/coque/errors.rb
|
121
|
+
- lib/coque/pipeline.rb
|
122
|
+
- lib/coque/rb.rb
|
123
|
+
- lib/coque/redirectable.rb
|
124
|
+
- lib/coque/result.rb
|
125
|
+
- lib/coque/sh.rb
|
126
|
+
- lib/coque/version.rb
|
127
|
+
- script.py
|
128
|
+
homepage: http://github.com/worace/coque
|
129
|
+
licenses:
|
130
|
+
- MIT
|
131
|
+
metadata:
|
132
|
+
allowed_push_host: https://rubygems.org
|
133
|
+
post_install_message:
|
134
|
+
rdoc_options: []
|
135
|
+
require_paths:
|
136
|
+
- lib
|
137
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
requirements: []
|
148
|
+
rubyforge_project:
|
149
|
+
rubygems_version: 2.5.1
|
150
|
+
signing_key:
|
151
|
+
specification_version: 4
|
152
|
+
summary: Shell command utilities with easy integration with Ruby code.
|
153
|
+
test_files: []
|