flnews_post_proc 1.7

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.
data/lib/override.rb ADDED
@@ -0,0 +1,199 @@
1
+ #encoding: UTF-8
2
+ =begin
3
+ /***************************************************************************
4
+ * 2023-2024, Michael Uplawski <michael.uplawski@uplawski.eu> *
5
+ * This program is free software; you can redistribute it and/or modify *
6
+ * it under the terms of the WTFPL 2.0 or later, see *
7
+ * http://www.wtfpl.net/about/ *
8
+ * *
9
+ * This program is distributed in the hope that it will be useful, *
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
12
+ * *
13
+ ***************************************************************************/
14
+ =end
15
+
16
+ # This class manages a dialog to alter the behavior of the
17
+ # post-processor on a “per article” basis. It can be displayed
18
+ # before posting, to do some “last minute” changes,
19
+ # notably to deactivate them.
20
+ #
21
+ # Post-processing CANNOT be deactivated completely in this dialog.
22
+ # I do not remember, why a previous comment stated the contrary.
23
+
24
+ require_relative 'basic_logging'
25
+
26
+ class OverrideDlg
27
+
28
+ include BasicLogging
29
+
30
+ XTERM = 'xterm'
31
+ # TERMINAL = 'x-terminal-emulator'
32
+ WHIPTAIL = 'whiptail'
33
+ YAD = 'yad'
34
+ ZENITY = 'zenity'
35
+ # The external programs which are supported for the time. They will be run in
36
+ # a new process (IO.popen() ). The first program from this array, which is
37
+ # found in the Path, will be used. Whiptail and a pure ruby dialog
38
+ # necessitate that xterm be found, too.
39
+ @@Executables = [YAD, ZENITY, WHIPTAIL, XTERM]
40
+ @@LIBDIR = File::dirname(__FILE__)
41
+ # The configuration variables that can be unset.
42
+ # This class instance variable is exposed via a getter.
43
+ @cvars = [:GROUP_SIGS, :CUSTOM_HEADERS, :NO_ARCHIVE_GROUPS, :VFY_URLS, :DEBUG_LOG]
44
+
45
+ # ... here
46
+ # For the record: this is rather cool.
47
+ # ... believe me! It is!
48
+ class << self
49
+ attr_reader :cvars
50
+ end
51
+ # Love it.
52
+
53
+ # Create the object
54
+ def initialize
55
+ @config = Configuration::instance
56
+ # find the supported programs
57
+ @executables = @@Executables.select do |ex_name|
58
+ program?(ex_name)
59
+ end
60
+ # As we are calling external programs anyway,
61
+ # why not continue with that ...
62
+ @xmsg = ENV['PATH'].split(':').any? {|d| Dir.children(d).include?('xmessage')}
63
+ # bof.
64
+ end
65
+
66
+ # display a dialog and return the new options.
67
+ def show
68
+ if(@executables && !@executables.empty?)
69
+ debug('found executables ' << @executables.join(', '))
70
+ opts = nil
71
+ begin
72
+ if has?(YAD)
73
+ return yad_dlg.split.collect {|o| o.to_s}.join(' ')
74
+ elsif has?(ZENITY)
75
+ return zenity_dlg.split.collect {|o| o.to_s}.join(' ')
76
+ elsif has? XTERM
77
+ if has?(WHIPTAIL)
78
+ return whiptail_dlg.split.collect {|o| o.to_s}.join(' ')
79
+ else
80
+ debug 'using naked xterm'
81
+ return ruby_dlg.split.collect {|o| o.to_s}.join(' ')
82
+ end
83
+ end
84
+ rescue SystemExit
85
+ msg = 'Process is cancelled (SystemExit)'
86
+ info msg
87
+ exit true
88
+ rescue Exception => ex
89
+ msg = 'Error upon showing dialog ' << ex.message
90
+ error(msg)
91
+ end
92
+ # no program to show the dialog
93
+ else
94
+ msg = "#{File.basename($0)}: No suitable executable found to display the dialog"
95
+ warn msg
96
+ # if xmessage is available, give the user a last chance.
97
+ if @xmsg
98
+ io = IO.popen('xmessage -buttons continue:0,abort:1 -default abort -print ' << msg)
99
+ Process.wait(io.pid)
100
+ # ATTN! read io only once!
101
+ exit if ('continue' != io.read.to_s.strip )
102
+ # ... but then again, we still have a log.
103
+ debug('continue with configured settings')
104
+ end
105
+ end
106
+ end
107
+
108
+ private
109
+ # I know what it does and that there is some
110
+ # redundancy with the following method, but I
111
+ # do not feel like sorting it out, now.
112
+ def program?(ex_name)
113
+ ENV['PATH'].split(':').each do |dir_name|
114
+ return true if Dir.entries(dir_name).include?(ex_name)
115
+ end
116
+ return false
117
+ end
118
+
119
+ # returns true if the executable ex_name is to be
120
+ # called for the dialog
121
+ def has?(ex_name)
122
+ @executables.include? ex_name
123
+ end
124
+
125
+ ###### The following methods call a script, each, in an external process.
126
+ # There appears to be some Exception handling missing, but it does not
127
+ # hurt for the time being. Anyway, I do not care.
128
+
129
+ # creates a whiptail dialog in xterm.
130
+ def whiptail_dlg
131
+ debug('whiptail dialog')
132
+ tf = Tempfile.new
133
+ # dlg = @config.BINDIR << File::Separator << 'whiptail_dlg'
134
+ dlg = @@LIBDIR << File::Separator << 'whiptail_dlg'
135
+ dialog = XTERM.dup << ' -e ' << dlg << ' ' << tf.path
136
+ io = IO::popen(dialog)
137
+ Process.wait(io.pid )
138
+ nopts = tf.read
139
+ exit true if('exit' == nopts.strip)
140
+ tf.unlink
141
+ return nopts
142
+ end
143
+
144
+ # creates a textual dialog in xterm.
145
+ def ruby_dlg
146
+ debug('xterm dialog')
147
+ tf = Tempfile.new
148
+ # dlg = @config.BINDIR << File::Separator << 'ruby_dlg'
149
+ dlg = @@LIBDIR << File::Separator << 'ruby_dlg'
150
+ begin
151
+ dialog = XTERM.dup << ' -e ' << dlg << ' ' << tf.path
152
+ debug('dialog will be ' << dialog)
153
+ rescue Exception => ex
154
+ error ex.message
155
+ wait_for_user
156
+ exit false
157
+ end
158
+ io = IO::popen(dialog)
159
+ debug('wait for ' << io.pid.to_s)
160
+ Process.wait(io.pid )
161
+ nopts = tf.read
162
+ exit true if('exit' == nopts.strip)
163
+ tf.unlink
164
+ return nopts
165
+ end
166
+
167
+ # creates a Zenity dialog.
168
+ def zenity_dlg
169
+ debug('Zenity dialog')
170
+ # dialog = @config.BINDIR << File::Separator << 'zenity_dlg'
171
+ dialog = @@LIBDIR << File::Separator << 'zenity_dlg'
172
+ io = IO.popen(dialog)
173
+ Process::wait(io.pid)
174
+ rc = $?.exitstatus
175
+
176
+ exit true if rc != 0
177
+
178
+ nopts = io.read
179
+ return nopts
180
+ end
181
+
182
+ # creates a YAD dialog.
183
+ def yad_dlg
184
+ debug('yad dialog')
185
+ # dialog = @config.BINDIR << File::Separator << 'yad_dlg'
186
+ dialog = @@LIBDIR << File::Separator << 'yad_dlg'
187
+ debug('dialog will be ' << dialog)
188
+ io = IO::popen(dialog)
189
+ Process::wait(io.pid)
190
+ exit true if $?.exitstatus != 0
191
+
192
+ nopts = io.read
193
+ return nopts
194
+ end
195
+
196
+ end
197
+
198
+ # EOF
199
+
data/lib/ruby_dlg ADDED
@@ -0,0 +1,139 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ =begin
4
+ /***************************************************************************
5
+ * This program is free software; you can redistribute it and/or modify *
6
+ * it under the terms of the WTFPL 2.0 or later, see *
7
+ * http://www.wtfpl.net/about/ *
8
+ * *
9
+ * This program is distributed in the hope that it will be useful, *
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
12
+ * *
13
+ ***************************************************************************/
14
+ =end
15
+
16
+ require 'readline'
17
+ require_relative '../lib/color_output'
18
+ require 'io/wait'
19
+ require 'io/console'
20
+
21
+ def wait_for_user()
22
+ char = nil
23
+ # There is a difference which makes me prefer the below code from STDIN.raw(args)
24
+ # You can try
25
+ # char = STDIN.raw(&:getc)
26
+ # .., which does *not* work the same way and it won't for me.
27
+
28
+ STDIN.raw do
29
+ STDIN.noecho do
30
+ until (STDIN.ready?)
31
+ sleep(0.1)
32
+ end
33
+ char = (STDIN.read_nonblock(1).ord rescue nil)
34
+ end
35
+ end
36
+ return char
37
+ end
38
+ if !ARGV.empty? && ARGV.length > 0
39
+ ofl = nil
40
+ begin
41
+ ofl = File.open(ARGV[0], 'w+')
42
+ puts 'writing to ' << ARGV[0]
43
+ rescue Exception => ex
44
+ puts red ('cannot open ' << ARGV[1])
45
+ puts ex.message
46
+ puts 'hit any key to exit'
47
+ wait_for_user
48
+ exit false
49
+ end
50
+
51
+ opt_array = []
52
+ message = ''
53
+ menu ||= %=
54
+ 1 Unset Signature GROUP_SIGS
55
+ 2 Unset Custom headers CUSTOM_HEADERS
56
+ 3 Unset No Archive NO_ARCHIVE_GROUPS
57
+ 4 Do not correct URLs VFY_URLS
58
+ 5 Disable log DEBUG_LOG
59
+ ––––––––––––––––––––––––––––––––––––––––––––––
60
+ 6 Summary
61
+ ––––––––––––––––––––––––––––––––––––––––––––––
62
+ 0 Okay, use settings.
63
+ ––––––––––––––––––––––––––––––––––––––––––––––––
64
+ {bold("Esc, Ctrl+C and 'q'")} terminate the Post-processor
65
+ and no changes will be applied.
66
+ =
67
+
68
+ loop do
69
+ system 'clear'
70
+ puts yellow(menu)
71
+ puts cyan(message)
72
+ option = wait_for_user - 48
73
+ case option
74
+ # Esc, Ctrl+C, 'q'
75
+ when -21, -45, 65
76
+ puts red('Aborting. Bye.')
77
+ ofl.write 'exit'
78
+ ofl.close
79
+ exit true
80
+ when 0
81
+ puts green('Applying changes.') if !opt_array.empty?
82
+ # write the list of variables to unset (others remain)
83
+ ofl.write opt_array.join(' ')
84
+ ofl.close
85
+ exit true
86
+
87
+ # toggle options
88
+ # ADD option to the option array, if it should be *removed*
89
+ # from the configuration, else remove it from the array.
90
+ when 1
91
+ active = !opt_array.include?(:GROUP_SIGS)
92
+ opt_array << :GROUP_SIGS if active
93
+ opt_array.delete(:GROUP_SIGS) if !active
94
+
95
+ message = "Signature #{active ? 'unset' : 'as configured'}!"
96
+ menu.sub!("Unset Signature", "Set Signature ") if active
97
+ menu.sub!("Set Signature ", "Unset Signature") if !active
98
+ when 2
99
+ active = !opt_array.include?(:CUSTOM_HEADERS)
100
+ opt_array << :CUSTOM_HEADERS if active
101
+ opt_array.delete(:CUSTOM_HEADERS) if !active
102
+
103
+ message = "Custom headers #{active ? 'removed' : 'are added'}!"
104
+ menu.sub!("Unset Custom headers", "Add Custom headers ") if active
105
+ menu.sub!("Add Custom headers ", "Unset Custom headers") if !active
106
+ when 3
107
+ active = !opt_array.include?(:NO_ARCHIVE_GROUPS)
108
+ opt_array << :NO_ARCHIVE_GROUPS if active
109
+ opt_array.delete(:NO_ARCHIVE_GROUPS) if !active
110
+
111
+ message = "X-No-Archive #{active ? 'removed' : 'is added'}!"
112
+ menu.sub!("Unset X-No-Archive", "Add X-No-Archive ") if active
113
+ menu.sub!("Add X-No-Archive ", "Unset X-No-Archive") if !active
114
+ when 4
115
+ active = !opt_array.include?(:VFY_URLS)
116
+ opt_array << :VFY_URLS if active
117
+ opt_array.delete(:VFY_URLS) if !active
118
+
119
+ message = "URLS will #{active ? 'not ' : ''}" << "be verified!"
120
+ menu.sub!("Do not correct URLs", "Correct URLs ") if active
121
+ menu.sub!("Correct URLs ", "Do not correct URLs") if !active
122
+ when 5
123
+ active = !opt_array.include?(:DEBUG_LOG)
124
+ opt_array << :DEBUG_LOG if active
125
+ opt_array.delete(:DEBUG_LOG) if !active
126
+
127
+ message = "Log is #{ active ? 'not ' : ''} " << "written!"
128
+ menu.sub!("Disable log", "Enable log ") if active
129
+ menu.sub!("Enable log ", "Disable log") if !active
130
+ when 6
131
+ message = "Summary of " << bold('disabled') << " options: " << opt_array.join(' ')
132
+ end
133
+ end
134
+ else # ARGV
135
+ puts red('missing file argument')
136
+ exit false
137
+ end
138
+
139
+
data/lib/version.rb ADDED
@@ -0,0 +1,22 @@
1
+ #encoding: UTF-8
2
+ =begin
3
+ /***************************************************************************
4
+ * 2023-2024, Michael Uplawski <michael.uplawski@uplawski.eu> *
5
+ * This program is free software; you can redistribute it and/or modify *
6
+ * it under the terms of the WTFPL 2.0 or later, see *
7
+ * http://www.wtfpl.net/about/ *
8
+ * *
9
+ * This program is distributed in the hope that it will be useful, *
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
12
+ * *
13
+ ***************************************************************************/
14
+ =end
15
+
16
+ PROGNAME = 'flnews_post_proc'
17
+ PROGVERSION = "1.7"
18
+ AUTHORS = "Michael Uplawski"
19
+ EMAIL = "michael.uplawski@uplawski.eu"
20
+ YEARS = "2023 - 2024"
21
+ SUMMARY = "Reads random signature from file"
22
+
data/lib/whiptail_dlg ADDED
@@ -0,0 +1,84 @@
1
+ #!/bin/bash
2
+
3
+ #/**************************************************************************
4
+ #* This program is free software; you can redistribute it and/or modify *
5
+ #* it under the terms of the WTFPL 2.0 or later, see *
6
+ #* http://www.wtfpl.net/about/ *
7
+ #* *
8
+ #* This program is distributed in the hope that it will be useful, *
9
+ #* but WITHOUT ANY WARRANTY; without even the implied warranty of *
10
+ #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
11
+ #* *
12
+ #***************************************************************************/
13
+
14
+ # A dialog to override configuration options.
15
+ # Whiptail is not as easily deployed here, as other dialogs.
16
+ # The main difficulty arises from the fact that positive defaults
17
+ # are negated, while a checklist wants to give positive results.
18
+
19
+ if [ $# -eq 0 ]
20
+ then
21
+ echo "ERROR: file-argument missing"
22
+ exit 1
23
+ fi
24
+ OUTFILE="$1"
25
+
26
+ # empty the file
27
+ truncate $OUTFILE -s0
28
+
29
+ TITLE="Override post-processor configuration"
30
+ CHECKTITLE="Deselect to disable. Esc or Cancel close the dialog and no changes will be applied."
31
+
32
+ # These are the configuration variables which can be unset.
33
+ VARS=(GROUP_SIGS CUSTOM_HEADERS NO_ARCHIVE_GROUPS VFY_URLS DEBUG_LOG)
34
+
35
+ # Checklist options
36
+ options=(GROUP_SIGS 'Signatures' ON CUSTOM_HEADERS 'Custom headers' ON NO_ARCHIVE_GROUPS 'No Archive' ON VFY_URLS 'Correct URLs' ON DEBUG_LOG 'Log' ON)
37
+
38
+ # show dialog and store results
39
+ result=$(whiptail --title "$TITLE" --checklist "$CHECKTITLE" 13 55 5 "${options[@]}" 3>&1 1>&2 2>&3)
40
+ # which button had been pushed?
41
+ okcancel=$?
42
+
43
+ # make an array
44
+ read -ra opts <<< $result
45
+
46
+ # comment out -------->
47
+ echo "cancel/ok ? $okcancel"
48
+ echo $result
49
+ echo "${opts[@]}"
50
+ echo "${#opts[@]}"
51
+ # <--------
52
+
53
+ # Find deselected options which shall be written to the outfile.
54
+ # Looks complicated.
55
+ if [ "$okcancel" -eq 0 ]
56
+ then
57
+ list=''
58
+ # check each available variable ...
59
+ for c in ${VARS[@]}
60
+ do
61
+ deactivate=TRUE
62
+ # ... against the result from the dialog
63
+ for o in ${opts[@]}
64
+ do
65
+ if [ "$o" == "\"$c\"" ]
66
+ then
67
+ # ignore if a variable remained checked ...
68
+ deactivate=FALSE
69
+ fi
70
+ done
71
+ # ... else write it to the list.
72
+ if [ "$deactivate" == TRUE ]
73
+ then
74
+
75
+ list="$list $c"
76
+ fi
77
+ done
78
+ # Heureka.
79
+ echo "$list" > "$OUTFILE"
80
+ else
81
+ echo "exit" > "$OUTFILE"
82
+ fi
83
+
84
+ # Ω
data/lib/yad_dlg ADDED
@@ -0,0 +1,53 @@
1
+ #!/bin/bash
2
+
3
+ #/**************************************************************************
4
+ #* This program is free software; you can redistribute it and/or modify *
5
+ #* it under the terms of the WTFPL 2.0 or later, see *
6
+ #* http://www.wtfpl.net/about/ *
7
+ #* *
8
+ #* This program is distributed in the hope that it will be useful, *
9
+ #* but WITHOUT ANY WARRANTY; without even the implied warranty of *
10
+ #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
11
+ #* *
12
+ #***************************************************************************/
13
+
14
+ # A dialog to override configuration options
15
+
16
+ TITLE="Override post-processor configuration"
17
+ # These are the configuration variables which can be
18
+ # unset.
19
+ GROUP_SIGS=1
20
+ CUSTOM_HEADERS=2
21
+ NO_ARCHIVE_GROUPS=3
22
+ #VFY_URLS=4
23
+ DEBUG_LOG=4
24
+
25
+ CONF=$(yad --item-separator=" " --title "$TITLE" --image="" --window-icon="" --form \
26
+ --field="Uncheck to disable options\n<b>Esc and Cancel</b> terminate the post-processor.":LBL ""\
27
+ --field="Signature":CHK 'true' \
28
+ --field="Custom-headers":CHK 'true' \
29
+ --field="No Archive":CHK 'true' \
30
+ --field="URL Correction":CHK 'true' \
31
+ --field="Log":CHK 'true')
32
+
33
+ if [ $? == 0 ]
34
+ then
35
+ IFS="|"
36
+ read -ra C_ARR <<< $CONF
37
+ CONF=''
38
+ # ------------->
39
+ # echo ${C_ARR[@]}
40
+ # <-------------
41
+
42
+ for i in GROUP_SIGS CUSTOM_HEADERS NO_ARCHIVE_GROUPS VFY_URLS DEBUG_LOG
43
+ do
44
+ if [ 'FALSE' == "${C_ARR[$i]}" ]
45
+ then
46
+ CONF="$i $CONF"
47
+ fi
48
+ done
49
+ # signal the fields to disable (others will be ignored)
50
+ echo $CONF
51
+ else
52
+ exit 1
53
+ fi
data/lib/zenity_dlg ADDED
@@ -0,0 +1,60 @@
1
+ #!/bin/bash
2
+
3
+ #/**************************************************************************
4
+ #* This program is free software; you can redistribute it and/or modify *
5
+ #* it under the terms of the WTFPL 2.0 or later, see *
6
+ #* http://www.wtfpl.net/about/ *
7
+ #* *
8
+ #* This program is distributed in the hope that it will be useful, *
9
+ #* but WITHOUT ANY WARRANTY; without even the implied warranty of *
10
+ #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
11
+ #* *
12
+ #***************************************************************************/
13
+
14
+ # A dialog to override configuration options
15
+
16
+ TITLE="Override post-processor configuration"
17
+ # The options are the configuration variables which can be unset.
18
+
19
+ CONF=$(zenity --title "$TITLE" --text "Deselect options to disable.\n<b>Esc and Cancel</b> terminate the post-processor."\
20
+ --height 450 --list --checklist --column 'set' --column 'Option' --column '' \
21
+ TRUE GROUP_SIGS Signature\
22
+ TRUE CUSTOM_HEADERS "Custom Headers"\
23
+ TRUE NO_ARCHIVE_GROUPS "No Archive"\
24
+ TRUE VFY_URLS "Correct URLs"\
25
+ TRUE DEBUG_LOG Log)
26
+
27
+ if [ $? == 0 ]
28
+ then
29
+ IFS="|"
30
+ read -ra C_ARR <<< $CONF
31
+ CONF=''
32
+ # ------------->
33
+ # echo ${C_ARR[@]}
34
+ # <-------------
35
+
36
+ # for c in GROUP_SIGS CUSTOM_HEADERS NO_ARCHIVE_GROUPS VFY_URLS DEBUG_LOG
37
+ for c in GROUP_SIGS CUSTOM_HEADERS NO_ARCHIVE_GROUPS DEBUG_LOG
38
+ do
39
+ # disable only the options which are missing in
40
+ # the Zenity return value
41
+ disable=1
42
+
43
+ for o in "${C_ARR[@]}"
44
+ do
45
+ if [ "$o" == "$c" ]
46
+ then
47
+ disable=
48
+ fi
49
+ done
50
+
51
+ if [ $disable ]
52
+ then
53
+ CONF="$CONF $c"
54
+ fi
55
+ done
56
+ # signal the fields to disable (others will be ignored)
57
+ echo $CONF
58
+ else
59
+ exit 1
60
+ fi
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flnews_post_proc
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.7'
5
+ platform: ruby
6
+ authors:
7
+ - Michael Uplawski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-12-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: diffy
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.4'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 3.4.2
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '3.4'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 3.4.2
33
+ - !ruby/object:Gem::Dependency
34
+ name: ruby-filemagic
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.7'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.7.3
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.7'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 0.7.3
53
+ description: Post-processor for Usenet-articles created in flnews
54
+ email: michael.uplawski@uplawski.eu
55
+ executables:
56
+ - flnews_post_proc
57
+ extensions: []
58
+ extra_rdoc_files: []
59
+ files:
60
+ - README.md
61
+ - bin/flnews_post_proc
62
+ - doc/fr/html/flnews_post_proc.html
63
+ - doc/fr/man/flnews_post_proc.1.gz
64
+ - doc/fr/pdf/flnews_post_proc.pdf
65
+ - doc/fr/rst/flnews_post_proc.rst
66
+ - doc/html/flnews_post_proc.html
67
+ - doc/license.txt
68
+ - doc/man/flnews_post_proc.1.gz
69
+ - doc/pdf/flnews_post_proc.pdf
70
+ - doc/rst/flnews_post_proc.rst
71
+ - lib/_quoting_style_regexp
72
+ - lib/basic_logging.rb
73
+ - lib/body.rb
74
+ - lib/color_output.rb
75
+ - lib/configuration.rb
76
+ - lib/flnews_post_proc.conf
77
+ - lib/flnews_post_proc.rb
78
+ - lib/headers.rb
79
+ - lib/newsgroups.rb
80
+ - lib/override.rb
81
+ - lib/ruby_dlg
82
+ - lib/version.rb
83
+ - lib/whiptail_dlg
84
+ - lib/yad_dlg
85
+ - lib/zenity_dlg
86
+ homepage: https://rubygems.org
87
+ licenses:
88
+ - Nonstandard
89
+ metadata: {}
90
+ post_install_message:
91
+ rdoc_options: []
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '3.0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubygems_version: 3.5.3
106
+ signing_key:
107
+ specification_version: 4
108
+ summary: Reads random signature from file
109
+ test_files: []