currently 0.0.1 → 0.0.2
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/.gitignore +2 -0
- data/Gemfile.lock +65 -0
- data/README.markdown +5 -1
- data/Rakefile +2 -0
- data/bin/currently +0 -0
- data/currently.gemspec +3 -1
- data/features/basic_cli_usage.feature +9 -0
- data/features/basic_file_usage.feature +25 -0
- data/features/support/env.rb +1 -0
- data/lib/currently.rb +54 -2
- data/lib/currently/backingstore.rb +18 -0
- data/lib/currently/catchstore.rb +35 -0
- data/lib/currently/entry.rb +18 -0
- data/lib/currently/filestore.rb +53 -0
- data/lib/currently/version.rb +1 -1
- metadata +46 -6
data/.gitignore
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
currently (0.0.1)
|
5
|
+
catch
|
6
|
+
trollop
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
addressable (2.2.6)
|
12
|
+
aruba (0.4.6)
|
13
|
+
bcat (>= 0.6.1)
|
14
|
+
childprocess (>= 0.2.0)
|
15
|
+
cucumber (>= 1.0.2)
|
16
|
+
rdiscount (>= 1.6.8)
|
17
|
+
rspec (>= 2.6.0)
|
18
|
+
bcat (0.6.1)
|
19
|
+
rack (~> 1.0)
|
20
|
+
builder (3.0.0)
|
21
|
+
catch (0.0.7)
|
22
|
+
faraday_middleware (~> 0.6)
|
23
|
+
hashie (~> 1.0.0)
|
24
|
+
multi_json (~> 1.0.0)
|
25
|
+
childprocess (0.2.1)
|
26
|
+
ffi (~> 1.0.6)
|
27
|
+
cucumber (1.0.2)
|
28
|
+
builder (>= 2.1.2)
|
29
|
+
diff-lcs (>= 1.1.2)
|
30
|
+
gherkin (~> 2.4.5)
|
31
|
+
json (>= 1.4.6)
|
32
|
+
term-ansicolor (>= 1.0.5)
|
33
|
+
diff-lcs (1.1.2)
|
34
|
+
faraday (0.7.4)
|
35
|
+
addressable (~> 2.2.6)
|
36
|
+
multipart-post (~> 1.1.0)
|
37
|
+
rack (< 2, >= 1.1.0)
|
38
|
+
faraday_middleware (0.7.0)
|
39
|
+
faraday (~> 0.7.3)
|
40
|
+
ffi (1.0.9)
|
41
|
+
gherkin (2.4.14)
|
42
|
+
json (>= 1.4.6)
|
43
|
+
hashie (1.0.0)
|
44
|
+
json (1.5.3)
|
45
|
+
multi_json (1.0.3)
|
46
|
+
multipart-post (1.1.3)
|
47
|
+
rack (1.3.2)
|
48
|
+
rdiscount (1.6.8)
|
49
|
+
rspec (2.6.0)
|
50
|
+
rspec-core (~> 2.6.0)
|
51
|
+
rspec-expectations (~> 2.6.0)
|
52
|
+
rspec-mocks (~> 2.6.0)
|
53
|
+
rspec-core (2.6.4)
|
54
|
+
rspec-expectations (2.6.0)
|
55
|
+
diff-lcs (~> 1.1.2)
|
56
|
+
rspec-mocks (2.6.0)
|
57
|
+
term-ansicolor (1.0.6)
|
58
|
+
trollop (1.16.2)
|
59
|
+
|
60
|
+
PLATFORMS
|
61
|
+
ruby
|
62
|
+
|
63
|
+
DEPENDENCIES
|
64
|
+
aruba
|
65
|
+
currently!
|
data/README.markdown
CHANGED
@@ -26,12 +26,16 @@ You can add multiple tags (contexts) to `currently` by using the `-c` flag; you
|
|
26
26
|
|
27
27
|
Of course, there are some fun uses for the data (plotting what times of the day you're most active, etc) so your old entries are stored. You can view the last *n* entries with the `-n` option: `currently -n 5`
|
28
28
|
|
29
|
+
To Install
|
30
|
+
----------
|
31
|
+
|
32
|
+
gem install currently
|
29
33
|
|
30
34
|
Todo
|
31
35
|
----
|
32
36
|
* read/write configs from `~/.currentlyrc`
|
33
37
|
* write to `~/.currentlog`
|
34
|
-
* catch.com integration
|
38
|
+
* catch.com integration (including offline storage until connectivity is up?)
|
35
39
|
* show awesomeWM wibox example
|
36
40
|
* auto-infer location tags from geolocation API
|
37
41
|
* color output
|
data/Rakefile
CHANGED
data/bin/currently
CHANGED
File without changes
|
data/currently.gemspec
CHANGED
@@ -26,5 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
|
27
27
|
# specify any dependencies here; for example:
|
28
28
|
# s.add_development_dependency "rspec"
|
29
|
-
|
29
|
+
s.add_runtime_dependency "trollop"
|
30
|
+
s.add_runtime_dependency "catch"
|
31
|
+
s.add_development_dependency "aruba"
|
30
32
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# this is a silly language
|
2
|
+
# let's look into not using pseudo-english for everything
|
3
|
+
Feature: basic CLI commands
|
4
|
+
|
5
|
+
Scenario: getting help
|
6
|
+
When I run `currently --help`
|
7
|
+
Then the exit status should be 0
|
8
|
+
And the output should contain "usage"
|
9
|
+
And the output should contain "currently"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Feature: basic filestore usage
|
2
|
+
|
3
|
+
Scenario: no file
|
4
|
+
Given an empty file named "test/scratch/currentlog"
|
5
|
+
When I remove the file "test/scratch/currentlog"
|
6
|
+
And I run `currently -f test/scratch/currentlog`
|
7
|
+
Then the exit status should be 0
|
8
|
+
And the output should contain "entry log is empty"
|
9
|
+
And the file "~/.currentlog" should not exist
|
10
|
+
|
11
|
+
Scenario: empty file
|
12
|
+
Given an empty file named "test/scratch/currentlog"
|
13
|
+
When I run `currently -f test/scratch/currentlog`
|
14
|
+
Then the exit status should be 0
|
15
|
+
And the output should contain "entry log is empty"
|
16
|
+
|
17
|
+
Scenario: write one
|
18
|
+
Given an empty file named "test/scratch/currentlog"
|
19
|
+
When I remove the file "test/scratch/currentlog"
|
20
|
+
And I run `currently -f test/scratch/currentlog test data`
|
21
|
+
And I run `currently -f test/scratch/currentlog`
|
22
|
+
Then the exit status should be 0
|
23
|
+
And the output should contain exactly "test data\n"
|
24
|
+
And a file named "test/scratch/currentlog" should exist
|
25
|
+
And the file "test/scratch/currentlog" should contain "test data"
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'aruba/cucumber'
|
data/lib/currently.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require 'currently/version'
|
2
|
+
require 'currently/filestore'
|
3
|
+
require 'currently/catchstore'
|
4
|
+
require 'trollop'
|
2
5
|
|
3
6
|
module Currently
|
4
7
|
class << self
|
@@ -9,7 +12,56 @@ module Currently
|
|
9
12
|
|
10
13
|
class Application
|
11
14
|
def run
|
12
|
-
|
15
|
+
opts = Trollop::options do
|
16
|
+
version "currently v#{VERSION} (c) 2011 Mike Stipicevic"
|
17
|
+
banner <<-EOS
|
18
|
+
currently is a 'concentration log' designed to keep track of what you
|
19
|
+
are working or thinking about right at this moment.
|
20
|
+
|
21
|
+
usage:
|
22
|
+
currently [options] [entry]
|
23
|
+
|
24
|
+
leaving out an entry will display the last one entered
|
25
|
+
|
26
|
+
available [options] are:
|
27
|
+
EOS
|
28
|
+
|
29
|
+
opt :filestore, "use local filestore", :type => :string
|
30
|
+
opt :context, "select a context (work, home, etc)", :type => :string
|
31
|
+
opt :catch, "use catch, specify username:password", :type => :string
|
32
|
+
end
|
33
|
+
|
34
|
+
unless opts[:catch]
|
35
|
+
fname = ENV["HOME"] + "/.currentlog"
|
36
|
+
fname = opts[:filestore] if opts[:filestore]
|
37
|
+
backingstore = Filestore.new(fname)
|
38
|
+
else
|
39
|
+
user = opts[:catch].split(":")[0]
|
40
|
+
Trollop::die :catch, "must be in the format: username:password" if opts[:catch].split(":").length < 2
|
41
|
+
pw = opts[:catch].split(":")[1]
|
42
|
+
backingstore = Catchstore.new(user,pw)
|
43
|
+
end
|
44
|
+
|
45
|
+
if ARGV.count > 0
|
46
|
+
text = ARGV.join(" ")
|
47
|
+
if opts[:context]
|
48
|
+
ent = Entry.new(text,[opts[:context]])
|
49
|
+
else
|
50
|
+
ent = Entry.new(text)
|
51
|
+
end
|
52
|
+
backingstore.save(ent)
|
53
|
+
else
|
54
|
+
if opts[:context]
|
55
|
+
last = backingstore.last(1,opts[:context])
|
56
|
+
else
|
57
|
+
last = backingstore.last
|
58
|
+
end
|
59
|
+
if last.count > 0 then
|
60
|
+
puts last.first.to_s
|
61
|
+
else
|
62
|
+
puts "[ entry log is empty ]"
|
63
|
+
end
|
64
|
+
end
|
13
65
|
end
|
14
66
|
end
|
15
67
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Currently
|
2
|
+
class Backingstore
|
3
|
+
# retrieves last n entries
|
4
|
+
def last(n = 1, context = nil)
|
5
|
+
raise "not implemented!"
|
6
|
+
end
|
7
|
+
|
8
|
+
# retrieves all entries (or as many as can be found)
|
9
|
+
def all
|
10
|
+
raise "not implemented!"
|
11
|
+
end
|
12
|
+
|
13
|
+
# saves the provided entry
|
14
|
+
def save(entry)
|
15
|
+
raise "not implemented!"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'currently/backingstore'
|
2
|
+
require 'currently/entry'
|
3
|
+
require 'catch'
|
4
|
+
|
5
|
+
module Currently
|
6
|
+
class Catchstore < Backingstore
|
7
|
+
def initialize(user,pass)
|
8
|
+
@catch = Catch::Client.new(:username => user, :password => pass)
|
9
|
+
@context = "#iac"
|
10
|
+
end
|
11
|
+
|
12
|
+
# retrieves last n entries
|
13
|
+
def last(n = 1,context = nil)
|
14
|
+
context ||= @context
|
15
|
+
note_ids = @catch.search(context,:limit => n).map{|x| x["id"].to_i}
|
16
|
+
ents = note_ids.map{|x|
|
17
|
+
e = @catch.note(x)
|
18
|
+
# Entry.new(e["text"],e["tags"],e["created_at"])
|
19
|
+
# tags are already in the text, we don't want dupes
|
20
|
+
Entry.new(e["text"],[],e["created_at"])
|
21
|
+
}
|
22
|
+
ents
|
23
|
+
end
|
24
|
+
|
25
|
+
# retrieves all entries (or as many as can be found)
|
26
|
+
def all
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
# saves the provided entry
|
31
|
+
def save(entry)
|
32
|
+
@catch.add_note(:text => entry.to_s + " #{@context}")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Currently
|
2
|
+
class Entry
|
3
|
+
def initialize(text,contexts = [],ts = Time.now.to_s)
|
4
|
+
@text = text
|
5
|
+
@contexts = contexts
|
6
|
+
@timestamp = ts
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
@text + @contexts.map{|x| "#" + x}.join(" ")
|
11
|
+
end
|
12
|
+
|
13
|
+
# put this into sep module?
|
14
|
+
def serialize_to_line
|
15
|
+
@timestamp.to_s + "| " + @text + " " + @contexts.map{|x| "#" + x}.join(" ")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'currently/backingstore'
|
2
|
+
require 'currently/entry'
|
3
|
+
|
4
|
+
module Currently
|
5
|
+
class Filestore < Backingstore
|
6
|
+
def initialize(filename)
|
7
|
+
# raise "log file #{filename} doesn't exist!" unless File.exists? filename
|
8
|
+
@filename = filename
|
9
|
+
end
|
10
|
+
|
11
|
+
# retrieves last n entries
|
12
|
+
def last(n = 1)
|
13
|
+
self.parse.last n
|
14
|
+
end
|
15
|
+
|
16
|
+
# retrieves all entries (or as many as can be found)
|
17
|
+
def all
|
18
|
+
self.parse
|
19
|
+
end
|
20
|
+
|
21
|
+
# saves the provided entry
|
22
|
+
def save(entry)
|
23
|
+
File.open(@filename,"a"){|f|
|
24
|
+
f.puts entry.serialize_to_line
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def parse
|
29
|
+
# sloooooooow
|
30
|
+
entries = []
|
31
|
+
return entries unless File.exists? @filename
|
32
|
+
File.open(@filename) {|f|
|
33
|
+
f.readlines.each{|l|
|
34
|
+
chunks = l.split("|")
|
35
|
+
ts = chunks[0]
|
36
|
+
rest = chunks[1..-1].join("|").split(" ")
|
37
|
+
contexts = []
|
38
|
+
rest.reverse.each {|c|
|
39
|
+
if c =~ /^\#.+/
|
40
|
+
contexts << c[1..-1]
|
41
|
+
else
|
42
|
+
break
|
43
|
+
end
|
44
|
+
}
|
45
|
+
contexts = contexts.reverse
|
46
|
+
text = rest[0..-(contexts.length + 1)].join(" ")
|
47
|
+
entries << Entry.new(text,contexts,ts)
|
48
|
+
}
|
49
|
+
entries
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/currently/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: currently
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,9 +9,41 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
13
|
-
|
14
|
-
|
12
|
+
date: 2011-08-21 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: trollop
|
16
|
+
requirement: &86045460 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *86045460
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: catch
|
27
|
+
requirement: &86045250 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *86045250
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: aruba
|
38
|
+
requirement: &86045040 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *86045040
|
15
47
|
description: ! " 'currently' is a console application designed to keep a running
|
16
48
|
'concentration log'\n of what you are currently doing in the moment. It is ideal
|
17
49
|
for capturing your thoughts\n at work before the weekend so you're ready to go
|
@@ -27,14 +59,22 @@ files:
|
|
27
59
|
- .gitignore
|
28
60
|
- COPYING
|
29
61
|
- Gemfile
|
62
|
+
- Gemfile.lock
|
30
63
|
- README.markdown
|
31
64
|
- Rakefile
|
32
65
|
- bin/currently
|
33
66
|
- currently.gemspec
|
67
|
+
- features/basic_cli_usage.feature
|
68
|
+
- features/basic_file_usage.feature
|
69
|
+
- features/support/env.rb
|
34
70
|
- lib/currently.rb
|
71
|
+
- lib/currently/backingstore.rb
|
72
|
+
- lib/currently/catchstore.rb
|
73
|
+
- lib/currently/entry.rb
|
74
|
+
- lib/currently/filestore.rb
|
35
75
|
- lib/currently/version.rb
|
36
76
|
- pkg/.gitignore
|
37
|
-
|
77
|
+
- tmp/aruba/.gitignore
|
38
78
|
homepage: https://github.com/wickedchicken/i_am_currently
|
39
79
|
licenses: []
|
40
80
|
post_install_message:
|
@@ -55,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
95
|
version: '0'
|
56
96
|
requirements: []
|
57
97
|
rubyforge_project: currently
|
58
|
-
rubygems_version: 1.6
|
98
|
+
rubygems_version: 1.8.6
|
59
99
|
signing_key:
|
60
100
|
specification_version: 3
|
61
101
|
summary: the 'currently' concentration log application
|