paster 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/bin/paster +6 -0
  3. data/lib/paster.rb +45 -26
  4. data/paster.gemspec +1 -1
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 742cb621112110a5ea54056a8e7feb3790691cbc
4
- data.tar.gz: bba0c3563f247bee350a36b16a6f2df17e9e695a
3
+ metadata.gz: 90ea9d39b00350a67bb06330b79e73de23eeb33a
4
+ data.tar.gz: 56bac197e3adbf7926a3752ed10d99489826eb9e
5
5
  SHA512:
6
- metadata.gz: '09c140be45abf86f988324cd375513bfc622b55a3c472b3585090983aace4f2856706c3a8e21769cc86dcf6ba4d883e219aa1261509795f870ce32d330953cc5'
7
- data.tar.gz: 5bebdd4748191bfa5490aebbcf248bb5a9961372c6390c6c1b75e9b7f175126d3c9698b9b690b3296aeb22f43a7e09c5d1af5460dea9113a0b354f8870155614
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
- @lang = Linguist.detect(Linguist::Blob.new "", self.class.instance_variable_get(:@paste))&.name
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
- nil,
25
- ->_{
26
- found = File.read("lib/pygments.txt").scan(/pygments.lexers.([a-z_0-9]+)', '([^']+)'/).rassoc @lang
27
- [_, ("#{_}?#{found.first}" if found)].compact
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(@lang)&.first,
35
- nil,
36
- ->_{
44
+ File.read("lib/genshi.txt").scan(/'([a-z_0-9-]+)' => '([^']+)',/).rassoc(lang)&.first,
45
+ ->resp{
37
46
  s = expire[0] == "burn" ? ((
38
- require "oga"
39
- s = Oga.parse_html(_).css("input").tap do |_|
40
- raise RuntimeError.new "can't parse response" unless 1 == _.size
41
- end.first["value"]
42
- )) : _
43
- [s, s.sub(/(.+)\//, "\\1/raw/")]
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(@lang)&.last || "-1",
51
- {"paste"=>"Send"},
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
- s = URI.join("https://paste.debian.net", Oga.parse_html(_).css("a").tap{ |_|
55
- raise RuntimeError.new "can't parse response" unless 1 == _.size
56
- }.first["href"].chomp("/")).to_s
57
- [s, s.sub(/(.+)\//, "\\1/plain/")]
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, extra, callback = ->_{_}|
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(url, :post, *multipart, no_redirect: true,
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
- ).strip
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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "paster"
3
- spec.version = "0.0.1"
3
+ spec.version = "0.0.2"
4
4
  spec.summary = "universal asynchronous pastebin CLI"
5
5
 
6
6
  spec.author = "Victor Maslov aka Nakilon"
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.1
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-06-28 00:00:00.000000000 Z
11
+ date: 2021-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nethttputils