todo-jsonl 0.1.11 → 0.1.12
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 +4 -4
 - data/bin/todo.rb +47 -22
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: bb612ac4efe61a2da25f5438e4e158612ca1d1837484a5338d8768e527fd9e71
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: '079821ed0936b0a250133b18304a1110d59b3fa5f5e008c228ae4c9d01a98799'
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: d6a531a29f85db3d3af7baa47f4b26485639db66eebbe028d3327375ff0ebf5d68958a6713a82bb6ae10c3e5beb305d374273ccc82529e4eccc4c0494bfec95f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 250acb20cb6edf8b5cfac5fc3b568f5cfc2f72245e0884618c7d8143c5a63e81bed6dfa699aa833d4fc96bff9ac62475e2f65647c3e3f9f342725b623d0101b5
         
     | 
    
        data/bin/todo.rb
    CHANGED
    
    | 
         @@ -69,6 +69,9 @@ DUE_DATE_DAYS = NEXT_7_DAYS.map do |day| day.strftime('%A').downcase end 
     | 
|
| 
       69 
69 
     | 
    
         
             
            DUE_DATES_FOR_QUERIES = NEXT_7_DAYS.map do |day| day.strftime(DATE_FORMAT) end
         
     | 
| 
       70 
70 
     | 
    
         
             
            DUE_DATE_DAYS_SIMPLE = ['today', 'tomorrow']
         
     | 
| 
       71 
71 
     | 
    
         | 
| 
      
 72 
     | 
    
         
            +
            DUE_DATE_TAG_PATTERN = /(^| )due:([a-zA-Z0-9-]+)/
         
     | 
| 
      
 73 
     | 
    
         
            +
            CONTEXT_TAG_PATTERN = /(^| )[@+][\w-]+/
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
       72 
75 
     | 
    
         
             
            QUERIES = {
         
     | 
| 
       73 
76 
     | 
    
         
             
              ':active'    => 'state=(new|started|blocked)',
         
     | 
| 
       74 
77 
     | 
    
         
             
              ':done'      => 'state=done',
         
     | 
| 
         @@ -91,12 +94,12 @@ def usage 
     | 
|
| 
       91 
94 
     | 
    
         | 
| 
       92 
95 
     | 
    
         
             
                Commands:
         
     | 
| 
       93 
96 
     | 
    
         
             
                * add <text>                     add new task
         
     | 
| 
       94 
     | 
    
         
            -
                * start <tasknumber> 
     | 
| 
       95 
     | 
    
         
            -
                * done <tasknumber> 
     | 
| 
       96 
     | 
    
         
            -
                * block <tasknumber> 
     | 
| 
       97 
     | 
    
         
            -
                * reset <tasknumber> 
     | 
| 
      
 97 
     | 
    
         
            +
                * start <tasknumber> [text]      mark task as started, with optional note
         
     | 
| 
      
 98 
     | 
    
         
            +
                * done <tasknumber> [text]       mark task as completed, with optional note
         
     | 
| 
      
 99 
     | 
    
         
            +
                * block <tasknumber> [text]      mark task as blocked, with optional note
         
     | 
| 
      
 100 
     | 
    
         
            +
                * reset <tasknumber> [text]      reset task to new state, with optional note
         
     | 
| 
       98 
101 
     | 
    
         
             
                * prio <tasknumber>              toggle high priority flag
         
     | 
| 
       99 
     | 
    
         
            -
                * due <tasknumber>  
     | 
| 
      
 102 
     | 
    
         
            +
                * due <tasknumber> [date]        set/unset due date (in YYYY-MM-DD format)
         
     | 
| 
       100 
103 
     | 
    
         | 
| 
       101 
104 
     | 
    
         
             
                * append <tasknumber> <text>     append text to task title
         
     | 
| 
       102 
105 
     | 
    
         
             
                * rename <tasknumber> <text>     rename task
         
     | 
| 
         @@ -112,6 +115,8 @@ def usage 
     | 
|
| 
       112 
115 
     | 
    
         
             
                With list command the following pre-defined regex patterns can be also used:
         
     | 
| 
       113 
116 
     | 
    
         
             
                #{QUERIES.keys.join(', ')}
         
     | 
| 
       114 
117 
     | 
    
         | 
| 
      
 118 
     | 
    
         
            +
                Due dates can be also added via tags in task title: "due:YYYY-MM-DD"
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
       115 
120 
     | 
    
         
             
                Legend:
         
     | 
| 
       116 
121 
     | 
    
         
             
                #{STATES.select { |k, v| k != 'default' }.map { |k, v| "#{k} #{v}" }.join(', ') }, priority #{PRIORITY_FLAG}
         
     | 
| 
       117 
122 
     | 
    
         | 
| 
         @@ -145,12 +150,22 @@ def write_tasks(tasks) 
     | 
|
| 
       145 
150 
     | 
    
         
             
              end
         
     | 
| 
       146 
151 
     | 
    
         
             
            end
         
     | 
| 
       147 
152 
     | 
    
         | 
| 
      
 153 
     | 
    
         
            +
            def postprocess_tags(task)
         
     | 
| 
      
 154 
     | 
    
         
            +
              title = task[:title]
         
     | 
| 
      
 155 
     | 
    
         
            +
              match_data = title.match(DUE_DATE_TAG_PATTERN)
         
     | 
| 
      
 156 
     | 
    
         
            +
              if match_data
         
     | 
| 
      
 157 
     | 
    
         
            +
                task[:title] = title.gsub(DUE_DATE_TAG_PATTERN, '')
         
     | 
| 
      
 158 
     | 
    
         
            +
                task[:due] = convert_due_date(match_data[2])
         
     | 
| 
      
 159 
     | 
    
         
            +
              end
         
     | 
| 
      
 160 
     | 
    
         
            +
            end
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
       148 
162 
     | 
    
         
             
            def add(text)
         
     | 
| 
       149 
163 
     | 
    
         
             
              task = {
         
     | 
| 
       150 
164 
     | 
    
         
             
                state: 'new',
         
     | 
| 
       151 
165 
     | 
    
         
             
                title: text,
         
     | 
| 
       152 
166 
     | 
    
         
             
                modified: Time.now.strftime(DATE_FORMAT)
         
     | 
| 
       153 
167 
     | 
    
         
             
              }
         
     | 
| 
      
 168 
     | 
    
         
            +
              postprocess_tags(task)
         
     | 
| 
       154 
169 
     | 
    
         
             
              File.open(TODO_FILE, 'a:UTF-8') do |file|
         
     | 
| 
       155 
170 
     | 
    
         
             
                file.write(JSON.generate(task) + "\n")
         
     | 
| 
       156 
171 
     | 
    
         
             
              end
         
     | 
| 
         @@ -161,6 +176,7 @@ def append(item, text = '') 
     | 
|
| 
       161 
176 
     | 
    
         
             
              tasks = load_tasks(item)
         
     | 
| 
       162 
177 
     | 
    
         
             
              tasks[item][:title] = [tasks[item][:title], text].join(' ')
         
     | 
| 
       163 
178 
     | 
    
         
             
              tasks[item][:modified] = Time.now.strftime(DATE_FORMAT)
         
     | 
| 
      
 179 
     | 
    
         
            +
              postprocess_tags(tasks[item])
         
     | 
| 
       164 
180 
     | 
    
         
             
              write_tasks(tasks)
         
     | 
| 
       165 
181 
     | 
    
         
             
              list(tasks)
         
     | 
| 
       166 
182 
     | 
    
         
             
            end
         
     | 
| 
         @@ -169,6 +185,7 @@ def rename(item, text) 
     | 
|
| 
       169 
185 
     | 
    
         
             
              tasks = load_tasks(item)
         
     | 
| 
       170 
186 
     | 
    
         
             
              tasks[item][:title] = text
         
     | 
| 
       171 
187 
     | 
    
         
             
              tasks[item][:modified] = Time.now.strftime(DATE_FORMAT)
         
     | 
| 
      
 188 
     | 
    
         
            +
              postprocess_tags(tasks[item])
         
     | 
| 
       172 
189 
     | 
    
         
             
              write_tasks(tasks)
         
     | 
| 
       173 
190 
     | 
    
         
             
              list(tasks)
         
     | 
| 
       174 
191 
     | 
    
         
             
            end
         
     | 
| 
         @@ -180,10 +197,14 @@ def delete(item) 
     | 
|
| 
       180 
197 
     | 
    
         
             
              list
         
     | 
| 
       181 
198 
     | 
    
         
             
            end
         
     | 
| 
       182 
199 
     | 
    
         | 
| 
       183 
     | 
    
         
            -
            def change_state(item, state)
         
     | 
| 
      
 200 
     | 
    
         
            +
            def change_state(item, state, note = nil)
         
     | 
| 
       184 
201 
     | 
    
         
             
              tasks = load_tasks(item)
         
     | 
| 
       185 
202 
     | 
    
         
             
              tasks[item][:state] = state
         
     | 
| 
       186 
203 
     | 
    
         
             
              tasks[item][:modified] = Time.now.strftime(DATE_FORMAT)
         
     | 
| 
      
 204 
     | 
    
         
            +
              if !note.nil? && !note.empty?
         
     | 
| 
      
 205 
     | 
    
         
            +
                tasks[item][:note] ||= []
         
     | 
| 
      
 206 
     | 
    
         
            +
                tasks[item][:note].push(note)
         
     | 
| 
      
 207 
     | 
    
         
            +
              end
         
     | 
| 
       187 
208 
     | 
    
         
             
              write_tasks(tasks)
         
     | 
| 
       188 
209 
     | 
    
         
             
              list(tasks)
         
     | 
| 
       189 
210 
     | 
    
         
             
            end
         
     | 
| 
         @@ -196,14 +217,9 @@ def set_priority(item) 
     | 
|
| 
       196 
217 
     | 
    
         
             
              list(tasks)
         
     | 
| 
       197 
218 
     | 
    
         
             
            end
         
     | 
| 
       198 
219 
     | 
    
         | 
| 
       199 
     | 
    
         
            -
            def due_date(item, date = '')
         
     | 
| 
      
 220 
     | 
    
         
            +
            def due_date(item, date = '', task = nil)
         
     | 
| 
       200 
221 
     | 
    
         
             
              tasks = load_tasks(item)
         
     | 
| 
       201 
     | 
    
         
            -
               
     | 
| 
       202 
     | 
    
         
            -
              if day_index
         
     | 
| 
       203 
     | 
    
         
            -
                tasks[item][:due] = (TODAY.to_date + day_index).strftime(DATE_FORMAT)
         
     | 
| 
       204 
     | 
    
         
            -
              else
         
     | 
| 
       205 
     | 
    
         
            -
                tasks[item][:due] = date.nil? || date.empty? ? nil : Date.parse(date).strftime(DATE_FORMAT)
         
     | 
| 
       206 
     | 
    
         
            -
              end
         
     | 
| 
      
 222 
     | 
    
         
            +
              tasks[item][:due] = convert_due_date(date)
         
     | 
| 
       207 
223 
     | 
    
         
             
              tasks[item][:modified] = Time.now.strftime(DATE_FORMAT)
         
     | 
| 
       208 
224 
     | 
    
         
             
              write_tasks(tasks)
         
     | 
| 
       209 
225 
     | 
    
         
             
              list(tasks)
         
     | 
| 
         @@ -229,7 +245,9 @@ def list(tasks = nil, patterns = nil) 
     | 
|
| 
       229 
245 
     | 
    
         
             
                state = task[:state] || 'default'
         
     | 
| 
       230 
246 
     | 
    
         
             
                color = COLORS[state]
         
     | 
| 
       231 
247 
     | 
    
         
             
                display_state = colorize(STATES[state], color)
         
     | 
| 
       232 
     | 
    
         
            -
                title = task[:title].gsub( 
     | 
| 
      
 248 
     | 
    
         
            +
                title = task[:title].gsub(CONTEXT_TAG_PATTERN) do |tag|
         
     | 
| 
      
 249 
     | 
    
         
            +
                  (tag.start_with?(' ') ? ' ' : '') + colorize(tag.strip, :cyan)
         
     | 
| 
      
 250 
     | 
    
         
            +
                end
         
     | 
| 
       233 
251 
     | 
    
         
             
                priority_flag = task[:priority] ? colorize(PRIORITY_FLAG, :red) : ' '
         
     | 
| 
       234 
252 
     | 
    
         
             
                due_date = ''
         
     | 
| 
       235 
253 
     | 
    
         
             
                if task[:due] && state != 'done'
         
     | 
| 
         @@ -290,6 +308,17 @@ def colorize(text, color) 
     | 
|
| 
       290 
308 
     | 
    
         
             
              "\e[#{COLOR_CODES[color]}m#{text}\e[0m"
         
     | 
| 
       291 
309 
     | 
    
         
             
            end
         
     | 
| 
       292 
310 
     | 
    
         | 
| 
      
 311 
     | 
    
         
            +
            def convert_due_date(date = '')
         
     | 
| 
      
 312 
     | 
    
         
            +
              due = nil
         
     | 
| 
      
 313 
     | 
    
         
            +
              day_index = DUE_DATE_DAYS.index(date.to_s.downcase) || DUE_DATE_DAYS_SIMPLE.index(date.to_s.downcase)
         
     | 
| 
      
 314 
     | 
    
         
            +
              if day_index
         
     | 
| 
      
 315 
     | 
    
         
            +
                due = (TODAY.to_date + day_index).strftime(DATE_FORMAT)
         
     | 
| 
      
 316 
     | 
    
         
            +
              else
         
     | 
| 
      
 317 
     | 
    
         
            +
                due = date.nil? || date.empty? ? nil : Date.parse(date).strftime(DATE_FORMAT)
         
     | 
| 
      
 318 
     | 
    
         
            +
              end
         
     | 
| 
      
 319 
     | 
    
         
            +
              return due
         
     | 
| 
      
 320 
     | 
    
         
            +
            end
         
     | 
| 
      
 321 
     | 
    
         
            +
             
     | 
| 
       293 
322 
     | 
    
         
             
            def read(arguments)
         
     | 
| 
       294 
323 
     | 
    
         
             
              begin
         
     | 
| 
       295 
324 
     | 
    
         
             
                action = arguments.first
         
     | 
| 
         @@ -299,17 +328,13 @@ def read(arguments) 
     | 
|
| 
       299 
328 
     | 
    
         
             
                  raise action + ' command requires at least one parameter' if args.nil? || args.empty?
         
     | 
| 
       300 
329 
     | 
    
         
             
                  add(args.join(' '))
         
     | 
| 
       301 
330 
     | 
    
         
             
                when 'start'
         
     | 
| 
       302 
     | 
    
         
            -
                   
     | 
| 
       303 
     | 
    
         
            -
                  args.length == 1 ? change_state(args.first.to_i, 'started') : list(nil, [':started'])
         
     | 
| 
      
 331 
     | 
    
         
            +
                  args.length > 0 ? change_state(args.first.to_i, 'started', args[1..-1].join(' ')) : list(nil, [':started'])
         
     | 
| 
       304 
332 
     | 
    
         
             
                when 'done'
         
     | 
| 
       305 
     | 
    
         
            -
                   
     | 
| 
       306 
     | 
    
         
            -
                  args.length == 1 ? change_state(args.first.to_i, 'done') : list(nil, [':done'])
         
     | 
| 
      
 333 
     | 
    
         
            +
                  args.length > 0 ? change_state(args.first.to_i, 'done', args[1..-1].join(' ')) : list(nil, [':done'])
         
     | 
| 
       307 
334 
     | 
    
         
             
                when 'block'
         
     | 
| 
       308 
     | 
    
         
            -
                   
     | 
| 
       309 
     | 
    
         
            -
                  args.length == 1 ? change_state(args.first.to_i, 'blocked') : list(nil, [':blocked'])
         
     | 
| 
      
 335 
     | 
    
         
            +
                  args.length > 0 ? change_state(args.first.to_i, 'blocked', args[1..-1].join(' ')) : list(nil, [':blocked'])
         
     | 
| 
       310 
336 
     | 
    
         
             
                when 'reset'
         
     | 
| 
       311 
     | 
    
         
            -
                   
     | 
| 
       312 
     | 
    
         
            -
                  args.length == 1 ? change_state(args.first.to_i, 'new') : list(nil, [':new'])
         
     | 
| 
      
 337 
     | 
    
         
            +
                  args.length > 0 ? change_state(args.first.to_i, 'new', args[1..-1].join(' ')) : list(nil, [':new'])
         
     | 
| 
       313 
338 
     | 
    
         
             
                when 'prio'
         
     | 
| 
       314 
339 
     | 
    
         
             
                  raise action + ' command requires exactly one parameter' if args.length != 1
         
     | 
| 
       315 
340 
     | 
    
         
             
                  set_priority(args.first.to_i)
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: todo-jsonl
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.1.12
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Gabor Bata
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2021-02- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2021-02-25 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       13 
13 
     | 
    
         
             
            description: 
         
     | 
| 
       14 
14 
     | 
    
         
             
            email: 
         
     |