paster 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/bin/paster +6 -0
- data/lib/paster.rb +45 -26
- data/paster.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90ea9d39b00350a67bb06330b79e73de23eeb33a
|
4
|
+
data.tar.gz: 56bac197e3adbf7926a3752ed10d99489826eb9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 103ee1d96ee2f622f5c0bdfa73847e9ad64c2484b770f4f21dcaedb7c7c597701af76384d3b40e4a67b1c8c2ea867487c9257123029b3589c394fdac95d80fb9
|
7
|
+
data.tar.gz: ef11f98d2ca13044b6bb6260bad3aef22a262ed4e7f50c2d797b0a7c0bbfced11b7efc309cc0dae915a671a0e241ca140d8b7e1836ad26d22bc9acc9266c8f6d
|
data/bin/paster
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
Signal.trap(:INT){ abort "\n(interrupted by SIGINT)" }
|
3
|
+
puts ""
|
4
|
+
puts "(press ^C to abort)"
|
3
5
|
|
4
6
|
paste = ARGF.read
|
5
7
|
$stdin = open "/dev/tty"
|
6
8
|
puts "paste size: #{paste.size}"
|
7
9
|
require_relative "../lib/paster"
|
8
10
|
paster = Paster paste
|
11
|
+
puts "detected language: #{paster.lang || "unknown"}" # change 'detected' to 'assumed' if we make it guess by file extension
|
12
|
+
puts ""
|
9
13
|
|
10
14
|
require "tty-prompt"
|
11
15
|
begin
|
@@ -28,8 +32,10 @@ begin
|
|
28
32
|
[size, {name: "#{name}", value: paster, disabled: "(no pastebins)"}] :
|
29
33
|
[size, {name: "#{name} (#{size})", value: paster}]
|
30
34
|
}
|
35
|
+
|
31
36
|
abort "no pastebin for such size" if services.all?{ |__, _| _[:disabled] } # TODO: better error message
|
32
37
|
# otherwise tty-prompt fails with an unhandled exception, lol
|
38
|
+
|
33
39
|
TTY::Prompt.new.select "expiration:", services.map(&:last),
|
34
40
|
default: services.max_by(&:first).last[:name],
|
35
41
|
filter: true, cycle: true, per_page: 100
|
data/lib/paster.rb
CHANGED
@@ -3,59 +3,78 @@ NetHTTPUtils.logger.level = ENV.fetch("LOGLEVEL_Paster", "fatal").to_sym
|
|
3
3
|
NetHTTPUtils.class_variable_get(:@@_405).add "sprunge.us"
|
4
4
|
NetHTTPUtils.class_variable_get(:@@_405).add "paste.the-compiler.org"
|
5
5
|
NetHTTPUtils.class_variable_get(:@@_405).add "paste.debian.net"
|
6
|
+
# TODO: upgrade the NetHTTPUtils gem finally to switch to no HEAD calls by default
|
6
7
|
|
7
8
|
def Paster paste
|
8
|
-
Struct.new :expire do
|
9
|
+
Struct.new :expire, :lang do
|
9
10
|
@paste = paste
|
10
11
|
|
11
12
|
def initialize
|
12
13
|
STDOUT.sync = true
|
13
14
|
require "linguist"
|
14
|
-
|
15
|
+
self.lang = Linguist.detect(Linguist::Blob.new "", self.class.instance_variable_get(:@paste))&.name
|
15
16
|
end
|
16
17
|
|
17
18
|
def services
|
19
|
+
assert_one = lambda do |_, resp|
|
20
|
+
next if 1 == _.size
|
21
|
+
require "tmpdir"
|
22
|
+
filename = File.join Dir.tmpdir, "paster.htm"
|
23
|
+
File.write filename, resp
|
24
|
+
raise RuntimeError.new "can't parse response (stored response to #{filename})"
|
25
|
+
end
|
18
26
|
[
|
19
27
|
[
|
20
28
|
10000000, [nil], nil,
|
21
29
|
nil,
|
22
30
|
"http://sprunge.us", "sprunge", nil,
|
23
31
|
nil,
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
32
|
+
->resp{
|
33
|
+
found = File.read("lib/pygments.txt").scan(/pygments.lexers.([a-z_0-9]+)', '([^']+)'/).rassoc lang
|
34
|
+
[
|
35
|
+
"raw: #{resp}",
|
36
|
+
("formatted: #{resp.chomp}?#{found.first}" if found),
|
37
|
+
].compact
|
28
38
|
},
|
29
39
|
],
|
30
40
|
[
|
31
41
|
15000000, ["burn", 0, 5, 60, 1440, 10080, 40320, 483840], nil,
|
32
42
|
expire[0],
|
33
43
|
"https://paste.the-compiler.org/api/create", "text", nil,
|
34
|
-
File.read("lib/genshi.txt").scan(/'([a-z_0-9-]+)' => '([^']+)',/).rassoc(
|
35
|
-
|
36
|
-
->_{
|
44
|
+
File.read("lib/genshi.txt").scan(/'([a-z_0-9-]+)' => '([^']+)',/).rassoc(lang)&.first,
|
45
|
+
->resp{
|
37
46
|
s = expire[0] == "burn" ? ((
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
)) :
|
43
|
-
[
|
47
|
+
require "oga"
|
48
|
+
Oga.parse_html(resp).css("input").tap do |_|
|
49
|
+
assert_one.call _, resp
|
50
|
+
end.first["value"]
|
51
|
+
)) : resp
|
52
|
+
[
|
53
|
+
"formatted: #{s}",
|
54
|
+
"raw: #{s.sub(/(.+)\//, "\\1/raw/")}",
|
55
|
+
]
|
44
56
|
}
|
45
57
|
],
|
46
58
|
[
|
47
59
|
150000, [-1, 3600, 86400, 259200, 7776000], ->_{ 2 > _.count("\n") },
|
48
60
|
expire[1],
|
49
61
|
"https://paste.debian.net", "code", :multipart,
|
50
|
-
File.read("lib/pygments.txt").scan(/([^']+)', \(([^)]*)/).map{ |_, __| [_, __[/(?<=')[^']*/]] }.assoc(
|
51
|
-
{
|
52
|
-
|
62
|
+
File.read("lib/pygments.txt").scan(/([^']+)', \(([^)]*)/).map{ |_, __| [_, __[/(?<=')[^']*/]] }.assoc(lang)&.last || "-1",
|
63
|
+
->resp{
|
64
|
+
url = resp.instance_variable_get(:@last_response).uri.to_s.chomp("/")
|
53
65
|
require "oga"
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
66
|
+
[
|
67
|
+
"formatted: #{url}",
|
68
|
+
"raw: #{url.sub(/(.+)\//, "\\1/plain/")}",
|
69
|
+
"delete: #{
|
70
|
+
URI.join "https://paste.debian.net", Oga.parse_html(resp).css("a").map{ |a| a["href"] }.grep(/delete/).tap{ |_|
|
71
|
+
assert_one.call _, resp
|
72
|
+
}.first
|
73
|
+
}",
|
74
|
+
]
|
75
|
+
},
|
76
|
+
false,
|
77
|
+
{"paste"=>"Send"},
|
59
78
|
],
|
60
79
|
].reject do |max_size, possible_expiration, callback, expire, |
|
61
80
|
next true if self.class.instance_variable_get(:@paste).size > max_size
|
@@ -65,12 +84,12 @@ def Paster paste
|
|
65
84
|
end
|
66
85
|
|
67
86
|
def paste
|
68
|
-
services.map do |_, _, _, expire, url, field, multipart, lang,
|
87
|
+
services.map do |_, _, _, expire, url, field, multipart, lang, callback, no_redirect = true, extra = nil|
|
69
88
|
Thread.new do
|
70
89
|
puts begin
|
71
|
-
callback.call NetHTTPUtils.request_data
|
90
|
+
callback.call NetHTTPUtils.request_data url, :post, *multipart, no_redirect: no_redirect,
|
72
91
|
form: {"lang" => lang, "expire" => expire}.map{ |k, v| [k, v.to_s] if v }.compact.to_h.merge(extra || {}).merge({field => self.class.instance_variable_get(:@paste)})
|
73
|
-
|
92
|
+
# if we .strip the response before sending to callback it won't haev the last_response instance_variable
|
74
93
|
rescue => e
|
75
94
|
"failed to paste to #{url}: #{e} -- consider reporting this issue to GitHub"
|
76
95
|
end
|
data/paster.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paster
|
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
|
- Victor Maslov aka Nakilon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nethttputils
|