paster 0.0.1 → 0.0.2
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/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
|