nowfocus 0.5.0__py3-none-any.whl → 0.5.2__py3-none-any.whl

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.
nowfocus/__main__.py CHANGED
@@ -62,13 +62,12 @@ class Application(Gtk.Application):
62
62
 
63
63
  try:
64
64
 
65
-
66
-
67
65
  self.window = None
68
66
 
69
67
  self.is_running = False
70
68
  self.device_in_use = True
71
69
  self.UserIdleTime = UserIdleTime()
70
+ dbg('self.UserIdleTime.platform', self.UserIdleTime.platform,s='user_away')
72
71
  self.last_user_idle_check_time = None
73
72
  self.session = default_session()
74
73
 
@@ -111,6 +110,7 @@ class Application(Gtk.Application):
111
110
  Gtk.main()
112
111
  except Exception as e:
113
112
  print(conf.app_name +' had a pretty bad error. Please submit the following trace as an issue on the git repo or email it to the developers ')
113
+ print(e)
114
114
  traceback.print_tb(e.__traceback__)
115
115
  self.quit()
116
116
 
nowfocus/settings.py CHANGED
@@ -105,6 +105,44 @@ class SettingsWindow(Gtk.Window):
105
105
  self.add(self.notebook)
106
106
 
107
107
 
108
+
109
+
110
+
111
+ # Settings
112
+ row = 0
113
+ grid = Gtk.Grid()
114
+ grid.set_row_spacing(10)
115
+ grid.set_column_spacing(10)
116
+ self.notebook.append_page(grid,Gtk.Label('Settings'))
117
+
118
+
119
+ grid.attach(Gtk.Box(border_width=10),0,(row:=row+1),5,1) # Spacer
120
+
121
+ grid.attach(self.settings_updater('default_text','What am I Doing?','Entry'),0,(row:=row+1),5,1)
122
+
123
+ grid.attach(self.settings_updater('open_task_window_fullscreen',True,'Switch'),0,(row:=row+1),5,1)
124
+ grid.attach(self.settings_updater('show_task_window_sidebars',True,'Switch'),0,(row:=row+1),5,1)
125
+
126
+ grid.attach(self.settings_updater('pomodoro_interval',25,'SpinButton',"(minutes)"),0,(row:=row+1),5,1)
127
+
128
+ grid.attach(self.settings_updater('randomness_interrupt_interval', 3, 'SpinButton',"\nPop up todo menu every so many minutes if not doing a task"),0,(row:=row+1),5,1)
129
+
130
+ grid.attach(self.settings_updater('todolist_refresh_interval', 3, 'SpinButton',"(hours)"),0,(row:=row+1),5,1)
131
+
132
+
133
+ # grid.attach(self.settings_updater('invoice_hourly_rate', 33, 'SpinButton',""),0,(row:=row+1),5,1)
134
+
135
+ grid.attach(self.settings_updater('hours_search_timeframe', 'auto', 'ComboBoxText',"\nDefault timetracking range for hours shown in main window and invoicing", options = list(hours_search_timeframes().keys())),0,(row:=row+1),5,1)
136
+
137
+ grid.attach(self.settings_updater('prompts', None, 'TextView',""),0,(row:=row+1),5,1)
138
+
139
+ grid.attach(self.settings_updater('display_todolist_as_top_level_list', 'auto', 'ComboBoxText',"", options = ['auto','always','never']),0,(row:=row+1),5,1)
140
+
141
+ grid.attach(self.settings_updater('max_top_level_menu_items', 18, 'SpinButton',""),0,(row:=row+1),5,1)
142
+
143
+
144
+
145
+
108
146
  row = 0
109
147
  grid = Gtk.Grid()
110
148
  grid.set_row_spacing(10)
@@ -113,7 +151,6 @@ class SettingsWindow(Gtk.Window):
113
151
 
114
152
  self.notebook.append_page(grid,Gtk.Label('Todolists and Time Trackers'))
115
153
 
116
-
117
154
  sub_head = Gtk.Label()
118
155
  sub_head.set_markup("<b>Todo Lists</b>")
119
156
  grid.attach(sub_head,0,(row:=row+1),5,1)
@@ -187,42 +224,6 @@ class SettingsWindow(Gtk.Window):
187
224
 
188
225
 
189
226
 
190
- # Settings
191
- row = 0
192
- grid = Gtk.Grid()
193
- grid.set_row_spacing(10)
194
- grid.set_column_spacing(10)
195
- self.notebook.append_page(grid,Gtk.Label('Settings'))
196
-
197
-
198
- grid.attach(Gtk.Box(border_width=10),0,(row:=row+1),5,1) # Spacer
199
-
200
- grid.attach(self.settings_updater('default_text','What am I Doing?','Entry'),0,(row:=row+1),5,1)
201
-
202
- grid.attach(self.settings_updater('open_task_window_fullscreen',True,'Switch'),0,(row:=row+1),5,1)
203
- grid.attach(self.settings_updater('show_task_window_sidebars',True,'Switch'),0,(row:=row+1),5,1)
204
-
205
- grid.attach(self.settings_updater('pomodoro_interval',25,'SpinButton',"(minutes)"),0,(row:=row+1),5,1)
206
-
207
- grid.attach(self.settings_updater('randomness_interrupt_interval', 3, 'SpinButton',"\nPop up todo menu every so many minutes if not doing a task"),0,(row:=row+1),5,1)
208
-
209
- grid.attach(self.settings_updater('todolist_refresh_interval', 3, 'SpinButton',"(hours)"),0,(row:=row+1),5,1)
210
-
211
-
212
- # grid.attach(self.settings_updater('invoice_hourly_rate', 33, 'SpinButton',""),0,(row:=row+1),5,1)
213
-
214
- grid.attach(self.settings_updater('hours_search_timeframe', 'auto', 'ComboBoxText',"\nDefault timetracking range for hours shown in main window and invoicing", options = list(hours_search_timeframes().keys())),0,(row:=row+1),5,1)
215
-
216
- grid.attach(self.settings_updater('prompts', None, 'TextView',""),0,(row:=row+1),5,1)
217
-
218
- grid.attach(self.settings_updater('display_todolist_as_top_level_list', 'auto', 'ComboBoxText',"", options = ['auto','always','never']),0,(row:=row+1),5,1)
219
-
220
- grid.attach(self.settings_updater('max_top_level_menu_items', 18, 'SpinButton',""),0,(row:=row+1),5,1)
221
-
222
-
223
-
224
-
225
-
226
227
 
227
228
 
228
229
  # Task Commands notebook page
nowfocus/task_window.py CHANGED
@@ -141,7 +141,7 @@ class TaskWindow(Gtk.Window):
141
141
  self.center_box.pack_start(self.scrolled_window, True, True, 0)
142
142
  self.scrolled_window.set_size_request(-1, 350)
143
143
 
144
- self.scrolled_window.connect('scroll-event', self.on_scroll) # This doesn't catch scrollbar moves
144
+ # self.scrolled_window.connect('scroll-event', self.on_scroll) # This doesn't catch scrollbar moves
145
145
  self.scrolled_window.connect('edge-reached', self.on_scroll) # This is a little late and may not fire if the list is short?
146
146
 
147
147
  self.tasks_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=7)
@@ -153,6 +153,7 @@ class TaskWindow(Gtk.Window):
153
153
  self.total_duration_label.set_margin_end(12)
154
154
  self.total_duration_label.get_style_context().add_class('subtle')
155
155
  self.total_duration_label.set_halign(Gtk.Align.END)
156
+ # self.total_duration_label.connect("button-press-event",self.timesheet_to_clipboard) // doesn't work
156
157
  self.task_entry_overlay.add_overlay(self.total_duration_label)
157
158
 
158
159
  # Cool but captures the up/down selection
@@ -408,8 +409,10 @@ class TaskWindow(Gtk.Window):
408
409
 
409
410
  self.l_sidebar.add(choose_from_lists(self.select_list_callback, 'None', None, False))
410
411
 
411
- self.SessionEditDialog = SessionEditDialog # passed to show_sessions
412
- show_sessions(None, self, self.sessions_box, None, 'start_time', '30',None, 30)
412
+ self.SessionEditDialog = SessionEditDialog # passed to show_sessions via self
413
+ sidebar_sessions = get_sessions(use_sessions_timeframe_setting=False)
414
+
415
+ show_sessions(None, self, self.sessions_box, None, passed_sessions=sidebar_sessions, truncate_labels_to_chars=30)
413
416
 
414
417
  self.l_sidebar.show_all()
415
418
  self.r_sidebar.show_all()
@@ -435,11 +438,12 @@ class TaskWindow(Gtk.Window):
435
438
 
436
439
 
437
440
  def task_search(self,widget = None):
438
-
441
+ timeit()
439
442
  self.tasks_box.foreach(lambda child: child.destroy())
440
443
  self.shown_tasks.clear()
441
444
 
442
445
  self.search_term = self.taskEntry.get_text()
446
+ # print('taskwindow search start: ', self.search_term)
443
447
 
444
448
  if self.search_term in self.search_cache:
445
449
  tasks = self.search_cache[self.search_term]
@@ -465,11 +469,17 @@ class TaskWindow(Gtk.Window):
465
469
  self.tasks_box.show_all()
466
470
 
467
471
  self.total_duration_label.set_markup('<b>'+str(round(total_duration / 60 / 60,1))+'</b> hrs\n'+conf.user['hours_search_timeframe'] )
472
+ # print('taskwindow search done')
473
+ timeit()
468
474
 
469
475
 
470
476
  def add_task_to_window(self,t):
471
477
 
472
478
  try:
479
+ if not t['extended_label']:
480
+ utils.dbg("add_task_to_list no extended_label is missing.", t, s='taskwindow',l=1)
481
+ return False
482
+
473
483
  utils.dbg("add_task_to_list "+ str(t['extended_label']), "status",t['status'], s='taskwindow',l=3)
474
484
 
475
485
  self.shown_tasks[t['id']] = Gtk.MenuButton(popover=self.task_rclick_menu)
@@ -479,7 +489,7 @@ class TaskWindow(Gtk.Window):
479
489
 
480
490
  label = Gtk.Label()
481
491
 
482
- extended_label = GLib.markup_escape_text(t['extended_label'],)
492
+ extended_label = GLib.markup_escape_text(t['extended_label'])
483
493
 
484
494
  if len(extended_label) > 110:
485
495
  extended_label = extended_label[:110]+"..."
@@ -511,10 +521,12 @@ class TaskWindow(Gtk.Window):
511
521
  button.connect("activate", self.select_task, None, t['id'])
512
522
  button.set_relief(Gtk.ReliefStyle.NONE)
513
523
  self.tasks_box.add(button)
524
+ return True
514
525
 
515
526
 
516
527
  except Exception as e:
517
528
  utils.dbg("Error adding task to list"+ str(t['extended_label']), t, e, l=0, s='taskwindow')
529
+ return False
518
530
 
519
531
 
520
532
  def select_task(self,widget,event=None,tid=None):
@@ -17,7 +17,7 @@ class UserIdleTime():
17
17
  else:
18
18
  self.detect_platform()
19
19
 
20
- print('UserIdleTime platform set to',self.platform)
20
+ # print('UserIdleTime platform set to',self.platform)
21
21
 
22
22
  def get (self) :
23
23
  ''' Returns int of seconds since user was active '''
nowfocus/utils.py CHANGED
@@ -56,7 +56,11 @@ def dbg(*data, s="", l=2, e=None, notify=None):
56
56
  if system:
57
57
  system = "- "+system
58
58
 
59
- print(json.dumps(data,indent=2), system+" "+levels[level])
59
+ try:
60
+ print(json.dumps(data,indent=2), system+" "+levels[level])
61
+ except:
62
+ print(data)
63
+
60
64
 
61
65
  # else:
62
66
  # print("Not displaying dbg s:",system,'conf.debug_systems',conf.debug_systems)
@@ -64,6 +68,7 @@ def dbg(*data, s="", l=2, e=None, notify=None):
64
68
 
65
69
  if e and isinstance(e,Exception):
66
70
  traceback.print_tb(e.__traceback__)
71
+ print(e)
67
72
 
68
73
  def error_notice(title, details = None, e = None):
69
74
  print('ERROR',title,details,e)
@@ -433,7 +438,8 @@ def reindex(t=None):
433
438
 
434
439
 
435
440
  def reindex_all():
436
-
441
+ timeit()
442
+ # print('reindex start')
437
443
  db_query("DROP TABLE IF EXISTS taskindex",None,None,0)
438
444
  db_query("CREATE VIRTUAL TABLE taskindex USING fts5(id, extended_label, priority, status)")
439
445
  db_query("INSERT INTO taskindex(id, extended_label, priority, status) SELECT id, extended_label, priority, status FROM tasks WHERE tasks.status IS NOT '-1' ")
@@ -442,6 +448,9 @@ def reindex_all():
442
448
  db_query("UPDATE taskindex set priority = ? WHERE id = ?",(t['priority'],t['id']))
443
449
 
444
450
  db_query("REPLACE INTO system(field, value) VALUES(?,?)",('taskindex_update_time',now().strftime("%Y-%m-%d %H:%M:%S")))
451
+ # print('reindex done')
452
+ timeit()
453
+
445
454
  return True
446
455
 
447
456
 
@@ -811,7 +820,7 @@ def get_sessions(conditions_sql = None, order_by = 'start_time', limit = 35, use
811
820
  return db_query(" SELECT * FROM sessions WHERE 1=1 "+conditions+" ORDER BY "+order_by+" DESC LIMIT ? ",(limit,))
812
821
 
813
822
 
814
- def show_sessions(widget = None, self = None, sessions_box = None, label_text = "Most Recent Sessions", order_by = 'start_time', limit = 35, passed_sessions = None, truncate = None ):
823
+ def show_sessions(widget = None, self = None, sessions_box = None, label_text = "Most Recent Sessions", order_by = 'start_time', limit = 35, passed_sessions = None, truncate_labels_to_chars = None ):
815
824
 
816
825
  sessions_box.foreach(lambda child: child.destroy())
817
826
 
@@ -833,10 +842,10 @@ def show_sessions(widget = None, self = None, sessions_box = None, label_text =
833
842
 
834
843
  for ls in sessions:
835
844
  dbg('Add session to session_box',ls['extended_label'],s='settings')
836
- if truncate:
845
+ if truncate_labels_to_chars:
837
846
  label = ls['extended_label'].split('>')[-1].strip()
838
- if len(label) > truncate:
839
- label = label[:truncate]+'…'
847
+ if len(label) > truncate_labels_to_chars:
848
+ label = label[:truncate_labels_to_chars]+'…'
840
849
  btn = Gtk.Button(label=label+' '+str(sec_to_time(ls['duration'])))
841
850
  else:
842
851
  btn = Gtk.Button(label=ls['extended_label']+' '+str(sec_to_time(ls['duration'])))
@@ -893,9 +902,9 @@ def get_total_time(id, category = 'tasks', start_time = None, end_time = None, g
893
902
 
894
903
  def get_percent_time_focused():
895
904
 
896
- rand_seconds = db_query("SELECT SUM(duration) as seconds FROM sessions WHERE sessions.task_id = 'Randomness' AND "+ sessions_timeframe_sql())[0]['seconds']
905
+ rand_seconds = force_number(db_query("SELECT SUM(duration) as seconds FROM sessions WHERE sessions.task_id = 'Randomness' AND "+ sessions_timeframe_sql())[0]['seconds'])
897
906
 
898
- focus_seconds = db_query("SELECT SUM(duration) as seconds FROM sessions WHERE sessions.task_id != 'Randomness' AND "+ sessions_timeframe_sql())[0]['seconds']
907
+ focus_seconds = force_number(db_query("SELECT SUM(duration) as seconds FROM sessions WHERE sessions.task_id != 'Randomness' AND "+ sessions_timeframe_sql())[0]['seconds'])
899
908
 
900
909
  percent = round(divide(focus_seconds,(focus_seconds + rand_seconds)) * 100)
901
910
 
@@ -905,9 +914,9 @@ def get_percent_time_focused():
905
914
 
906
915
  def get_percent_time_priority():
907
916
 
908
- priority_seconds = db_query("SELECT SUM(duration) as seconds FROM sessions WHERE sessions.task_id = 'Randomness' AND "+ sessions_timeframe_sql())[0]['seconds']
917
+ priority_seconds = force_number(db_query("SELECT SUM(duration) as seconds FROM sessions WHERE sessions.task_id = 'Randomness' AND "+ sessions_timeframe_sql())[0]['seconds'])
909
918
 
910
- total_seconds = db_query("SELECT SUM(duration) as seconds FROM sessions WHERE "+ sessions_timeframe_sql())[0]['seconds']
919
+ total_seconds = force_number(db_query("SELECT SUM(duration) as seconds FROM sessions WHERE "+ sessions_timeframe_sql())[0]['seconds'])
911
920
 
912
921
  percent = round(divide(priority_seconds,(total_seconds)) * 100)
913
922
 
@@ -1170,6 +1179,11 @@ def choose_from_lists(callback, selected_list_id = None, session = None, accepts
1170
1179
 
1171
1180
  if accepts_tasks:
1172
1181
  where += " AND data like '%\"accepts_tasks\": true%' "
1182
+ else:
1183
+ # HACK: to not show op level lists
1184
+ # TODO: think of a better way
1185
+ where += " AND parent_label != '' "
1186
+
1173
1187
 
1174
1188
  lists = db_query("SELECT * FROM lists "+where+" ORDER BY todolist, extended_label ASC ", None, 'id')
1175
1189
 
@@ -1182,12 +1196,15 @@ def choose_from_lists(callback, selected_list_id = None, session = None, accepts
1182
1196
  button_group = Gtk.RadioButton(label=l['label'])
1183
1197
  item = button_group
1184
1198
  else:
1185
- item = Gtk.RadioButton(label=l['extended_label'], group=button_group)
1199
+ indent = len(get_lists_for_item(l)['ids'])
1200
+ label = f'{" " * indent}' + l['label']
1201
+ item = Gtk.RadioButton(label=GLib.markup_escape_text(label), group=button_group)
1186
1202
 
1187
1203
  if todolist != l['todolist']:
1188
1204
  # new buttongroup for new todolist
1189
1205
  todolist = l['todolist']
1190
1206
  l['header'] = Gtk.Label()
1207
+
1191
1208
  try:
1192
1209
  l['header'].set_markup("<b>"+conf.user['todolists'][todolist]["label"]+"</b>")
1193
1210
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nowfocus
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: nowfocus: the open source task-tracking self-control panel.
5
5
  Author: AltruistEnterprises
6
6
  Project-URL: Homepage, https://www.nowfocus.org
@@ -173,7 +173,7 @@ Open nowfocus **Settings** from the indicator menu or tasks window and connect y
173
173
  git clone https://codeberg.org/AltruistEnterprises/nowfocus.git
174
174
  cd nowfocus
175
175
  python3 -m venv .venv/nowfocus-build
176
- source .venv/nowfocus-build/bin/activate
176
+ source .venv/nowfocus-build/bin/activate
177
177
  pip install -r build-requirements.txt
178
178
  python3 -m build
179
179
  pipx install -e --force YOUR_INSTALL_PATH
@@ -1,5 +1,5 @@
1
1
  nowfocus/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
2
- nowfocus/__main__.py,sha256=pJhJsaKUFVbXTjZiQBxHZJ_aIcxkkVzm-FIhITtfc_Y,33014
2
+ nowfocus/__main__.py,sha256=kIJy1gd2FIZkXNqLdUYhjU7OSBKLYarieSw7f9PQA4U,33097
3
3
  nowfocus/conf.py,sha256=KV0iouYSSpYUITLlG-lPvmk1sHFVQsykwqmvb9wyTdk,6693
4
4
  nowfocus/example-todo.txt,sha256=o-ZRNiTlSGFbTK9jpdDIi07qHBrpvP0JhBZSk0VlpQU,246
5
5
  nowfocus/install.py,sha256=tcds4l6b492HTC7DfapatafgeMmDWvBfy8nwi1CjFXk,3040
@@ -7,11 +7,11 @@ nowfocus/new_task_dialog.py,sha256=GG49tOAwXiUKAHeaKnCG8Q3SZlL5pJijRZEcSjMwQng,4
7
7
  nowfocus/session_edit_dialog.py,sha256=V2QWSdNaxsQHRcG28CJBQM2sa45m5RNcu_suQF26mkM,6912
8
8
  nowfocus/session_options.py,sha256=mOnyEM3-usKgVvBhESY0TNBcy4FTG-AHP6ETMgB1fQ4,5071
9
9
  nowfocus/sessions.csv,sha256=kYpr06yQg_J86NQ4AiYw4RnQchcw3ouPKVYa1lYDUNo,39
10
- nowfocus/settings.py,sha256=Ufabuqd90tTDlzXB68jsbDz7233CEMsjnmPzaTSEHLI,35150
10
+ nowfocus/settings.py,sha256=CZoSpFacxAs99Nq-NXNDKiBqjPSLPwg8bL5hcsi2a6E,35151
11
11
  nowfocus/styles.css,sha256=PG1SrLkwSSay8M2VKeRcE0UdK54ndsEDFnRLRkmP-9M,510
12
- nowfocus/task_window.py,sha256=FgmjAIJqDJXAx2WkkAeTFSE3O0uednHSHh2j2v60Rdo,28478
13
- nowfocus/user_idle_time.py,sha256=kPZ_bhoBdVMIBJXn2602FUfS4r-u8FnTq5Ze9D5QfHE,2363
14
- nowfocus/utils.py,sha256=3oDo6F46F4j060wkQuhHCMvX4Ui_RNc1QSBE5JessAQ,50024
12
+ nowfocus/task_window.py,sha256=Ypt3s8czczeoMTsAMbPW_zpFJlQq4uBU5x0ankPnZlg,29071
13
+ nowfocus/user_idle_time.py,sha256=I44Ip-iGGzWAiHnM2_06jNqhCne9y1SbvcBI-nYBolU,2365
14
+ nowfocus/utils.py,sha256=Es62GSorb_48ZkD9ppkMXE2TLoAYXev6wTRNMn6Ps6g,50551
15
15
  nowfocus/version_migrator.py,sha256=q8T1C8-DLOwUQUM5IPcMjPbVbsLTO4VsqADlAAXd9gw,628
16
16
  nowfocus/connectors/activitywatch.py,sha256=QbkOmjIOiVwccWc2xhhePd0Abww5vEiVpCNjeqOyYGg,921
17
17
  nowfocus/connectors/caldav.py,sha256=PeM_9yJC8W17L8Y5AyS75o6GfzTrPoMYKIvetND8T78,5089
@@ -52,9 +52,9 @@ nowfocus/icon/settings.svg,sha256=fgkGJouPPtZLxZn2nr_5pEp9MdhRSRaW9mtdxhJHDuQ,39
52
52
  nowfocus/sound/bell-xylophone-g.mp3,sha256=1OBcRWvD87AGNcq1uZFR8HqG0nanJykImERfVDVxHD4,53891
53
53
  nowfocus/sound/dinner-bell.mp3,sha256=hjjO0xqA4uXpYw9KLwwlBnrVfRhVq1K5OXzwlMXhRn4,113620
54
54
  nowfocus/sound/xylophone-chord.mp3,sha256=gwgBSqhMt5PMzT5N03Z6TvDgipQZfnkEz_o81Rq5Z1U,131806
55
- nowfocus-0.5.0.dist-info/licenses/LICENSE,sha256=fSJzoHs1EOCwEd7FIyokFeGEma7NKmTVEdHkCr5OIV4,35127
56
- nowfocus-0.5.0.dist-info/METADATA,sha256=OxqZcEYVb9dL-XLuMppeH3jC3DAeFzwnEpBB-ZntrIw,6805
57
- nowfocus-0.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
58
- nowfocus-0.5.0.dist-info/entry_points.txt,sha256=RbYY19-irSoNVglNeNnL9D36cHft7aKsaEGEYoSH3pA,51
59
- nowfocus-0.5.0.dist-info/top_level.txt,sha256=3uLd9BwmfarZwqVUxkSJuVwJ8qHzjThte8rt_UYG7tE,9
60
- nowfocus-0.5.0.dist-info/RECORD,,
55
+ nowfocus-0.5.2.dist-info/licenses/LICENSE,sha256=fSJzoHs1EOCwEd7FIyokFeGEma7NKmTVEdHkCr5OIV4,35127
56
+ nowfocus-0.5.2.dist-info/METADATA,sha256=XxURJnrYxGV_5p9sq4Px_k4VB7-PJ-zfOwG-K-S_jEE,6804
57
+ nowfocus-0.5.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
58
+ nowfocus-0.5.2.dist-info/entry_points.txt,sha256=RbYY19-irSoNVglNeNnL9D36cHft7aKsaEGEYoSH3pA,51
59
+ nowfocus-0.5.2.dist-info/top_level.txt,sha256=3uLd9BwmfarZwqVUxkSJuVwJ8qHzjThte8rt_UYG7tE,9
60
+ nowfocus-0.5.2.dist-info/RECORD,,