gtk2checkboxes 3.0.210824
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 +7 -0
- data/README.md +79 -0
- data/bin/gtk2checkboxes +12 -0
- data/data/logo.png +0 -0
- data/lib/gtk2checkboxes/config.rb +105 -0
- data/lib/gtk2checkboxes/gtk2checkboxes.rb +216 -0
- data/lib/gtk2checkboxes.rb +29 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3a3aa0e1c6fc4ebeceadfdb2c66cd1854f1080705e0c1f55ab5b9da208df1fb8
|
4
|
+
data.tar.gz: 5bda88fc508e53bf1073b8b1189ace648897d934d8d9cc9e55495a6ed73bd99b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dff60370ab48dcb29c090c9f96684a17e3276c54b7b131d9fcb00ada0b5287c9e0101354fb896431312622970250b8bbb1560b26adb29a934576473cffacf669
|
7
|
+
data.tar.gz: a46fd4cc94ce02045aad78650ed556f6bfba8545b70cf015fbdcfcfd0cd3cb0a081b12090ddd37d46fab0e5812d320904b33cc7d3e76b6e7813e928b40712fc2
|
data/README.md
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# Ruby-Gnome CheckBoxes
|
2
|
+
|
3
|
+
* [VERSION 3.0.210824](https://github.com/carlosjhr64/gtk2checkboxes/releases)
|
4
|
+
* [github](https://www.github.com/carlosjhr64/gtk2checkboxes)
|
5
|
+
* [rubygems](https://rubygems.org/gems/gtk2checkboxes)
|
6
|
+
|
7
|
+

|
8
|
+
|
9
|
+
## DESCRIPTION
|
10
|
+
|
11
|
+
Create a simple shopping list.
|
12
|
+
Maintain a check list of reacuring chores.
|
13
|
+
Anything that one would make a check list for.
|
14
|
+
|
15
|
+
Just a really simple app.
|
16
|
+
Allows for multiple lists.
|
17
|
+
|
18
|
+
## INSTALL
|
19
|
+
```shell
|
20
|
+
gem install gtk2checkboxes
|
21
|
+
```
|
22
|
+
## HELP
|
23
|
+
```shell
|
24
|
+
$ gtk2checkboxes --help
|
25
|
+
Usage:
|
26
|
+
gtk2checkboxes [:options+]
|
27
|
+
Options:
|
28
|
+
-h --help
|
29
|
+
-v --version
|
30
|
+
--minime Real minime
|
31
|
+
--notoggle Minime wont toggle decorated and keep above
|
32
|
+
--notdecorated Dont decorate window
|
33
|
+
```
|
34
|
+
## More
|
35
|
+
|
36
|
+
* Mouse button 1 on logo: minime
|
37
|
+
* Mouse button 2 on logo: app menu
|
38
|
+
* Toolbar "Edit" button opens the tasks markdown file with `gedit` by default
|
39
|
+
* Configuration file: `~/.config/gtk3app/gtk2checkboxes/config-*.rbon`
|
40
|
+
|
41
|
+
You can change your editor from `gedit` to something else in the configuration
|
42
|
+
file. The process should not detach(go to background). For example, I edited
|
43
|
+
my `Editor:` key from:
|
44
|
+
|
45
|
+
Editor: "gedit $cachefile",
|
46
|
+
|
47
|
+
to:
|
48
|
+
|
49
|
+
Editor: "foot -W 80x13 nvim $cachefile 2>/dev/null",
|
50
|
+
|
51
|
+
Note that the tasks cache file is markdown.
|
52
|
+
Any line that matches `/^- \[x| \] /` is considered to be a check box and
|
53
|
+
should be followed by an item to be checked off.
|
54
|
+
All other lines are ignored by the application.
|
55
|
+
|
56
|
+
## LICENSE
|
57
|
+
|
58
|
+
(The MIT License)
|
59
|
+
|
60
|
+
Copyright (c) 2021 CarlosJHR64
|
61
|
+
|
62
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
63
|
+
a copy of this software and associated documentation files (the
|
64
|
+
'Software'), to deal in the Software without restriction, including
|
65
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
66
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
67
|
+
permit persons to whom the Software is furnished to do so, subject to
|
68
|
+
the following conditions:
|
69
|
+
|
70
|
+
The above copyright notice and this permission notice shall be
|
71
|
+
included in all copies or substantial portions of the Software.
|
72
|
+
|
73
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
74
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
75
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
76
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
77
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
78
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
79
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/bin/gtk2checkboxes
ADDED
data/data/logo.png
ADDED
Binary file
|
@@ -0,0 +1,105 @@
|
|
1
|
+
class Gtk2CheckBoxes
|
2
|
+
using Rafini::String # String#semantic
|
3
|
+
extend Rafini::Empty # a0 and h0
|
4
|
+
|
5
|
+
CACHE = File.join UserSpace::XDG['cache'], 'gtk3app', 'gtk2checkboxes'
|
6
|
+
DATA_DIR = File.join UserSpace::XDG['data'], 'gtk3app', 'gtk2checkboxes'
|
7
|
+
|
8
|
+
CONFIG = {
|
9
|
+
DefaultTab: 'TODO',
|
10
|
+
Editor: 'gedit $cachefile',
|
11
|
+
HelpFile: 'https://github.com/carlosjhr64/gtk2checkboxes',
|
12
|
+
Logo: "#{DATA_DIR}/logo.png",
|
13
|
+
|
14
|
+
about_dialog: {
|
15
|
+
set_program_name: 'Gtk2CheckBoxes',
|
16
|
+
set_version: VERSION.semantic(0..1),
|
17
|
+
set_copyright: '(c) 2021 CarlosJHR64',
|
18
|
+
set_comments: 'A Ruby Gtk3App With Check-Boxes',
|
19
|
+
set_website: 'https://github.com/carlosjhr64/gtk2checkboxes',
|
20
|
+
set_website_label: 'See it at GitHub!',
|
21
|
+
},
|
22
|
+
|
23
|
+
DIALOG_ENTRY: a0,
|
24
|
+
dialog_entry: h0,
|
25
|
+
dialog_entry!: [:DIALOG_ENTRY, :dialog_entry],
|
26
|
+
|
27
|
+
ITEM_DIALOG: [title: 'Append Item'],
|
28
|
+
item_dialog: h0,
|
29
|
+
item_dialog!: [:ITEM_DIALOG, :item_dialog],
|
30
|
+
|
31
|
+
RENAME_DIALOG: [title: 'Raname Page'],
|
32
|
+
rename_dialog: h0,
|
33
|
+
rename_dialog!: [:RENAME_DIALOG, :rename_dialog],
|
34
|
+
|
35
|
+
ADD_DIALOG: [title: 'Add Page'],
|
36
|
+
add_dialog: h0,
|
37
|
+
add_dialog!: [:ADD_DIALOG, :add_dialog],
|
38
|
+
|
39
|
+
UNIQ_NAME: [title: 'Need one unique word:'],
|
40
|
+
uniq_name: h0,
|
41
|
+
uniq_name!: [:UNIQ_NAME, :uniq_name],
|
42
|
+
|
43
|
+
UNIQ_ITEM: [title: 'Need unique item:'],
|
44
|
+
uniq_item: h0,
|
45
|
+
uniq_item!: [:UNIQ_ITEM, :uniq_item],
|
46
|
+
|
47
|
+
DELETE_DIALOG: [title: 'Detete Page'],
|
48
|
+
delete_dialog: h0,
|
49
|
+
delete_dialog!: [:DELETE_DIALOG, :delete_dialog],
|
50
|
+
|
51
|
+
DELETE_LABEL: ['Are you sure?'],
|
52
|
+
delete_label: h0,
|
53
|
+
delete_label!: [:DELETE_LABEL, :delete_label],
|
54
|
+
|
55
|
+
window: {
|
56
|
+
set_title: 'Gtk2CheckBoxes',
|
57
|
+
set_window_position: :center,
|
58
|
+
},
|
59
|
+
|
60
|
+
NOTEBOOK: a0,
|
61
|
+
notebook: h0,
|
62
|
+
notebook!: [:NOTEBOOK, :notebook],
|
63
|
+
|
64
|
+
tab_label: h0,
|
65
|
+
|
66
|
+
VBOX: [:vertical],
|
67
|
+
vbox: {
|
68
|
+
into: [:append_page],
|
69
|
+
show: a0,
|
70
|
+
},
|
71
|
+
vbox!: [:VBOX, :vbox],
|
72
|
+
|
73
|
+
CHECKBUTTON: a0,
|
74
|
+
checkbutton: {show: a0},
|
75
|
+
checkbutton!: [:CHECKBUTTON, :checkbutton],
|
76
|
+
|
77
|
+
HBOX: [:horizontal],
|
78
|
+
hbox: h0,
|
79
|
+
hbox!: [:HBOX, :hbox],
|
80
|
+
|
81
|
+
APPEND_ITEM: [label: 'Append item'],
|
82
|
+
append_item: h0,
|
83
|
+
append_item!: [:APPEND_ITEM, :append_item],
|
84
|
+
|
85
|
+
EDIT_PAGE: [label: 'Edit'],
|
86
|
+
edit_page: h0,
|
87
|
+
edit_page!: [:EDIT_PAGE, :edit_page],
|
88
|
+
|
89
|
+
ADD_PAGE: [label: 'Add'],
|
90
|
+
add_page: h0,
|
91
|
+
add_page!: [:ADD_PAGE, :add_page],
|
92
|
+
|
93
|
+
RENAME_PAGE: [label: 'Rename'],
|
94
|
+
rename_page: h0,
|
95
|
+
rename_page!: [:RENAME_PAGE, :rename_page],
|
96
|
+
|
97
|
+
DELETE_PAGE: [label: 'Delete'],
|
98
|
+
delete_page: h0,
|
99
|
+
delete_page!: [:DELETE_PAGE, :delete_page],
|
100
|
+
|
101
|
+
app_menu: {
|
102
|
+
add_menu_item: [:minime!, :help!, :about!, :quit!],
|
103
|
+
},
|
104
|
+
}
|
105
|
+
end
|
@@ -0,0 +1,216 @@
|
|
1
|
+
class Gtk2CheckBoxes
|
2
|
+
class YesNo < Such::Dialog
|
3
|
+
def initialize(*par)
|
4
|
+
super(*par)
|
5
|
+
add_button Gtk::Stock::NO, Gtk::ResponseType::CANCEL
|
6
|
+
add_button Gtk::Stock::YES, Gtk::ResponseType::OK
|
7
|
+
end
|
8
|
+
|
9
|
+
def label(*par)
|
10
|
+
Such::Label.new child, *par
|
11
|
+
end
|
12
|
+
|
13
|
+
def yes?
|
14
|
+
show_all
|
15
|
+
response = run
|
16
|
+
destroy
|
17
|
+
response == Gtk::ResponseType::OK
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class EntryDialog < Such::Dialog
|
22
|
+
def initialize(*par)
|
23
|
+
super(*par)
|
24
|
+
add_button Gtk::Stock::CANCEL, Gtk::ResponseType::CANCEL
|
25
|
+
add_button Gtk::Stock::OK, Gtk::ResponseType::OK
|
26
|
+
end
|
27
|
+
|
28
|
+
def entry(*par)
|
29
|
+
@entry = Such::Entry.new child, *par
|
30
|
+
end
|
31
|
+
|
32
|
+
def text
|
33
|
+
show_all
|
34
|
+
text = (run == Gtk::ResponseType::OK)? @entry.text : nil
|
35
|
+
destroy
|
36
|
+
text
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def page
|
41
|
+
@notebook.children[@notebook.page]
|
42
|
+
end
|
43
|
+
|
44
|
+
def tab
|
45
|
+
@notebook.get_tab_label(page).text
|
46
|
+
end
|
47
|
+
|
48
|
+
def cachefile
|
49
|
+
File.join CACHE, tab+'.md'
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_check_button(vbox, text, status)
|
53
|
+
checkbutton = Such::CheckButton.new(
|
54
|
+
vbox,
|
55
|
+
{set_label: text, set_active: status},
|
56
|
+
:checkbutton!,
|
57
|
+
'toggled'
|
58
|
+
) do
|
59
|
+
x = checkbutton.active? ? 'x' : ' '
|
60
|
+
# Note that x was toggled, so the xbox is inverted for the matcher.
|
61
|
+
xbox = checkbutton.active? ? '- [ ]' : '- [x]'
|
62
|
+
matcher = "#{xbox} #{checkbutton.label}"
|
63
|
+
File.open(cachefile, 'r+') do |fh|
|
64
|
+
fh.each_line do |line|
|
65
|
+
if matcher == line.chomp
|
66
|
+
fh.seek(3-line.length, IO::SEEK_CUR)
|
67
|
+
fh.write x
|
68
|
+
break
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def populate_page(fn=cachefile, vbox=page)
|
76
|
+
File.open(fn, 'r') do |fh|
|
77
|
+
fh.each do |line|
|
78
|
+
line.chomp!
|
79
|
+
case line
|
80
|
+
when %r{^\- \[ \] (.*)$}
|
81
|
+
add_check_button vbox, $1, false
|
82
|
+
when %r{^\- \[x\] (.*)$}
|
83
|
+
add_check_button vbox, $1, true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def clear
|
90
|
+
page.each do |item|
|
91
|
+
page.remove item
|
92
|
+
item.destroy
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def reload
|
97
|
+
clear
|
98
|
+
populate_page
|
99
|
+
end
|
100
|
+
|
101
|
+
def delete
|
102
|
+
clear
|
103
|
+
# Notebook requires at least one page
|
104
|
+
if @notebook.children.length > 1
|
105
|
+
@notebook.remove_page @notebook.page
|
106
|
+
else
|
107
|
+
FileUtils.touch cachefile
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def set_tab_text(text)
|
112
|
+
@notebook.get_tab_label(page).set_text text
|
113
|
+
end
|
114
|
+
|
115
|
+
def tab_exist?(text)
|
116
|
+
@notebook.children.each do |page|
|
117
|
+
return true if text == @notebook.get_tab_label(page).text
|
118
|
+
end
|
119
|
+
return false
|
120
|
+
end
|
121
|
+
|
122
|
+
def get_new_page_name(dialog_key)
|
123
|
+
loop do
|
124
|
+
dialog = EntryDialog.new dialog_key
|
125
|
+
dialog.entry :dialog_entry!
|
126
|
+
Gtk3App.transient dialog
|
127
|
+
text = dialog.text
|
128
|
+
return text if text.nil? or (/^\w+$/.match? text and not tab_exist? text)
|
129
|
+
dialog_key = :uniq_name!
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def item_exist?(text)
|
134
|
+
page.each do |checkbutton|
|
135
|
+
return true if checkbutton.label == text
|
136
|
+
end
|
137
|
+
return false
|
138
|
+
end
|
139
|
+
|
140
|
+
def get_new_item(dialog_key)
|
141
|
+
loop do
|
142
|
+
dialog = EntryDialog.new dialog_key
|
143
|
+
dialog.entry :dialog_entry!
|
144
|
+
Gtk3App.transient dialog
|
145
|
+
text = dialog.text
|
146
|
+
return text unless item_exist? text
|
147
|
+
dialog_key = :uniq_item!
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def append(text)
|
152
|
+
File.open(cachefile, 'a'){_1.puts '- [ ] '+text}
|
153
|
+
end
|
154
|
+
|
155
|
+
def add_page(fn, populate:false, touch:false)
|
156
|
+
label = File.basename fn, '.*'
|
157
|
+
vbox = Such::Box.new @notebook, :vbox!
|
158
|
+
@notebook.set_tab_label vbox, Such::Label.new([label], :tab_label)
|
159
|
+
populate_page(fn, vbox) if populate and File.exist? fn
|
160
|
+
FileUtils.touch File.join(CACHE, label+'.md') if touch
|
161
|
+
end
|
162
|
+
|
163
|
+
def initialize(stage, toolbar, options)
|
164
|
+
@notebook = Such::Notebook.new stage, :notebook!
|
165
|
+
Find.find(CACHE) do |fn|
|
166
|
+
Find.prune if !(fn==CACHE) && File.directory?(fn)
|
167
|
+
case fn
|
168
|
+
when %r{/\w+\.md$}
|
169
|
+
add_page fn, populate:true
|
170
|
+
when %r{/\w+\.md\.bak$}
|
171
|
+
File.unlink fn
|
172
|
+
end
|
173
|
+
end
|
174
|
+
add_page CONFIG[:DefaultTab], touch:true if @notebook.children.empty?
|
175
|
+
@tools = Such::Box.new toolbar, :hbox!
|
176
|
+
Such::Button.new @tools, :append_item! do
|
177
|
+
if item = get_new_item(:item_dialog!)
|
178
|
+
append item
|
179
|
+
add_check_button page, item, false
|
180
|
+
end
|
181
|
+
end
|
182
|
+
Such::Button.new @tools, :edit_page! do
|
183
|
+
start = Time.now
|
184
|
+
system CONFIG[:Editor].sub('$cachefile', cachefile)
|
185
|
+
reload if File.mtime(cachefile) > start
|
186
|
+
end
|
187
|
+
Such::Button.new @tools, :rename_page! do
|
188
|
+
if text = get_new_page_name(:rename_dialog!)
|
189
|
+
File.rename cachefile, File.join(CACHE, text+'.md')
|
190
|
+
set_tab_text text
|
191
|
+
end
|
192
|
+
end
|
193
|
+
Such::Button.new @tools, :add_page! do
|
194
|
+
if text = get_new_page_name(:add_dialog!)
|
195
|
+
add_page text, touch:true
|
196
|
+
end
|
197
|
+
end
|
198
|
+
Such::Button.new @tools, :delete_page! do
|
199
|
+
dialog = YesNo.new :delete_dialog!
|
200
|
+
dialog.label :delete_label!
|
201
|
+
Gtk3App.transient dialog
|
202
|
+
if dialog.yes?
|
203
|
+
File.rename cachefile, cachefile+'.bak'
|
204
|
+
delete
|
205
|
+
end
|
206
|
+
end
|
207
|
+
Gtk3App.logo_press_event do |button|
|
208
|
+
case button
|
209
|
+
when 1
|
210
|
+
Gtk3App.minime!
|
211
|
+
# When 2 Nothing
|
212
|
+
# When 3 gets captured by Gtk3App's main menu
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Gtk2CheckBoxes
|
2
|
+
HELP = <<~HELP
|
3
|
+
Usage:
|
4
|
+
gtk2checkboxes [:options+]
|
5
|
+
Options:
|
6
|
+
-h --help
|
7
|
+
-v --version
|
8
|
+
--minime \t Real minime
|
9
|
+
--notoggle \t Minime wont toggle decorated and keep above
|
10
|
+
--notdecorated\t Dont decorate window
|
11
|
+
HELP
|
12
|
+
VERSION = '3.0.210824'
|
13
|
+
|
14
|
+
def self.run
|
15
|
+
# StdLib
|
16
|
+
require 'find'
|
17
|
+
require 'fileutils'
|
18
|
+
# Gems
|
19
|
+
require 'gtk3app'
|
20
|
+
# This Gem
|
21
|
+
require_relative 'gtk2checkboxes/config.rb'
|
22
|
+
require_relative 'gtk2checkboxes/gtk2checkboxes.rb'
|
23
|
+
# Run
|
24
|
+
Gtk3App.run(klass:Gtk2CheckBoxes)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
# Requires:
|
28
|
+
#`ruby`
|
29
|
+
#`gedit`
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gtk2checkboxes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.0.210824
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- carlosjhr64
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-08-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: gtk3app
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.1'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 5.1.210203
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '5.1'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 5.1.210203
|
33
|
+
description: |
|
34
|
+
Create a simple shopping list.
|
35
|
+
Maintain a check list of reacuring chores.
|
36
|
+
Anything that one would make a check list for.
|
37
|
+
|
38
|
+
Just a really simple app.
|
39
|
+
Allows for multiple lists.
|
40
|
+
email: carlosjhr64@gmail.com
|
41
|
+
executables:
|
42
|
+
- gtk2checkboxes
|
43
|
+
extensions: []
|
44
|
+
extra_rdoc_files: []
|
45
|
+
files:
|
46
|
+
- README.md
|
47
|
+
- bin/gtk2checkboxes
|
48
|
+
- data/logo.png
|
49
|
+
- lib/gtk2checkboxes.rb
|
50
|
+
- lib/gtk2checkboxes/config.rb
|
51
|
+
- lib/gtk2checkboxes/gtk2checkboxes.rb
|
52
|
+
homepage: https://github.com/carlosjhr64/gtk2checkboxes
|
53
|
+
licenses:
|
54
|
+
- MIT
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements:
|
71
|
+
- 'ruby: ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]'
|
72
|
+
- 'gedit: gedit - Version 40.1'
|
73
|
+
rubygems_version: 3.2.22
|
74
|
+
signing_key:
|
75
|
+
specification_version: 4
|
76
|
+
summary: Create a simple shopping list. Maintain a check list of reacuring chores.
|
77
|
+
Anything that one would make a check list for.
|
78
|
+
test_files: []
|