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.
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