shere 0.9.2 → 1.0.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 +2 -2
- data/CHANGES.md +5 -0
- data/Gemfile +1 -1
- data/README.md +2 -2
- data/Rakefile +10 -15
- data/lib/shere.rb +182 -158
- data/lib/shere/runner.rb +3 -2
- data/lib/shere/version.rb +1 -1
- data/shere.gemspec +29 -36
- data/task/README.md +54 -0
- data/task/gemgem.rb +240 -167
- metadata +15 -17
- data/task/.gitignore +0 -1
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9d91304e3c548a3f7cb2e1a16ca838bfd26f0c5e8646cf02aacf34e90433160c
|
4
|
+
data.tar.gz: 5a272db79714765ede6014d568b9669997006b16e955ee5bff35788a50b811da
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7da9957010d7711ab5ccd3918301322514e1d5a064c6e59e121ca6319b57eb271f1050aaf1b14fa6461d4eac77062e8dc3ce9d8d4e4291ba2b347b8c2d36f8d6
|
7
|
+
data.tar.gz: cac36be074fb73966194e862967789dd097595a3a8eaf354f6087427db7542924f0c0efe253267663e8f14f14ad06c63dc76e7b3e961e9e99bdbaae265e534a6
|
data/.gitignore
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
pkg
|
2
|
-
|
1
|
+
/pkg/
|
2
|
+
/coverage/
|
data/CHANGES.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -33,9 +33,9 @@ Nginx instance to serve the directory you specified.
|
|
33
33
|
|
34
34
|
## LICENSE:
|
35
35
|
|
36
|
-
Apache License 2.0
|
36
|
+
Apache License 2.0 (Apache-2.0)
|
37
37
|
|
38
|
-
Copyright (c) 2011, Lin Jen-Shin (godfat)
|
38
|
+
Copyright (c) 2011-2018, Lin Jen-Shin (godfat)
|
39
39
|
|
40
40
|
Licensed under the Apache License, Version 2.0 (the "License");
|
41
41
|
you may not use this file except in compliance with the License.
|
data/Rakefile
CHANGED
@@ -1,18 +1,13 @@
|
|
1
1
|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
task 'gem:spec' do
|
9
|
-
Gemgem.spec = Gemgem.create do |s|
|
10
|
-
require 'shere/version'
|
11
|
-
s.name = 'shere'
|
12
|
-
s.version = Shere::VERSION
|
13
|
-
|
14
|
-
%w[].each{ |g| s.add_runtime_dependency(g) }
|
15
|
-
end
|
2
|
+
begin
|
3
|
+
require "#{__dir__}/task/gemgem"
|
4
|
+
rescue LoadError
|
5
|
+
sh 'git submodule update --init --recursive'
|
6
|
+
exec Gem.ruby, '-S', $PROGRAM_NAME, *ARGV
|
7
|
+
end
|
16
8
|
|
17
|
-
|
9
|
+
Gemgem.init(__dir__) do |s|
|
10
|
+
require 'shere/version'
|
11
|
+
s.name = 'shere'
|
12
|
+
s.version = Shere::VERSION
|
18
13
|
end
|
data/lib/shere.rb
CHANGED
@@ -1,5 +1,30 @@
|
|
1
1
|
|
2
|
+
require 'socket'
|
3
|
+
|
2
4
|
module Shere
|
5
|
+
class ExternalAddress < Struct.new(:address)
|
6
|
+
def initialize
|
7
|
+
super(external_address)
|
8
|
+
end
|
9
|
+
|
10
|
+
def ip_address
|
11
|
+
address.ip_address
|
12
|
+
end
|
13
|
+
|
14
|
+
def reverse_lookup_host
|
15
|
+
Socket.getaddrinfo(
|
16
|
+
ip_address, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil,
|
17
|
+
Socket::AI_CANONNAME, true).dig(0, 2)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def external_address
|
22
|
+
Socket.ip_address_list.find do |addr|
|
23
|
+
addr.ipv4? && !addr.ipv4_loopback? && !addr.ipv4_private?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
3
28
|
module_function
|
4
29
|
def run opts={}
|
5
30
|
root = File.expand_path(opts[:root] || '.')
|
@@ -8,18 +33,17 @@ module Shere
|
|
8
33
|
user = opts[:user]
|
9
34
|
|
10
35
|
require 'tmpdir'
|
11
|
-
tmpdir = Dir.mktmpdir
|
36
|
+
tmpdir = Dir.mktmpdir('shere-')
|
12
37
|
File.open("#{tmpdir}/nginx.conf", 'w'){ |conf|
|
13
38
|
conf.puts(nginx_config(root, port, host, user, tmpdir))
|
14
39
|
}
|
15
40
|
sh('nginx', '-c', "#{tmpdir}/nginx.conf")
|
16
41
|
puts("PID: #{File.read("#{tmpdir}/nginx.pid")}")
|
17
|
-
puts("http://#{local_ip}:#{port}")
|
18
|
-
end
|
19
42
|
|
20
|
-
|
21
|
-
|
22
|
-
|
43
|
+
address = ExternalAddress.new
|
44
|
+
|
45
|
+
puts("http://#{address.ip_address}:#{port}" \
|
46
|
+
" or http://#{address.reverse_lookup_host}:#{port}")
|
23
47
|
end
|
24
48
|
|
25
49
|
def root_privilege?
|
@@ -43,175 +67,175 @@ module Shere
|
|
43
67
|
end
|
44
68
|
else
|
45
69
|
''
|
46
|
-
end +
|
47
|
-
|
48
|
-
worker_processes 2;
|
70
|
+
end + <<~NGINX
|
71
|
+
worker_processes 2;
|
49
72
|
|
50
|
-
error_log
|
51
|
-
pid
|
73
|
+
error_log #{tmpdir}/nginx_error.log;
|
74
|
+
pid #{tmpdir}/nginx.pid;
|
52
75
|
|
53
|
-
events {
|
54
|
-
|
55
|
-
}
|
76
|
+
events {
|
77
|
+
worker_connections 1024;
|
78
|
+
}
|
56
79
|
|
57
|
-
http {
|
58
|
-
|
59
|
-
default_type application/octet-stream;
|
80
|
+
http {
|
81
|
+
#{nginx_mime_types}
|
60
82
|
|
61
|
-
|
62
|
-
'"$status" $body_bytes_sent "$http_referer" '
|
63
|
-
'"$http_user_agent" "$http_x_forwarded_for"';
|
83
|
+
default_type application/octet-stream;
|
64
84
|
|
65
|
-
|
85
|
+
log_format main '$remote_addr - $remote_user [$time_local] $request '
|
86
|
+
'"$status" $body_bytes_sent "$http_referer" '
|
87
|
+
'"$http_user_agent" "$http_x_forwarded_for"';
|
66
88
|
|
67
|
-
|
68
|
-
client_body_temp_path #{tmpdir}/client_body 1 2;
|
69
|
-
proxy_temp_path #{tmpdir}/proxy_temp;
|
89
|
+
access_log #{tmpdir}/nginx_access.log main;
|
70
90
|
|
71
|
-
|
72
|
-
|
73
|
-
|
91
|
+
fastcgi_temp_path #{tmpdir}/fcgi_temp;
|
92
|
+
client_body_temp_path #{tmpdir}/client_body 1 2;
|
93
|
+
proxy_temp_path #{tmpdir}/proxy_temp;
|
74
94
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
request_pool_size 4k;
|
95
|
+
client_header_timeout 10m;
|
96
|
+
client_body_timeout 10m;
|
97
|
+
send_timeout 10m;
|
79
98
|
|
80
|
-
|
81
|
-
|
99
|
+
connection_pool_size 256;
|
100
|
+
client_header_buffer_size 1k;
|
101
|
+
large_client_header_buffers 4 2k;
|
102
|
+
request_pool_size 4k;
|
82
103
|
|
83
|
-
|
84
|
-
|
85
|
-
tcp_nodelay on;
|
104
|
+
output_buffers 1 32k;
|
105
|
+
postpone_output 1460;
|
86
106
|
|
87
|
-
|
88
|
-
|
107
|
+
sendfile on;
|
108
|
+
tcp_nopush on;
|
109
|
+
tcp_nodelay on;
|
89
110
|
|
90
|
-
|
91
|
-
|
92
|
-
gzip_buffers 4 8k;
|
93
|
-
gzip_types text/plain text/css application/xhtml+xml application/javascript;
|
111
|
+
keepalive_timeout 75 20;
|
112
|
+
ignore_invalid_headers on;
|
94
113
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
114
|
+
gzip on;
|
115
|
+
gzip_min_length 1100;
|
116
|
+
gzip_buffers 4 8k;
|
117
|
+
gzip_types text/plain text/css application/xhtml+xml application/javascript;
|
99
118
|
|
100
|
-
|
101
|
-
|
102
|
-
|
119
|
+
server {
|
120
|
+
listen #{port};
|
121
|
+
server_name #{host};
|
122
|
+
index index.xhtml index.html index.htm;
|
123
|
+
|
124
|
+
location / {
|
125
|
+
root "#{root}";
|
126
|
+
autoindex on;
|
127
|
+
}
|
103
128
|
}
|
104
|
-
|
105
|
-
|
106
|
-
NGINX
|
129
|
+
}
|
130
|
+
NGINX
|
107
131
|
end
|
108
132
|
|
109
133
|
def nginx_mime_types
|
110
|
-
|
111
|
-
types {
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
}
|
215
|
-
NGINX
|
134
|
+
<<~NGINX
|
135
|
+
types {
|
136
|
+
# text
|
137
|
+
text/plain txt;
|
138
|
+
text/html html htm shtml;
|
139
|
+
text/css css;
|
140
|
+
text/xml xml;
|
141
|
+
|
142
|
+
# images
|
143
|
+
image/gif gif;
|
144
|
+
image/jpeg jpeg jpg;
|
145
|
+
image/png png;
|
146
|
+
image/tiff tif tiff;
|
147
|
+
image/vnd.microsoft.icon ico;
|
148
|
+
|
149
|
+
# common application
|
150
|
+
application/atom+xml atom;
|
151
|
+
application/rss+xml rss;
|
152
|
+
application/xhtml+xml xhtml;
|
153
|
+
|
154
|
+
application/javascript js;
|
155
|
+
application/postscript ps eps ai;
|
156
|
+
application/rtf rtf;
|
157
|
+
|
158
|
+
application/x-shockwave-flash swf;
|
159
|
+
application/pdf pdf;
|
160
|
+
application/java-archive jar war ear;
|
161
|
+
|
162
|
+
application/zip zip;
|
163
|
+
application/x-gzip gz;
|
164
|
+
application/x-tar tar;
|
165
|
+
application/x-rar-compressed rar;
|
166
|
+
|
167
|
+
application/vnd.mozilla.xul+xml xul;
|
168
|
+
application/msword doc;
|
169
|
+
application/vnd.ms-excel xls;
|
170
|
+
application/vnd.ms-powerpoint ppt;
|
171
|
+
|
172
|
+
# audio
|
173
|
+
audio/midi mid midi kar;
|
174
|
+
audio/mpeg mp3;
|
175
|
+
audio/ogg ogg;
|
176
|
+
audio/aac m4a;
|
177
|
+
|
178
|
+
audio/vnd.rn-realaudio ra;
|
179
|
+
|
180
|
+
audio/x-wav wav;
|
181
|
+
audio/x-ms-wma wma;
|
182
|
+
|
183
|
+
# video
|
184
|
+
video/mpeg mpeg mpg;
|
185
|
+
video/quicktime mov;
|
186
|
+
video/mp4 mp4;
|
187
|
+
|
188
|
+
video/x-ms-wmv wmv;
|
189
|
+
video/x-ms-asf asx asf;
|
190
|
+
video/x-aif aif aiff aifc;
|
191
|
+
video/x-msvideo avi;
|
192
|
+
|
193
|
+
# others
|
194
|
+
text/mathml mml;
|
195
|
+
text/vnd.sun.j2me.app-descriptor jad;
|
196
|
+
text/vnd.wap.wml wml;
|
197
|
+
text/x-component htc;
|
198
|
+
|
199
|
+
image/x-portable-pixmap ppm;
|
200
|
+
image/x-portable-graymap pgm;
|
201
|
+
image/x-portable-bitmap pbm;
|
202
|
+
image/x-portable-anymap pnm;
|
203
|
+
image/x-xwindowdump xwd;
|
204
|
+
image/x-xpixmap xpm;
|
205
|
+
image/x-xbitmap xbm;
|
206
|
+
|
207
|
+
image/vnd.wap.wbmp wbmp;
|
208
|
+
image/x-jng jng;
|
209
|
+
image/x-ms-bmp bmp;
|
210
|
+
|
211
|
+
video/3gpp 3gpp 3gp;
|
212
|
+
video/x-flv flv;
|
213
|
+
video/x-mng mng;
|
214
|
+
|
215
|
+
application/mac-binhex40 hqx;
|
216
|
+
application/vnd.wap.wmlc wmlc;
|
217
|
+
|
218
|
+
application/x-cocoa cco;
|
219
|
+
application/x-java-archive-diff jardiff;
|
220
|
+
application/x-java-jnlp-file jnlp;
|
221
|
+
application/x-makeself run;
|
222
|
+
application/x-perl pl pm;
|
223
|
+
application/x-pilot prc pdb;
|
224
|
+
|
225
|
+
application/x-redhat-package-manager rpm;
|
226
|
+
application/x-sea sea;
|
227
|
+
application/x-stuffit sit;
|
228
|
+
application/x-tcl tcl tk;
|
229
|
+
application/x-x509-ca-cert der pem crt;
|
230
|
+
application/x-xpinstall xpi;
|
231
|
+
|
232
|
+
application/octet-stream bin exe dll;
|
233
|
+
application/octet-stream deb;
|
234
|
+
application/octet-stream dmg;
|
235
|
+
application/octet-stream eot;
|
236
|
+
application/octet-stream iso img;
|
237
|
+
application/octet-stream msi msp msm;
|
238
|
+
}
|
239
|
+
NGINX
|
216
240
|
end
|
217
241
|
end
|
data/lib/shere/runner.rb
CHANGED
@@ -48,8 +48,9 @@ module Shere::Runner
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def help
|
51
|
-
|
52
|
-
|
51
|
+
optt = options.transpose
|
52
|
+
maxn = optt.first.map(&:size).max
|
53
|
+
maxd = optt.last .map(&:size).max
|
53
54
|
"Usage: shere ROOT\n" +
|
54
55
|
options.map{ |(name, desc)|
|
55
56
|
if desc.empty?
|
data/lib/shere/version.rb
CHANGED
data/shere.gemspec
CHANGED
@@ -1,42 +1,35 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# stub: shere 1.0.0 ruby lib
|
2
3
|
|
3
4
|
Gem::Specification.new do |s|
|
4
|
-
s.name = "shere"
|
5
|
-
s.version = "0.
|
5
|
+
s.name = "shere".freeze
|
6
|
+
s.version = "1.0.0"
|
6
7
|
|
7
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.
|
9
|
-
s.
|
10
|
-
s.
|
11
|
-
s.
|
12
|
-
s.
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
|
+
s.require_paths = ["lib".freeze]
|
10
|
+
s.authors = ["Lin Jen-Shin (godfat)".freeze]
|
11
|
+
s.date = "2018-03-14"
|
12
|
+
s.description = "_Share_ the directory _here_ with [Nginx][]!\nShere would create a temporary Nginx config and run an\nNginx instance to serve the directory you specified.".freeze
|
13
|
+
s.email = ["godfat (XD) godfat.org".freeze]
|
14
|
+
s.executables = ["shere".freeze]
|
13
15
|
s.files = [
|
14
|
-
".gitignore",
|
15
|
-
".gitmodules",
|
16
|
-
"CHANGES.md",
|
17
|
-
"Gemfile",
|
18
|
-
"LICENSE",
|
19
|
-
"README.md",
|
20
|
-
"Rakefile",
|
21
|
-
"TODO.md",
|
22
|
-
"bin/shere",
|
23
|
-
"lib/shere.rb",
|
24
|
-
"lib/shere/runner.rb",
|
25
|
-
"lib/shere/version.rb",
|
26
|
-
"shere.gemspec",
|
27
|
-
"task
|
28
|
-
"task/gemgem.rb"]
|
29
|
-
s.homepage = "https://github.com/godfat/shere"
|
30
|
-
s.
|
31
|
-
s.rubygems_version = "
|
32
|
-
s.summary = "_Share_ the directory _here_ with [Nginx][]!"
|
33
|
-
|
34
|
-
if s.respond_to? :specification_version then
|
35
|
-
s.specification_version = 3
|
36
|
-
|
37
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
38
|
-
else
|
39
|
-
end
|
40
|
-
else
|
41
|
-
end
|
16
|
+
".gitignore".freeze,
|
17
|
+
".gitmodules".freeze,
|
18
|
+
"CHANGES.md".freeze,
|
19
|
+
"Gemfile".freeze,
|
20
|
+
"LICENSE".freeze,
|
21
|
+
"README.md".freeze,
|
22
|
+
"Rakefile".freeze,
|
23
|
+
"TODO.md".freeze,
|
24
|
+
"bin/shere".freeze,
|
25
|
+
"lib/shere.rb".freeze,
|
26
|
+
"lib/shere/runner.rb".freeze,
|
27
|
+
"lib/shere/version.rb".freeze,
|
28
|
+
"shere.gemspec".freeze,
|
29
|
+
"task/README.md".freeze,
|
30
|
+
"task/gemgem.rb".freeze]
|
31
|
+
s.homepage = "https://github.com/godfat/shere".freeze
|
32
|
+
s.licenses = ["Apache-2.0".freeze]
|
33
|
+
s.rubygems_version = "2.7.6".freeze
|
34
|
+
s.summary = "_Share_ the directory _here_ with [Nginx][]!".freeze
|
42
35
|
end
|
data/task/README.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# Gemgem
|
2
|
+
|
3
|
+
## DESCRIPTION:
|
4
|
+
|
5
|
+
Provided tasks:
|
6
|
+
|
7
|
+
rake clean # Trash ignored files
|
8
|
+
rake gem:build # Build gem
|
9
|
+
rake gem:install # Install gem
|
10
|
+
rake gem:release # Release gem
|
11
|
+
rake gem:spec # Generate gemspec
|
12
|
+
rake test # Run tests
|
13
|
+
|
14
|
+
## REQUIREMENTS:
|
15
|
+
|
16
|
+
* Tested with MRI (official CRuby), Rubinius and JRuby.
|
17
|
+
|
18
|
+
## INSTALLATION:
|
19
|
+
|
20
|
+
git submodule add git://github.com/godfat/gemgem.git task
|
21
|
+
|
22
|
+
And in Rakefile:
|
23
|
+
|
24
|
+
``` ruby
|
25
|
+
begin
|
26
|
+
require "#{__dir__}/task/gemgem"
|
27
|
+
rescue LoadError
|
28
|
+
sh 'git submodule update --init --recursive'
|
29
|
+
exec Gem.ruby, '-S', $PROGRAM_NAME, *ARGV
|
30
|
+
end
|
31
|
+
|
32
|
+
Gemgem.init(__dir__, :submodules => %w[your-dep]) do |s|
|
33
|
+
s.name = 'your-gem'
|
34
|
+
s.version = '0.1.0'
|
35
|
+
end
|
36
|
+
```
|
37
|
+
|
38
|
+
## LICENSE:
|
39
|
+
|
40
|
+
Apache License 2.0 (Apache-2.0)
|
41
|
+
|
42
|
+
Copyright (c) 2011-2017, Lin Jen-Shin (godfat)
|
43
|
+
|
44
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
45
|
+
you may not use this file except in compliance with the License.
|
46
|
+
You may obtain a copy of the License at
|
47
|
+
|
48
|
+
<http://www.apache.org/licenses/LICENSE-2.0>
|
49
|
+
|
50
|
+
Unless required by applicable law or agreed to in writing, software
|
51
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
52
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
53
|
+
See the License for the specific language governing permissions and
|
54
|
+
limitations under the License.
|
data/task/gemgem.rb
CHANGED
@@ -1,175 +1,295 @@
|
|
1
1
|
|
2
|
-
require 'pathname'
|
3
|
-
|
4
2
|
module Gemgem
|
5
3
|
class << self
|
6
|
-
attr_accessor :dir, :spec
|
4
|
+
attr_accessor :dir, :spec, :submodules, :spec_create
|
7
5
|
end
|
8
6
|
|
9
7
|
module_function
|
8
|
+
def gem_tag ; "#{spec.name}-#{spec.version}" ; end
|
9
|
+
def gem_path ; "#{pkg_dir}/#{gem_tag}.gem" ; end
|
10
|
+
def spec_path ; "#{dir}/#{spec.name}.gemspec" ; end
|
11
|
+
def pkg_dir ; "#{dir}/pkg" ; end
|
12
|
+
def escaped_dir; @escaped_dir ||= Regexp.escape(dir); end
|
13
|
+
|
14
|
+
def init dir, options={}, &block
|
15
|
+
self.dir = dir
|
16
|
+
ENV['RUBYLIB'] = "#{dir}/lib:#{ENV['RUBYLIB']}"
|
17
|
+
ENV['PATH'] = "#{dir}/bin:#{ENV['PATH']}"
|
18
|
+
self.submodules = options[:submodules] || []
|
19
|
+
self.spec_create = block
|
20
|
+
|
21
|
+
$LOAD_PATH.unshift("#{dir}/lib", *submodules_libs)
|
22
|
+
end
|
23
|
+
|
10
24
|
def create
|
11
|
-
|
25
|
+
spec = Gem::Specification.new do |s|
|
12
26
|
s.authors = ['Lin Jen-Shin (godfat)']
|
13
27
|
s.email = ['godfat (XD) godfat.org']
|
14
28
|
|
15
29
|
s.description = description.join
|
16
30
|
s.summary = description.first
|
31
|
+
s.license = license
|
17
32
|
|
18
|
-
s.
|
19
|
-
s.
|
20
|
-
s.
|
21
|
-
s.
|
22
|
-
|
23
|
-
|
24
|
-
})
|
33
|
+
s.date = Time.now.strftime('%Y-%m-%d')
|
34
|
+
s.files = gem_files
|
35
|
+
s.test_files = test_files
|
36
|
+
s.executables = bin_files
|
37
|
+
end
|
38
|
+
spec_create.call(spec)
|
25
39
|
spec.homepage ||= "https://github.com/godfat/#{spec.name}"
|
26
|
-
spec
|
40
|
+
self.spec = spec
|
27
41
|
end
|
28
42
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
+
def gem_install
|
44
|
+
require 'rubygems/commands/install_command'
|
45
|
+
# read ~/.gemrc
|
46
|
+
Gem.use_paths(Gem.configuration[:gemhome], Gem.configuration[:gempath])
|
47
|
+
Gem::Command.extra_args = Gem.configuration[:gem]
|
48
|
+
|
49
|
+
# setup install options
|
50
|
+
cmd = Gem::Commands::InstallCommand.new
|
51
|
+
cmd.handle_options([])
|
52
|
+
|
53
|
+
# install
|
54
|
+
install = Gem::Installer.new(gem_path, cmd.options)
|
55
|
+
install.install
|
56
|
+
puts "\e[35mGem installed: \e[33m#{strip_path(install.gem_dir)}\e[0m"
|
43
57
|
end
|
44
58
|
|
45
|
-
def
|
46
|
-
|
59
|
+
def gem_spec
|
60
|
+
create
|
61
|
+
write
|
47
62
|
end
|
48
63
|
|
49
|
-
def
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
''
|
60
|
-
end
|
64
|
+
def gem_build
|
65
|
+
require 'fileutils'
|
66
|
+
require 'rubygems/package'
|
67
|
+
gem = nil
|
68
|
+
Dir.chdir(dir) do
|
69
|
+
gem = Gem::Package.build(Gem::Specification.load(spec_path))
|
70
|
+
FileUtils.mkdir_p(pkg_dir)
|
71
|
+
FileUtils.mv(gem, pkg_dir) # gem is relative path, but might be ok
|
72
|
+
end
|
73
|
+
puts "\e[35mGem built: \e[33m#{strip_path("#{pkg_dir}/#{gem}")}\e[0m"
|
61
74
|
end
|
62
75
|
|
63
|
-
def
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
"##{readme['INSTALLATION']}\n\n" +
|
69
|
-
if readme['SYNOPSIS'] then "##{readme['SYNOPSIS']}" else '' end
|
76
|
+
def gem_release
|
77
|
+
sh_git('tag', gem_tag)
|
78
|
+
sh_git('push')
|
79
|
+
sh_git('push', '--tags')
|
80
|
+
sh_gem('push', gem_path)
|
70
81
|
end
|
71
82
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
83
|
+
def gem_check
|
84
|
+
unless git('status', '--porcelain').empty?
|
85
|
+
puts("\e[35mWorking copy is not clean.\e[0m")
|
86
|
+
exit(3)
|
87
|
+
end
|
88
|
+
|
89
|
+
ver = spec.version.to_s
|
90
|
+
|
91
|
+
if ENV['VERSION'].nil?
|
92
|
+
puts("\e[35mExpected " \
|
93
|
+
"\e[33mVERSION\e[35m=\e[33m#{ver}\e[0m")
|
94
|
+
exit(1)
|
75
95
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
html.css('*').each{ |n| n.delete('id') }
|
82
|
-
html.root.children.to_html
|
96
|
+
elsif ENV['VERSION'] != ver
|
97
|
+
puts("\e[35mExpected \e[33mVERSION\e[35m=\e[33m#{ver} " \
|
98
|
+
"\e[35mbut got\n " \
|
99
|
+
"\e[33mVERSION\e[35m=\e[33m#{ENV['VERSION']}\e[0m")
|
100
|
+
exit(2)
|
83
101
|
end
|
84
102
|
end
|
85
103
|
|
86
|
-
def
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
104
|
+
def test
|
105
|
+
return if test_files.empty?
|
106
|
+
|
107
|
+
if ENV['COV'] || ENV['CI']
|
108
|
+
require 'simplecov'
|
109
|
+
if ENV['CI']
|
110
|
+
begin
|
111
|
+
require 'coveralls'
|
112
|
+
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
113
|
+
rescue LoadError => e
|
114
|
+
puts "Cannot load coveralls, skip: #{e}"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
SimpleCov.start do
|
118
|
+
add_filter('test/')
|
119
|
+
add_filter('test.rb')
|
120
|
+
submodules_libs.each(&method(:add_filter))
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
test_files.each{ |file| require "#{dir}/#{file[0..-4]}" }
|
93
125
|
end
|
94
126
|
|
95
|
-
def
|
96
|
-
|
127
|
+
def clean
|
128
|
+
return if ignored_files.empty?
|
129
|
+
|
130
|
+
require 'fileutils'
|
131
|
+
trash = File.expand_path("~/.Trash/#{spec.name}")
|
132
|
+
puts "Move the following files into: \e[35m#{strip_path(trash)}\e[33m"
|
133
|
+
|
134
|
+
ignored_files.each do |file|
|
135
|
+
from = "#{dir}/#{file}"
|
136
|
+
to = "#{trash}/#{File.dirname(file)}"
|
137
|
+
puts strip_path(from)
|
138
|
+
|
139
|
+
FileUtils.mkdir_p(to)
|
140
|
+
FileUtils.mv(from, to)
|
141
|
+
end
|
142
|
+
|
143
|
+
print "\e[0m"
|
97
144
|
end
|
98
145
|
|
99
146
|
def write
|
100
|
-
File.open(
|
101
|
-
f << split_lines(spec.to_ruby) }
|
147
|
+
File.open(spec_path, 'w'){ |f| f << split_lines(spec.to_ruby) }
|
102
148
|
end
|
103
149
|
|
104
150
|
def split_lines ruby
|
105
|
-
ruby.gsub(/(.+?)\[(.+?)\]/){ |s|
|
151
|
+
ruby.gsub(/(.+?)\s*=\s*\[(.+?)\]/){ |s|
|
106
152
|
if $2.index(',')
|
107
|
-
"#{$1}[\n #{$2.split(',').map(&:strip).join(",\n ")}]"
|
153
|
+
"#{$1} = [\n #{$2.split(',').map(&:strip).join(",\n ")}]"
|
108
154
|
else
|
109
155
|
s
|
110
156
|
end
|
111
157
|
}
|
112
158
|
end
|
113
159
|
|
160
|
+
def strip_path path
|
161
|
+
strip_home_path(strip_cwd_path(path))
|
162
|
+
end
|
163
|
+
|
164
|
+
def strip_home_path path
|
165
|
+
path.sub(/\A#{Regexp.escape(ENV['HOME'])}\//, '~/')
|
166
|
+
end
|
167
|
+
|
168
|
+
def strip_cwd_path path
|
169
|
+
path.sub(/\A#{Regexp.escape(Dir.pwd)}\//, '')
|
170
|
+
end
|
171
|
+
|
172
|
+
def submodules_libs
|
173
|
+
submodules.map{ |path| "#{dir}/#{path}/lib" }
|
174
|
+
end
|
175
|
+
|
176
|
+
def git *args
|
177
|
+
`git --git-dir=#{dir}/.git #{args.join(' ')}`
|
178
|
+
end
|
179
|
+
|
180
|
+
def sh_git *args
|
181
|
+
Rake.sh('git', "--git-dir=#{dir}/.git", *args)
|
182
|
+
end
|
183
|
+
|
184
|
+
def sh_gem *args
|
185
|
+
Rake.sh(Gem.ruby, '-S', 'gem', *args)
|
186
|
+
end
|
187
|
+
|
188
|
+
def glob path=dir
|
189
|
+
Dir.glob("#{path}/**/*", File::FNM_DOTMATCH)
|
190
|
+
end
|
191
|
+
|
192
|
+
def readme
|
193
|
+
@readme ||=
|
194
|
+
if (path = "#{Gemgem.dir}/README.md") && File.exist?(path)
|
195
|
+
ps = "##{File.read(path)}".
|
196
|
+
scan(/((#+)[^\n]+\n\n.+?(?=(\n\n\2[^#\n]+\n)|\Z))/m).map(&:first)
|
197
|
+
ps.inject('HEADER' => ps.first){ |r, s, i|
|
198
|
+
r[s[/\w+/]] = s
|
199
|
+
r
|
200
|
+
}
|
201
|
+
else
|
202
|
+
{}
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def description
|
207
|
+
# JRuby String#lines is returning an enumerator
|
208
|
+
@description ||= (readme['DESCRIPTION']||'').sub(/.+\n\n/, '').lines.to_a
|
209
|
+
end
|
210
|
+
|
211
|
+
def license
|
212
|
+
readme['LICENSE'].sub(/.+\n\n/, '').lines.first.
|
213
|
+
split(/[()]/).map(&:strip).reject(&:empty?).last
|
214
|
+
end
|
215
|
+
|
114
216
|
def all_files
|
115
|
-
@all_files ||=
|
116
|
-
|
117
|
-
|
217
|
+
@all_files ||= fold_files(glob).sort
|
218
|
+
end
|
219
|
+
|
220
|
+
def fold_files files
|
221
|
+
files.inject([]){ |r, path|
|
222
|
+
if File.file?(path) && path !~ %r{/\.git(/|$)} &&
|
223
|
+
(rpath = path[%r{^#{escaped_dir}/(.*$)}, 1])
|
224
|
+
r << rpath
|
225
|
+
elsif File.symlink?(path) # walk into symlinks...
|
226
|
+
r.concat(fold_files(glob(File.expand_path(path,
|
227
|
+
File.readlink(path)))))
|
118
228
|
else
|
119
|
-
|
229
|
+
r
|
120
230
|
end
|
121
|
-
}
|
231
|
+
}
|
122
232
|
end
|
123
233
|
|
124
234
|
def gem_files
|
125
|
-
@gem_files ||= all_files
|
235
|
+
@gem_files ||= all_files.reject{ |f|
|
236
|
+
f =~ submodules_pattern ||
|
237
|
+
(f =~ ignored_pattern && !git_files.include?(f))
|
238
|
+
}
|
126
239
|
end
|
127
240
|
|
128
|
-
def
|
129
|
-
@
|
130
|
-
|
241
|
+
def test_files
|
242
|
+
@test_files ||= gem_files.grep(%r{^test/(.+?/)*test_.+?\.rb$})
|
243
|
+
end
|
244
|
+
|
245
|
+
def bin_files
|
246
|
+
@bin_files ||= gem_files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
131
247
|
end
|
132
248
|
|
133
249
|
def git_files
|
134
250
|
@git_files ||= if File.exist?("#{dir}/.git")
|
135
|
-
|
251
|
+
git('ls-files').split("\n")
|
136
252
|
else
|
137
253
|
[]
|
138
254
|
end
|
139
255
|
end
|
140
256
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
257
|
+
def ignored_files
|
258
|
+
@ignored_files ||= all_files.grep(ignored_pattern)
|
259
|
+
end
|
260
|
+
|
261
|
+
def ignored_pattern
|
262
|
+
@ignored_pattern ||= if gitignore.empty?
|
263
|
+
/^$/
|
264
|
+
else
|
265
|
+
Regexp.new(expand_patterns(gitignore).join('|'))
|
266
|
+
end
|
145
267
|
end
|
146
268
|
|
147
|
-
def
|
148
|
-
@
|
149
|
-
|
150
|
-
|
151
|
-
|
269
|
+
def submodules_pattern
|
270
|
+
@submodules_pattern ||= if submodules.empty?
|
271
|
+
/^$/
|
272
|
+
else
|
273
|
+
Regexp.new(submodules.map{ |path|
|
274
|
+
"^#{Regexp.escape(path)}/" }.join('|'))
|
275
|
+
end
|
152
276
|
end
|
153
277
|
|
154
278
|
def expand_patterns pathes
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
Dir[path] +
|
161
|
-
Pathname.new(File.dirname(path)).children.select(&:directory?).
|
162
|
-
map{ |prefix| "#{prefix}/#{File.basename(path)}" })
|
163
|
-
end
|
164
|
-
}.flatten
|
279
|
+
# http://git-scm.com/docs/gitignore
|
280
|
+
pathes.flat_map{ |path|
|
281
|
+
# we didn't implement negative pattern for now
|
282
|
+
Regexp.escape(path).sub(%r{^/}, '^').gsub(/\\\*/, '[^/]*')
|
283
|
+
}
|
165
284
|
end
|
166
285
|
|
167
286
|
def gitignore
|
168
|
-
if File.exist?(path = "#{dir}/.gitignore")
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
287
|
+
@gitignore ||= if File.exist?(path = "#{dir}/.gitignore")
|
288
|
+
File.read(path).lines.
|
289
|
+
reject{ |l| l == /^\s*(#|\s+$)/ }.map(&:strip)
|
290
|
+
else
|
291
|
+
[]
|
292
|
+
end
|
173
293
|
end
|
174
294
|
end
|
175
295
|
|
@@ -177,89 +297,42 @@ namespace :gem do
|
|
177
297
|
|
178
298
|
desc 'Install gem'
|
179
299
|
task :install => [:build] do
|
180
|
-
|
300
|
+
Gemgem.gem_install
|
181
301
|
end
|
182
302
|
|
183
303
|
desc 'Build gem'
|
184
304
|
task :build => [:spec] do
|
185
|
-
|
186
|
-
|
187
|
-
|
305
|
+
Gemgem.gem_build
|
306
|
+
end
|
307
|
+
|
308
|
+
desc 'Generate gemspec'
|
309
|
+
task :spec do
|
310
|
+
Gemgem.gem_spec
|
188
311
|
end
|
189
312
|
|
190
313
|
desc 'Release gem'
|
191
314
|
task :release => [:spec, :check, :build] do
|
192
|
-
|
193
|
-
sh("git push")
|
194
|
-
sh("git push --tags")
|
195
|
-
sh("#{Gem.ruby} -S gem push pkg/#{Gemgem.gem_tag}.gem")
|
315
|
+
Gemgem.gem_release
|
196
316
|
end
|
197
317
|
|
198
318
|
task :check do
|
199
|
-
|
200
|
-
|
201
|
-
if ENV['VERSION'].nil?
|
202
|
-
puts("\e[35mExpected " \
|
203
|
-
"\e[33mVERSION\e[35m=\e[33m#{ver}\e[0m")
|
204
|
-
exit(1)
|
205
|
-
|
206
|
-
elsif ENV['VERSION'] != ver
|
207
|
-
puts("\e[35mExpected \e[33mVERSION\e[35m=\e[33m#{ver} " \
|
208
|
-
"\e[35mbut got\n " \
|
209
|
-
"\e[33mVERSION\e[35m=\e[33m#{ENV['VERSION']}\e[0m")
|
210
|
-
exit(2)
|
211
|
-
end
|
319
|
+
Gemgem.gem_check
|
212
320
|
end
|
213
321
|
|
214
322
|
end # of gem namespace
|
215
323
|
|
216
|
-
desc 'Run tests
|
324
|
+
desc 'Run tests'
|
217
325
|
task :test do
|
218
|
-
|
219
|
-
Bacon.extend(Bacon::TestUnitOutput)
|
220
|
-
Bacon.summary_on_exit
|
221
|
-
$LOAD_PATH.unshift('lib')
|
222
|
-
Dir['./test/**/test_*.rb'].each{ |file| require file[0..-4] }
|
223
|
-
end
|
224
|
-
|
225
|
-
desc 'Run tests with shell'
|
226
|
-
task 'test:shell', :RUBY_OPTS do |t, args|
|
227
|
-
files = Dir['test/**/test_*.rb'].join(' ')
|
228
|
-
|
229
|
-
cmd = [Gem.ruby, args[:RUBY_OPTS],
|
230
|
-
'-I', 'lib', '-S', 'bacon', '--quiet', files]
|
231
|
-
|
232
|
-
sh(cmd.compact.join(' '))
|
233
|
-
end
|
234
|
-
|
235
|
-
desc 'Generate ann markdown'
|
236
|
-
task 'ann:md' => ['gem:spec'] do
|
237
|
-
puts Gemgem.ann_md
|
238
|
-
end
|
239
|
-
|
240
|
-
desc 'Generate ann html'
|
241
|
-
task 'ann:html' => ['gem:spec'] do
|
242
|
-
puts Gemgem.ann_html
|
243
|
-
end
|
244
|
-
|
245
|
-
desc 'Generate ann email'
|
246
|
-
task 'ann:email' => ['gem:spec'] do
|
247
|
-
puts Gemgem.ann_email
|
248
|
-
end
|
249
|
-
|
250
|
-
desc 'Generate rdoc'
|
251
|
-
task :doc => ['gem:spec'] do
|
252
|
-
sh("yardoc -o rdoc --main README.md" \
|
253
|
-
" --files #{Gemgem.spec.extra_rdoc_files.join(',')}")
|
326
|
+
Gemgem.test
|
254
327
|
end
|
255
328
|
|
256
|
-
desc '
|
329
|
+
desc 'Trash ignored files'
|
257
330
|
task :clean => ['gem:spec'] do
|
258
|
-
|
259
|
-
sh "mkdir -p #{trash}" unless File.exist?(File.expand_path(trash))
|
260
|
-
Gemgem.ignored_files.each{ |file| sh "mv #{file} #{trash}" }
|
331
|
+
Gemgem.clean
|
261
332
|
end
|
262
333
|
|
263
334
|
task :default do
|
264
|
-
|
335
|
+
# Is there a reliable way to do this in the current process?
|
336
|
+
# It failed miserably before between Rake versions...
|
337
|
+
exec "#{Gem.ruby} -S #{$PROGRAM_NAME} -f #{Rake.application.rakefile} -T"
|
265
338
|
end
|
metadata
CHANGED
@@ -1,21 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shere
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Lin Jen-Shin (godfat)
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2018-03-14 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
|
-
description:
|
15
|
-
|
13
|
+
description: |-
|
14
|
+
_Share_ the directory _here_ with [Nginx][]!
|
16
15
|
Shere would create a temporary Nginx config and run an
|
17
|
-
|
18
|
-
Nginx instance to serve the directory you specified.'
|
16
|
+
Nginx instance to serve the directory you specified.
|
19
17
|
email:
|
20
18
|
- godfat (XD) godfat.org
|
21
19
|
executables:
|
@@ -23,8 +21,8 @@ executables:
|
|
23
21
|
extensions: []
|
24
22
|
extra_rdoc_files: []
|
25
23
|
files:
|
26
|
-
- .gitignore
|
27
|
-
- .gitmodules
|
24
|
+
- ".gitignore"
|
25
|
+
- ".gitmodules"
|
28
26
|
- CHANGES.md
|
29
27
|
- Gemfile
|
30
28
|
- LICENSE
|
@@ -36,30 +34,30 @@ files:
|
|
36
34
|
- lib/shere/runner.rb
|
37
35
|
- lib/shere/version.rb
|
38
36
|
- shere.gemspec
|
39
|
-
- task
|
37
|
+
- task/README.md
|
40
38
|
- task/gemgem.rb
|
41
39
|
homepage: https://github.com/godfat/shere
|
42
|
-
licenses:
|
40
|
+
licenses:
|
41
|
+
- Apache-2.0
|
42
|
+
metadata: {}
|
43
43
|
post_install_message:
|
44
44
|
rdoc_options: []
|
45
45
|
require_paths:
|
46
46
|
- lib
|
47
47
|
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
-
none: false
|
49
48
|
requirements:
|
50
|
-
- -
|
49
|
+
- - ">="
|
51
50
|
- !ruby/object:Gem::Version
|
52
51
|
version: '0'
|
53
52
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
-
none: false
|
55
53
|
requirements:
|
56
|
-
- -
|
54
|
+
- - ">="
|
57
55
|
- !ruby/object:Gem::Version
|
58
56
|
version: '0'
|
59
57
|
requirements: []
|
60
58
|
rubyforge_project:
|
61
|
-
rubygems_version:
|
59
|
+
rubygems_version: 2.7.6
|
62
60
|
signing_key:
|
63
|
-
specification_version:
|
61
|
+
specification_version: 4
|
64
62
|
summary: _Share_ the directory _here_ with [Nginx][]!
|
65
63
|
test_files: []
|
data/task/.gitignore
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
*.rbc
|