thyme 0.0.13 → 0.0.14

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 (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -0
  3. data/lib/thyme.rb +59 -15
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2dc55d1fa48aa2ebf2655f9140fa9ca1a06758b3
4
- data.tar.gz: a55a448d17fabd05cb12a2ba86a17a30d9ebc2af
3
+ metadata.gz: 0a34024e5c3c57ea62c834ea83adf0c118b3fad2
4
+ data.tar.gz: b0e6459d5fb05917846384d5296c7b4da76d0ce1
5
5
  SHA512:
6
- metadata.gz: 2f2b2bff48e1730abbe236b56f930638911f4f4f33991269253af116262b8e82bd04e5e2808226717a5128fe456ef14131493802c6d5563b49b20606952d03b4
7
- data.tar.gz: dd12fc5edede848a295f164d3a4ec37e01a698b17fb3069c4e78842249366eb879281637ec8916a33d77d674de42ba7348d02bb366f344d9bc026f2959545783
6
+ metadata.gz: bfd282a9ff8df019c9c58b4add8c98bdc7e08e37a71cf4ea980bdacd366cbc9142450fcd9b062e783a4d4e5c0735c3a3ceb35a2c6b6a0c05c0f1d913a2d8b5b9
7
+ data.tar.gz: 82391d021bf3735a7e34be5a354de37cd62e104664886ead5e03af649a5b2849cac58c16226f9ab6d6472a1aea4ecd458a45929c29dc2d790717abe58f23d53c
data/README.md CHANGED
@@ -90,6 +90,37 @@ works if you have tmux integration setup for the countdown:
90
90
 
91
91
  nmap <leader>t :!thyme -d<cr>
92
92
 
93
+ Plugins
94
+ =======
95
+
96
+ Thyme's functionality can also be extended with plugins. They'll usually follow this
97
+ format:
98
+
99
+ require "thyme_growl"
100
+ use ThymeGrowl, text: "Go take a break!"
101
+
102
+ You can create your own plugins. They implement these methods:
103
+
104
+ class MyThymePlugin
105
+ def initialize(thyme, options={})
106
+ # `thyme` is an instance of Thyme (see lib/thyme.rb)
107
+ end
108
+
109
+ def before
110
+ # code to run when timer starts
111
+ end
112
+
113
+ def tick(seconds_left)
114
+ # code to run each tick
115
+ end
116
+
117
+ def after(seconds_left)
118
+ # code to run when timer stops
119
+ end
120
+ end
121
+
122
+ The `before`, `tick`, and `after` methods are all optional.
123
+
93
124
  License
94
125
  =======
95
126
 
data/lib/thyme.rb CHANGED
@@ -2,7 +2,7 @@ require 'ruby-progressbar'
2
2
  require 'date'
3
3
 
4
4
  class Thyme
5
- VERSION = '0.0.13'
5
+ VERSION = '0.0.14'
6
6
  CONFIG_FILE = "#{ENV['HOME']}/.thymerc"
7
7
  PID_FILE = "#{ENV['HOME']}/.thyme-pid"
8
8
  TMUX_FILE = "#{ENV['HOME']}/.thyme-tmux"
@@ -17,6 +17,11 @@ class Thyme
17
17
  @tmux_theme = "#[default]#[fg=%s]%s#[default]"
18
18
  @warning = 5 * 60
19
19
  @warning_color = "red,bold"
20
+ @plugins = []
21
+ end
22
+
23
+ def use(plugin_class, *args, &block)
24
+ @plugins << plugin_class.new(self, *args, &block)
20
25
  end
21
26
 
22
27
  def run(force=false)
@@ -46,15 +51,15 @@ class Thyme
46
51
  end
47
52
 
48
53
  def before(&block)
49
- @before = block
54
+ hooks_plugin.add(:before, &block)
50
55
  end
51
56
 
52
57
  def after(&block)
53
- @after = block
58
+ hooks_plugin.add(:after, &block)
54
59
  end
55
60
 
56
61
  def tick(&block)
57
- @tick = block
62
+ hooks_plugin.add(:tick, &block)
58
63
  end
59
64
 
60
65
  def option(optparse, short, long, desc, &block)
@@ -67,14 +72,15 @@ class Thyme
67
72
  def load_config(optparse)
68
73
  return if !File.exists?(CONFIG_FILE)
69
74
  app = self
70
- Object.class_eval do
75
+ environment = Class.new do
71
76
  define_method(:set) { |opt,val| app.set(opt,val) }
77
+ define_method(:use) { |plugin,*args,&b| app.use(plugin,*args,&b) }
72
78
  define_method(:before) { |&block| app.before(&block) }
73
79
  define_method(:after) { |&block| app.after(&block) }
74
80
  define_method(:tick) { |&block| app.tick(&block) }
75
81
  define_method(:option) { |sh,lo,desc,&b| app.option(optparse,sh,lo,desc,&b) }
76
- end
77
- load(CONFIG_FILE, true)
82
+ end.new
83
+ environment.instance_eval(File.read(CONFIG_FILE), CONFIG_FILE)
78
84
  end
79
85
 
80
86
  def running?
@@ -85,12 +91,12 @@ class Thyme
85
91
 
86
92
  def start_timer
87
93
  File.open(PID_FILE, "w") { |f| f.print(Process.pid) }
88
- before_hook = @before
89
94
  seconds_start = @break ? @timer_break : @timer
90
95
  seconds_left = seconds_start + 1
91
96
  start_time = DateTime.now
92
97
  min_length = (seconds_left / 60).floor.to_s.length
93
98
  tmux_file = File.open(TMUX_FILE, "w") if @tmux
99
+ started = false
94
100
  bar = ENV['THYME_TEST'].nil? && !daemon? ?
95
101
  ProgressBar.create(
96
102
  title: format(seconds_left-1, min_length),
@@ -112,13 +118,11 @@ class Thyme
112
118
  tmux_file.write(@tmux_theme % [fg, title])
113
119
  tmux_file.flush
114
120
  end
115
- if before_hook
116
- self.instance_exec(&before_hook)
117
- before_hook = nil
118
- end
119
- if @tick
120
- self.instance_exec(seconds_left, &@tick)
121
+ unless started
122
+ started = true
123
+ send_to_plugin :before
121
124
  end
125
+ send_to_plugin :tick, seconds_left
122
126
  sleep(@interval)
123
127
  end
124
128
  rescue SignalException => e
@@ -128,7 +132,7 @@ class Thyme
128
132
  File.delete(TMUX_FILE) if File.exists?(TMUX_FILE)
129
133
  File.delete(PID_FILE) if File.exists?(PID_FILE)
130
134
  seconds_left = [seconds_start - seconds_since(start_time), 0].max
131
- self.instance_exec(seconds_left, &@after) if @after
135
+ send_to_plugin :after, seconds_left
132
136
  end
133
137
 
134
138
  def stop_timer
@@ -139,6 +143,23 @@ class Thyme
139
143
  File.delete(PID_FILE) if File.exists?(PID_FILE)
140
144
  end
141
145
 
146
+ def send_to_plugin(message, *args)
147
+ @plugins.each do |plugin|
148
+ begin
149
+ plugin.public_send(message, *args) if plugin.respond_to?(message)
150
+ rescue
151
+ $stderr.puts "Exception raised from #{plugin.class}:", $!, $@
152
+ end
153
+ end
154
+ end
155
+
156
+ def hooks_plugin
157
+ @hooks_plugin ||= begin
158
+ use ThymeHooksPlugin
159
+ @plugins.last
160
+ end
161
+ end
162
+
142
163
  def seconds_since(time)
143
164
  ((DateTime.now - time) * 24 * 60 * 60).to_i
144
165
  end
@@ -159,3 +180,26 @@ class Thyme
159
180
  end
160
181
 
161
182
  class ThymeError < StandardError; end;
183
+
184
+ class ThymeHooksPlugin
185
+ def initialize(app)
186
+ @app = app
187
+ @hooks = {before: [], tick: [], after: []}
188
+ end
189
+
190
+ def add(type, &block)
191
+ @hooks[type] << block
192
+ end
193
+
194
+ def before
195
+ @hooks[:before].each { |b| @app.instance_exec(&b) }
196
+ end
197
+
198
+ def tick(seconds_left)
199
+ @hooks[:tick].each { |t| @app.instance_exec(seconds_left, &t) }
200
+ end
201
+
202
+ def after(seconds_left)
203
+ @hooks[:after].each { |a| @app.instance_exec(seconds_left, &a) }
204
+ end
205
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thyme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hugh Bien
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-10 00:00:00.000000000 Z
11
+ date: 2014-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-progressbar
@@ -55,7 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
55
55
  version: 1.3.6
56
56
  requirements: []
57
57
  rubyforge_project:
58
- rubygems_version: 2.2.0
58
+ rubygems_version: 2.2.2
59
59
  signing_key:
60
60
  specification_version: 4
61
61
  summary: Timer for Pomodoro Technique