rmilk 0.1.6

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.
@@ -0,0 +1,38 @@
1
+ = Rmilk
2
+
3
+ == Description
4
+
5
+ Describe your gem here ...
6
+
7
+ == Installation
8
+
9
+ sudo gem install rmilk
10
+
11
+ == Usage
12
+
13
+ require 'rmilk'
14
+
15
+ == License
16
+
17
+ Copyright (c) <year> <copyright holders>
18
+
19
+ Permission is hereby granted, free of charge, to any person
20
+ obtaining a copy of this software and associated documentation
21
+ files (the "Software"), to deal in the Software without
22
+ restriction, including without limitation the rights to use,
23
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
24
+ copies of the Software, and to permit persons to whom the
25
+ Software is furnished to do so, subject to the following
26
+ conditions:
27
+
28
+ The above copyright notice and this permission notice shall be
29
+ included in all copies or substantial portions of the Software.
30
+
31
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
33
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
35
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
36
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
37
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
38
+ OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,59 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'rake/testtask'
4
+
5
+ require 'lib/rmilk/version'
6
+
7
+ spec = Gem::Specification.new do |s|
8
+ s.name = 'rmilk'
9
+ s.version = ConsoleRtm::Version.to_s
10
+ s.has_rdoc = true
11
+ s.extra_rdoc_files = %w(README.rdoc)
12
+ s.rdoc_options = %w(--main README.rdoc)
13
+ s.summary = "This gem provides console ui for RMilk service "
14
+ s.author = 'Victor Savkin'
15
+ s.email = 'avix1000@gmail.com'
16
+ s.homepage = 'http://my-site.net'
17
+ s.files = %w(README.rdoc Rakefile) + Dir.glob("{bin,lib,test}/**/*")
18
+ s.bindir = "bin"
19
+ s.executables = ['rmilk']
20
+
21
+ s.add_dependency('flexmock')
22
+ s.add_dependency('rufus-rtm')
23
+ s.add_dependency('require_all')
24
+ end
25
+
26
+ Rake::GemPackageTask.new(spec) do |pkg|
27
+ pkg.gem_spec = spec
28
+ end
29
+
30
+ Rake::TestTask.new do |t|
31
+ t.libs << 'test'
32
+ t.test_files = FileList["test/**/*_test.rb"]
33
+ t.verbose = true
34
+ end
35
+
36
+ begin
37
+ require 'rcov/rcovtask'
38
+
39
+ Rcov::RcovTask.new(:coverage) do |t|
40
+ t.libs = ['test']
41
+ t.test_files = FileList["test/**/*_test.rb"]
42
+ t.verbose = true
43
+ t.rcov_opts = ['--text-report', "-x #{Gem.path}", '-x /Library/Ruby', '-x /usr/lib/ruby']
44
+ end
45
+
46
+ task :default => :coverage
47
+
48
+ rescue LoadError
49
+ warn "\n**** Install rcov (sudo gem install relevance-rcov) to get coverage stats ****\n"
50
+ task :default => :test
51
+ end
52
+
53
+
54
+ desc 'Generate the gemspec to serve this Gem from Github'
55
+ task :github do
56
+ file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
57
+ File.open(file, 'w') {|f| f << spec.to_ruby }
58
+ puts "Created gemspec: #{file}"
59
+ end
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + '/../lib/rmilk.rb'
@@ -0,0 +1,13 @@
1
+ #this shit is required to init rufus lib
2
+ if !ENV["RTM_API_KEY"] then
3
+ ENV["RTM_API_KEY"] = "stub"
4
+ ENV["RTM_SHARED_SECRET"] = "stub"
5
+ ENV["RTM_FROB"] = "stub"
6
+ ENV["RTM_AUTH_TOKEN"] = "stub"
7
+ end
8
+
9
+ require 'rubygems'
10
+ require 'rufus/rtm'
11
+ require "require_all"
12
+ require 'pstore'
13
+ require_all File.dirname(__FILE__) + '/rmilk/*.rb'
@@ -0,0 +1,13 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'rmilk/rmilk_runner.rb'
4
+ include ConsoleRtm
5
+
6
+ query = ARGV.join(' ')
7
+
8
+ runner = RmilkRunner.new
9
+ runner.init_environment
10
+ runner.init_storage
11
+ runner.init_ui
12
+ runner.process(query)
13
+
@@ -0,0 +1,161 @@
1
+ require File.dirname(__FILE__) + '/../import_rmilk.rb'
2
+
3
+ module ConsoleRtm
4
+
5
+ class HelpMessage
6
+ def initialize
7
+ @messages = []
8
+ @messages << '-l Inbox -d today -s completed'
9
+ @messages << '-next'
10
+ @messages << '-res'
11
+ @messages << '-a New Task -t Inbox'
12
+ @messages << '-history'
13
+ @messages << '-hd 0'
14
+ @messages << '-complete 0'
15
+ @messages << '-uncomplete 0'
16
+ @messages << '-postpone 0'
17
+ @messages << '-delete 0'
18
+ @messages << '-m 0 -l Home'
19
+ @messages << '-e 0 -p 1 -d today'
20
+ end
21
+
22
+ def to_s
23
+ @messages.join("\n")
24
+ end
25
+ end
26
+
27
+ class Action
28
+ def initialize(task_repo, list_repo, is_apply, &apply)
29
+ @task_repo = task_repo
30
+ @list_repo = list_repo
31
+ @is_apply = is_apply
32
+ @apply = apply
33
+ end
34
+
35
+ def apply?
36
+ @is_apply.call
37
+ end
38
+
39
+ def apply!
40
+ @apply.call
41
+ end
42
+ end
43
+
44
+ class ConsoleUi
45
+ def initialize(store, out)
46
+ @store, @out = store, out
47
+ @list_repo = RtmListRepository.new(store)
48
+ @task_repo = RtmTaskRepository.new(@list_repo)
49
+
50
+ @actions = []
51
+ @input_parse = InputParser.new
52
+ @help = HelpMessage.new
53
+
54
+ rule_when lambda {command?('-l') || command?('-d')} do
55
+ criteria = {:status => 'incomplete'}
56
+ if @args['-l'] then criteria[:list] = @args['-l'] end
57
+ if @args['-d'] then criteria[:due] = @args['-d'] end
58
+ if @args['-s'] then criteria[:status] = @args['-s'] end
59
+ tasks = @task_repo.get_tasks(criteria)
60
+ @store.save_tasks tasks
61
+ @out.format_tasks tasks
62
+ end
63
+
64
+ rule_when lambda {command?('-next')} do
65
+ criteria = {:status => 'incomplete', :list => ENV["NEXT_ACTIONS"]}
66
+ tasks = @task_repo.get_tasks(criteria)
67
+ @store.save_tasks tasks
68
+ @out.format_tasks tasks
69
+ end
70
+
71
+ rule_when lambda {command?('-res')} do
72
+ tasks = @store.get_tasks
73
+ @out.format_tasks tasks
74
+ end
75
+
76
+ rule_when lambda {command?('-a')} do
77
+ text = @args['-a']
78
+ list_name = @args['-t'] ? @args['-t'] : ENV["DEFAULT_LIST"]
79
+ @task_repo.add! Task.new(nil, text, list_name)
80
+ end
81
+
82
+ rule_when lambda {command?('-history')} do
83
+ h = @store.get_history
84
+ @out.format_history h
85
+ end
86
+
87
+ rule_when lambda {command?('-hd')} do
88
+ h = @store.get_history
89
+ index = @args['-hd'].to_i
90
+ process h[index]
91
+ end
92
+
93
+ rule_when lambda {command?('-complete')} do
94
+ task('-complete').complete!
95
+ end
96
+
97
+ rule_when lambda {command?('-uncomplete')} do
98
+ task('-complete').uncomplete!
99
+ end
100
+
101
+ rule_when lambda {command?('-postpone')} do
102
+ task('-postpone').postpone!
103
+ end
104
+
105
+ rule_when lambda {command?('-delete')} do
106
+ task('-delete').delete!
107
+ end
108
+
109
+ rule_when lambda {command?('-m')} do
110
+ task = task('-m')
111
+ @task_repo.move_task task, @args['-l']
112
+ end
113
+
114
+ rule_when lambda {command?('-e')} do
115
+ task = task('-e')
116
+ if @args['-p'] then
117
+ task.priority = @args['-p']
118
+ end
119
+ if @args['-d'] then
120
+ task.due = @args['-d']
121
+ end
122
+ end
123
+
124
+ rule_when lambda {command?('-help')} do
125
+ @out.output @help.to_s
126
+ end
127
+
128
+ rule_when lambda {true} do
129
+ @out.error 'unprocessed input'
130
+ end
131
+ end
132
+
133
+ def process(input)
134
+ @deep ||= 1
135
+ @deep += 1
136
+ return "infinite recursion" if @deep > 10
137
+
138
+ @out.clean_output!
139
+ @store.add_to_history input
140
+ @args = @input_parse.parse(input)
141
+ action = @actions.find {|a| a.apply?}
142
+ action.apply! rescue return $!
143
+ @out.result
144
+ end
145
+
146
+ def rule_when(is_apply, &apply)
147
+ @actions << Action.new(@task_repo, @list_repo, is_apply, &apply)
148
+ end
149
+
150
+ def task(args_key)
151
+ index = @args[args_key].to_i
152
+ h = @store.get_tasks
153
+ h[index]
154
+ end
155
+
156
+ def command?(name)
157
+ @args['command'] == name
158
+ end
159
+ end
160
+
161
+ end
@@ -0,0 +1,61 @@
1
+ require File.dirname(__FILE__) + '/../import_rmilk.rb'
2
+
3
+ module ConsoleRtm
4
+ class ContextStorage
5
+ def initialize(file_name, history_size = 10)
6
+ @history_size = history_size
7
+ @store = PStore.new(file_name)
8
+ end
9
+
10
+ def save_list_name(list_id, list_name)
11
+ @store.transaction do
12
+ @store["list_id_#{list_id}"] = list_name
13
+ @store["list_name_#{list_name}"] = list_id
14
+ end
15
+ end
16
+
17
+ def get_list_name(list_id)
18
+ @store.transaction do
19
+ @store["list_id_#{list_id}"]
20
+ end
21
+ end
22
+
23
+ def get_list_id(list_name)
24
+ @store.transaction do
25
+ @store["list_name_#{list_name}"]
26
+ end
27
+ end
28
+
29
+ def save_tasks(tasks)
30
+ @store.transaction do
31
+ @store["tasks"] = tasks
32
+ end
33
+ end
34
+
35
+ def get_tasks
36
+ @store.transaction do
37
+ @store["tasks"]
38
+ end
39
+ end
40
+
41
+ def add_to_history(text)
42
+ @store.transaction do
43
+ h = @store["history"]
44
+ (h ||= []) << text
45
+ @store["history"] = h.last(@history_size)
46
+ end
47
+ end
48
+
49
+ def get_history
50
+ @store.transaction do
51
+ @store["history"].reverse
52
+ end
53
+ end
54
+
55
+ def recreate
56
+ path = @store.path
57
+ File.delete path if File.exists? path
58
+ @store = PStore.new(path)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,32 @@
1
+ module ConsoleRtm
2
+
3
+ class InputParser
4
+ def parse(input)
5
+ parts = input.split(' ').map {|e| preprocess e}
6
+ res, last_command, first_command = {}, 'first', nil
7
+ parts.each do |e|
8
+ if command? e then
9
+ res[e] = true
10
+ last_command = e
11
+ first_command ||= e
12
+ else
13
+ t = res[last_command]
14
+ value_is_not_set = (t == true || t.nil?)
15
+ res[last_command] = value_is_not_set ? e : "#{t} #{e}"
16
+ end
17
+ end
18
+ res['command'] = first_command if !first_command.nil?
19
+ res
20
+ end
21
+
22
+ private
23
+ def command?(str)
24
+ str[0, 1] == '-'
25
+ end
26
+
27
+ def preprocess(str)
28
+ str[0, 1] == '"' && str[-1, 1] == '"' ? str[1..-2] : str
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,61 @@
1
+ module ConsoleRtm
2
+
3
+ class OutputFormatter
4
+ attr_reader :result
5
+
6
+ def initialize(complex_formatter = true)
7
+ @complex_formatter = complex_formatter
8
+ @colors = {:red => "\033[31m",
9
+ :blue => "\033[34m",
10
+ :lightBlue => "\033[36m"}
11
+ end
12
+
13
+ def clean_output!
14
+ @result = ''
15
+ end
16
+
17
+ def format_tasks(tasks)
18
+ temp = []
19
+ tasks.each_with_index do |e, i|
20
+ temp << "#{get_priority_color e}#{i} #{e.text}#{get_end_color}"
21
+ end
22
+ if @complex_formatter then
23
+ @result = "------\n" + temp.join("\n") + "\n------"
24
+ else
25
+ @result = temp.join("\n")
26
+ end
27
+ end
28
+
29
+ def format_history(history)
30
+ temp = []
31
+ history.each_with_index do |e, i|
32
+ temp << "#{i} #{e}"
33
+ end
34
+ @result = temp.join("\n")
35
+ end
36
+
37
+ def error(text)
38
+ @result = text
39
+ end
40
+
41
+ def output(text)
42
+ @result = text
43
+ end
44
+
45
+ private
46
+ def get_priority_color(task)
47
+ return "" unless @complex_formatter
48
+ p = task.priority
49
+ if p == "1" then return @colors[:red] end
50
+ if p == "2" then return @colors[:blue] end
51
+ if p == "3" then return @colors[:lightBlue] end
52
+ return ''
53
+ end
54
+
55
+ def get_end_color
56
+ return "" unless @complex_formatter
57
+ "\033[0m"
58
+ end
59
+ end
60
+
61
+ end
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/../import_rmilk.rb'
2
+
3
+ module ConsoleRtm
4
+ class RmilkRunner
5
+ def init_environment
6
+ ENV["RTM_API_KEY"] = "4486f9224a4a8fa8fef850482fc26160"
7
+ ENV["RTM_SHARED_SECRET"] = "03b3b6dba031d1b2"
8
+ ENV["RTM_FROB"] = "1de9da4bdf1dfad6882864c1a0694dd7807aed1e"
9
+ ENV["RTM_AUTH_TOKEN"] = "079c19ec8b7e364860288624da7a9cf416d310d1"
10
+
11
+ ENV["DEFAULT_LIST"] = "Next"
12
+ ENV["NEXT_ACTIONS"] = "Next"
13
+ end
14
+
15
+ def init_storage
16
+ @storage = ContextStorage.new('/tmp/rtm_local.store')
17
+ end
18
+
19
+ def init_ui
20
+ @ui = ConsoleUi.new(@storage, OutputFormatter.new)
21
+ end
22
+
23
+ def process(str)
24
+ puts @ui.process(str)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,34 @@
1
+ require File.dirname(__FILE__) + '/../import_rmilk.rb'
2
+
3
+ module ConsoleRtm
4
+ class RtmListRepository
5
+ def initialize(context)
6
+ @context = context
7
+ end
8
+
9
+ def get_list_name_by_id(id)
10
+ if n = @context.get_list_name(id) then
11
+ n
12
+ else
13
+ list = all_lists.find {|list| list.list_id == id}
14
+ return nil if list == nil
15
+ @context.save_list_name id, list.name and return list.name
16
+ end
17
+ end
18
+
19
+ def get_list_id_by_name(name)
20
+ if id = @context.get_list_id(name) then
21
+ id
22
+ else
23
+ list = all_lists.find {|list| list.name == name}
24
+ return nil if list == nil
25
+ @context.save_list_name list.list_id, name and return list.list_id
26
+ end
27
+ end
28
+
29
+ private
30
+ def all_lists
31
+ Rufus::RTM::List.find
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/../import_rmilk.rb'
2
+
3
+ module ConsoleRtm
4
+
5
+ class RtmTaskRepository
6
+ def initialize(list_repository)
7
+ @list_repository = list_repository
8
+ end
9
+
10
+ def get_tasks(filter)
11
+ filter_str = filter.inject("") do |r, (k, v)|
12
+ str = "#{k}:#{v}"
13
+ r.empty? ? str : "#{r} and #{str}"
14
+ end
15
+ tasks = all_tasks_filtered(filter_str).collect do |t|
16
+ list_name = @list_repository.get_list_name_by_id(t.list_id)
17
+ Task.new(t.task_id, t.name, list_name, t)
18
+ end
19
+ tasks.sort {|a,b| a.priority <=> b.priority}
20
+ end
21
+
22
+ def add!(task)
23
+ list_id = @list_repository.get_list_id_by_name(task.list_name)
24
+ raise "invalid list name" if list_id.nil?
25
+ new_added_task = Rufus::RTM::Task.add! task.text, list_id
26
+ task.milk_task = new_added_task
27
+ task
28
+ end
29
+
30
+ def move_task(task, list_name)
31
+ list_id = @list_repository.get_list_id_by_name(list_name)
32
+ raise "invalid list name" if list_id.nil?
33
+ task.move_to list_id
34
+ end
35
+
36
+ private
37
+ def all_tasks_filtered(filter_str)
38
+ Rufus::RTM::Task.find(:filter => filter_str) rescue []
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,72 @@
1
+ require File.dirname(__FILE__) + '/../import_rmilk.rb'
2
+
3
+ module ConsoleRtm
4
+
5
+ class Task
6
+ attr_reader :id, :text, :list_name, :tags
7
+ attr_accessor :milk_task
8
+
9
+ def initialize(id, text, list_name, milk_task = nil, tags = {})
10
+ @id = id
11
+ @text = text
12
+ @list_name = list_name
13
+ @milk_task = milk_task
14
+ @tags = tags
15
+ end
16
+
17
+ def complete!
18
+ @milk_task.complete!
19
+ end
20
+
21
+ def delete!
22
+ @milk_task.delete!
23
+ end
24
+
25
+ def postpone!
26
+ execute_milk "rtm.tasks.postpone"
27
+ end
28
+
29
+ def uncomplete!
30
+ execute_milk "rtm.tasks.uncomplete"
31
+ end
32
+
33
+ def priority=(priority)
34
+ execute_milk "rtm.tasks.setPriority", {:priority => priority}
35
+ end
36
+
37
+ def priority
38
+ milk_task.priority
39
+ end
40
+
41
+ def due=(due)
42
+ execute_milk "rtm.tasks.setDueDate", {:due => due}
43
+ end
44
+
45
+ def move_to(to_list_id)
46
+ execute_milk "rtm.tasks.moveTo",
47
+ {:from_list_id => milk_task.list_id,
48
+ :to_list_id => to_list_id}
49
+ end
50
+
51
+ def to_s
52
+ "#{@list_name}: #{@id} - #{@text}"
53
+ end
54
+
55
+ def ==(obj)
56
+ id = obj.id && text == obj.text &&
57
+ list_name == obj.list_name && tags == obj.tags
58
+ end
59
+
60
+ private
61
+ def execute_milk(method, args = {})
62
+ args[:method] = method
63
+ args[:timeline] = Rufus::RTM::MilkResource.timeline
64
+ args[:list_id] = milk_task.list_id
65
+ args[:taskseries_id] = milk_task.taskseries_id
66
+ args[:task_id] = milk_task.task_id
67
+ res = Rufus::RTM.milk(args)
68
+ raise res['err']['msg'] if !res['err'].nil?
69
+ end
70
+ end
71
+
72
+ end
@@ -0,0 +1,13 @@
1
+ module ConsoleRtm
2
+ module Version
3
+
4
+ MAJOR = 0
5
+ MINOR = 1
6
+ TINY = 6
7
+
8
+ def self.to_s # :nodoc:
9
+ [MAJOR, MINOR, TINY].join('.')
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ $:.reject! { |e| e.include? 'TextMate' }
2
+
3
+ require 'rubygems'
4
+ #require 'throat_punch'
5
+ require "test/unit"
6
+ require 'ostruct'
7
+ require 'flexmock/test_unit'
8
+ require File.dirname(__FILE__) + '/../lib/import_rmilk'
@@ -0,0 +1,51 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class ContextStorageTest < Test::Unit::TestCase
4
+ include ConsoleRtm
5
+
6
+ def setup
7
+ @st = ContextStorage.new('rtm_console_tmp.store', 2)
8
+ end
9
+
10
+ def teardown
11
+ File.delete 'rtm_console_tmp.store'
12
+ end
13
+
14
+ def test_can_save_and_get_list_name
15
+ @st.save_list_name(1, "Home")
16
+ @st.save_list_name(2, "Work")
17
+ assert_equal "Home", @st.get_list_name(1)
18
+ assert_equal "Work", @st.get_list_name(2)
19
+ assert_equal nil, @st.get_list_name(3)
20
+ end
21
+
22
+ def test_can_save_and_get_list_id
23
+ @st.save_list_name(1, "Home")
24
+ @st.save_list_name(2, "Work")
25
+ assert_equal 1, @st.get_list_id("Home")
26
+ assert_equal 2, @st.get_list_id("Work")
27
+ assert_equal nil, @st.get_list_id("Income")
28
+ end
29
+
30
+ def test_shares_state_between_instances
31
+ @st.save_list_name(1, "Home")
32
+ st2 = ContextStorage.new('rtm_console_tmp.store')
33
+ assert_equal 1, st2.get_list_id("Home")
34
+ end
35
+
36
+ def test_can_save_and_get_list_of_tasks
37
+ tasks = [Task.new(1, "text", "Home"), Task.new(2, "text2", "Work")]
38
+ @st.save_tasks tasks
39
+ tasks_restored = @st.get_tasks
40
+ assert_equal tasks, tasks_restored
41
+ end
42
+
43
+ def test_can_save_command_history
44
+ @st.add_to_history "one"
45
+ @st.add_to_history "two"
46
+ assert_equal ['two', 'one'], @st.get_history
47
+
48
+ @st.add_to_history "three"
49
+ assert_equal ['three', 'two'], @st.get_history
50
+ end
51
+ end
@@ -0,0 +1,54 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class InputParserTest < Test::Unit::TestCase
4
+ include ConsoleRtm
5
+
6
+ def setup
7
+ @parser = InputParser.new
8
+ end
9
+
10
+ def test_returns_empty_hash_if_input_is_empty
11
+ @res = @parser.parse("")
12
+ assert_equal 0, @res.size
13
+ end
14
+
15
+ def test_only_values
16
+ @res = @parser.parse("Dog")
17
+ assert_equal 'Dog', @res['first']
18
+ end
19
+
20
+ def test_skip_pars
21
+ @res = @parser.parse('"Dog"')
22
+ assert_equal 'Dog', @res['first']
23
+ end
24
+
25
+ def test_commands_without_values
26
+ @res = @parser.parse("-a -bb")
27
+ assert_not_nil @res['-a']
28
+ assert_not_nil @res['-bb']
29
+ assert_nil @res['-ccc']
30
+ end
31
+
32
+ def test_commands_with_values
33
+ @res = @parser.parse("-a Hello -b Bye")
34
+ assert_equal 'Hello', @res['-a']
35
+ assert_equal 'Bye', @res['-b']
36
+ end
37
+
38
+ def test_commands_with_complex_values
39
+ @res = @parser.parse("-a Hello Darling")
40
+ assert_equal 'Hello Darling', @res['-a']
41
+ end
42
+
43
+ def test_sets_first_command
44
+ @res = @parser.parse("-a Hello -b Bye")
45
+ assert_equal '-a', @res['command']
46
+ end
47
+
48
+ def test_complex_example
49
+ @res = @parser.parse("Dog -a Cats Hate Dogs -b")
50
+ assert_equal 'Dog', @res['first']
51
+ assert_equal 'Cats Hate Dogs', @res['-a']
52
+ assert_not_nil @res['-b']
53
+ end
54
+ end
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class OutputFormatterTest < Test::Unit::TestCase
4
+ include ConsoleRtm
5
+
6
+ def setup
7
+ @f = OutputFormatter.new(false)
8
+ @tasks = [OpenStruct.new(:text => 'text1'), OpenStruct.new(:text => 'text2')]
9
+ end
10
+
11
+ def test_output_is_empty_line_if_task_list_is_empty
12
+ @f.format_tasks([])
13
+ assert_equal "", @f.result
14
+ end
15
+
16
+ def test_output_of_not_empty_task_list
17
+ @f.format_tasks(@tasks)
18
+ assert_equal "0 text1\n1 text2", @f.result
19
+ end
20
+
21
+ def test_can_clean_result
22
+ @f.format_tasks(@tasks)
23
+ assert_equal "0 text1\n1 text2", @f.result
24
+ @f.clean_output!
25
+ assert_equal "", @f.result
26
+ end
27
+
28
+ def test_format_history
29
+ @f.format_history(["aa", "bb"])
30
+ assert_equal "0 aa\n1 bb", @f.result
31
+ end
32
+ end
@@ -0,0 +1,37 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class RtmListRepositoryTest < Test::Unit::TestCase
4
+ include ConsoleRtm
5
+
6
+ def setup
7
+ st = ContextStorage.new('rtm_console_tmp.store')
8
+ @repo = flexmock(RtmListRepository.new(st))
9
+
10
+ @lists = [OpenStruct.new(:list_id => 1, :name => 'Home'),
11
+ OpenStruct.new(:list_id => 2, :name => 'Work')]
12
+ end
13
+
14
+ def teardown
15
+ File.delete 'rtm_console_tmp.store'
16
+ end
17
+
18
+ def test_caching_list_when_query_by_id
19
+ @repo.should_receive(:all_lists).once.and_return(@lists)
20
+ assert_equal "Home", @repo.get_list_name_by_id(1)
21
+ #we must execute it second time to check that we'll use cache
22
+ assert_equal "Home", @repo.get_list_name_by_id(1)
23
+ end
24
+
25
+ def test_caching_list_when_query_by_name
26
+ @repo.should_receive(:all_lists).once.and_return(@lists)
27
+ assert_equal 1, @repo.get_list_id_by_name('Home')
28
+ #we must execute it second time to check that we'll use cache
29
+ assert_equal 1, @repo.get_list_id_by_name('Home')
30
+ end
31
+
32
+ def test_returns_nil_if_cant_find_list
33
+ @repo.should_receive(:all_lists).twice.and_return(@lists)
34
+ assert_equal nil, @repo.get_list_id_by_name('Bla')
35
+ assert_equal nil, @repo.get_list_id_by_name('Blo')
36
+ end
37
+ end
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class RtmTaskRepositoryTest < Test::Unit::TestCase
4
+ include ConsoleRtm
5
+
6
+ def setup
7
+ list_repo = flexmock("list_repo")
8
+ list_repo.should_receive(:get_list_name_by_id).and_return("Home")
9
+ list_repo.should_receive(:get_list_id_by_name).and_return(1)
10
+ @repo = flexmock(RtmTaskRepository.new(list_repo))
11
+ end
12
+
13
+ def test_repo_creates_string_filter_expression
14
+ @repo.should_receive(:all_tasks_filtered).with("status:completed and due:today").and_return([])
15
+ @repo.get_tasks(:status => 'completed', :due => 'today')
16
+ end
17
+
18
+ def test_repo_returns_the_list_of_tasks
19
+ t = OpenStruct.new(:task_id => 17, :name => "test", :list_id => 1)
20
+ @repo.should_receive(:all_tasks_filtered).and_return([t])
21
+
22
+ tasks = @repo.get_tasks(:list => 'Home')
23
+ assert_equal 1,tasks.size
24
+ assert_equal Task.new(17, 'test', 'Home'), tasks[0]
25
+ end
26
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rmilk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.6
5
+ platform: ruby
6
+ authors:
7
+ - Victor Savkin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-24 00:00:00 +10:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: flexmock
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: rufus-rtm
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: require_all
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ description:
46
+ email: avix1000@gmail.com
47
+ executables:
48
+ - rmilk
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - README.rdoc
53
+ files:
54
+ - README.rdoc
55
+ - Rakefile
56
+ - bin/rmilk
57
+ - lib/import_rmilk.rb
58
+ - lib/rmilk
59
+ - lib/rmilk/rmilk_runner.rb
60
+ - lib/rmilk/context_storage.rb
61
+ - lib/rmilk/version.rb
62
+ - lib/rmilk/task.rb
63
+ - lib/rmilk/rtm_task_repository.rb
64
+ - lib/rmilk/console_ui.rb
65
+ - lib/rmilk/output_formatter.rb
66
+ - lib/rmilk/input_parser.rb
67
+ - lib/rmilk/rtm_list_repository.rb
68
+ - lib/rmilk.rb
69
+ - test/unit
70
+ - test/unit/context_storage_test.rb
71
+ - test/unit/input_parser_test.rb
72
+ - test/unit/rtm_list_repository_test.rb
73
+ - test/unit/rtm_task_repository_test.rb
74
+ - test/unit/output_formatter_test_test.rb
75
+ - test/test_helper.rb
76
+ has_rdoc: true
77
+ homepage: http://my-site.net
78
+ post_install_message:
79
+ rdoc_options:
80
+ - --main
81
+ - README.rdoc
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: "0"
89
+ version:
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: "0"
95
+ version:
96
+ requirements: []
97
+
98
+ rubyforge_project:
99
+ rubygems_version: 1.3.1
100
+ signing_key:
101
+ specification_version: 2
102
+ summary: This gem provides console ui for RMilk service
103
+ test_files: []
104
+