ruby-notes 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
+
4
+ require 'notes'
5
+ module Notes
6
+ parser = Options::OptionParser.new ARGV
7
+ crud_controller = CRUDController.new 'notes'
8
+ crud_controller.perform_action parser.parse
9
+ end
@@ -0,0 +1,35 @@
1
+ require 'trollop'
2
+ require 'mongo'
3
+ require 'set'
4
+
5
+ require 'notes/export/base_export'
6
+ require 'notes/export/console_export'
7
+ require 'notes/export/html_export'
8
+ require 'notes/export/csv_export'
9
+
10
+ require 'notes/model/note'
11
+ require 'notes/model/criteria'
12
+
13
+ require 'notes/controller/option_parser'
14
+ require 'notes/controller/crud_controller'
15
+ require 'notes/controller/db_controller'
16
+
17
+ require 'notes/utils/array_util'
18
+
19
+ require 'notes/options/base_option'
20
+ require 'notes/options/add_note'
21
+ require 'notes/options/description'
22
+ require 'notes/options/due_date'
23
+ require 'notes/options/find_note'
24
+ require 'notes/options/token'
25
+ require 'notes/options/remove_note'
26
+ require 'notes/options/tag'
27
+ require 'notes/options/update_note'
28
+ require 'notes/options/html'
29
+ require 'notes/options/csv'
30
+ require 'notes/options/console'
31
+ require 'notes/options/options'
32
+ require 'notes/options/current'
33
+ require 'notes/options/option_consts'
34
+ require 'notes/options/all'
35
+
@@ -0,0 +1,63 @@
1
+ module Notes
2
+ class CRUDController
3
+ def initialize collection_name
4
+ @db_controller = DatabaseController.new collection_name
5
+ end
6
+
7
+ def perform_action options
8
+ init options
9
+ if @options[Options::ADD_NOTE]
10
+ create
11
+ elsif @options[Options::REMOVE_NOTE]
12
+ remove
13
+ elsif @options[Options::UPDATE_NOTE]
14
+ update
15
+ elsif @options[Options::FIND_NOTE]
16
+ find
17
+ end
18
+ end
19
+
20
+ private
21
+ def init options
22
+ @options = options
23
+ @criterias = get_criterias
24
+ if options[Options::CONSOLE_EXPORT]
25
+ @export = ConsoleExport.new
26
+ elsif options[Options::HTML_EXPORT]
27
+ @export = HtmlExport.new options[Options::HTML_EXPORT]
28
+ elsif options[Options::CSV_EXPORT]
29
+ @export = CsvExport.new options[Options::CSV_EXPORT]
30
+ end
31
+ end
32
+
33
+ def create
34
+ @db_controller.create Note.new @options
35
+ end
36
+
37
+ def remove
38
+ @db_controller.remove @criterias
39
+ end
40
+
41
+ def update
42
+ @db_controller.update Note.new(@options), @criterias
43
+ end
44
+
45
+ def find
46
+ result_collection = @db_controller.find @criterias
47
+ if result_collection
48
+ puts @export.export_notes result_collection
49
+ end
50
+ end
51
+
52
+ def get_criterias
53
+ result = []
54
+ criterias = [Options::TAG, Options::DESCRIPTION, Options::CURRENT, Options::DUE_DATE, Options::TOKEN , Options::ALL]
55
+ @options.each do |key, value|
56
+ if criterias.include?(key) && @options[key] && @options[key] != []
57
+ result << Criteria.new(key.to_s, value)
58
+ end
59
+ end
60
+ result
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,63 @@
1
+ module Notes
2
+ class DatabaseController
3
+ def initialize collection_name
4
+ @collection = Mongo::Connection.new('localhost').db('notes')[collection_name]
5
+ end
6
+
7
+ def find criterias
8
+ if should_apply_to_all?(criterias)
9
+ return get_all_records
10
+ end
11
+ @collection.find({'$and' => get_criterias_as_hashes(criterias)})
12
+ end
13
+
14
+ def find_one criterias
15
+ @collection.find_one({'$and' => get_criterias_as_hashes(criterias)})
16
+ end
17
+
18
+ def get_all_records
19
+ @collection.find
20
+ end
21
+
22
+ def create note
23
+ @collection.insert(note.to_hash)
24
+ end
25
+
26
+ def remove criterias
27
+ if should_apply_to_all?(criterias)
28
+ remove_all
29
+ return
30
+ end
31
+ @collection.remove({'$and' => get_criterias_as_hashes(criterias)})
32
+ end
33
+
34
+ def remove_all
35
+ @collection.remove({})
36
+ end
37
+
38
+ def update note, criterias
39
+ criterias.each do |criteria|
40
+ @collection.update({'token' => note.token}, {'$set' => {criteria.name => criteria.value}})
41
+ end
42
+ end
43
+
44
+ private
45
+ def should_apply_to_all?(criterias)
46
+ criteria_hashes = get_criterias_as_hashes criterias
47
+ criteria_hashes.each do |criteria|
48
+ if criteria[Notes::Options::ALL.to_s]
49
+ return true
50
+ end
51
+ end
52
+ false
53
+ end
54
+
55
+ def get_criterias_as_hashes criterias
56
+ result = []
57
+ criterias.each do |criteria|
58
+ result << criteria.to_hash
59
+ end
60
+ result
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,18 @@
1
+ module Notes
2
+ module Options
3
+ class OptionParser
4
+ def initialize(args)
5
+ @parsed_options = {}
6
+ end
7
+
8
+ def parse
9
+ @parsed_options = Trollop::options do
10
+ Options.get_options.each do |option|
11
+ opt option.name, option.description, option.options
12
+ end
13
+ end
14
+ @parsed_options
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module Notes
2
+ class BaseExport
3
+
4
+ TOKEN = 'TOKEN'
5
+ TAG = 'TAG'
6
+ DESCRIPTION = 'DESCRIPTION'
7
+ DUE_DATE = 'DUE DATE'
8
+
9
+ private
10
+ def get_tags_string tags
11
+ if tags.kind_of? Array
12
+ return Notes::ArrayUtil.array_to_string tags
13
+ end
14
+ tags
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ module Notes
2
+ class ConsoleExport < BaseExport
3
+ TOKEN_FIELD_LENGTH = 20
4
+ TAG_FIELD_LENGTH = 25
5
+ DESCRIPTION_FIELD_LENGTH = 50
6
+ DUE_DATE_FIELD_LENGTH = 14
7
+ HEADER = '+' + '-' * (TOKEN_FIELD_LENGTH + TAG_FIELD_LENGTH + DESCRIPTION_FIELD_LENGTH + DUE_DATE_FIELD_LENGTH + 3) + '+'
8
+
9
+ def export_notes note_list
10
+ result = HEADER + "\n"
11
+ heading = center_in_container(TOKEN_FIELD_LENGTH, TOKEN) + center_in_container(TAG_FIELD_LENGTH, TAG)
12
+ heading += center_in_container(DESCRIPTION_FIELD_LENGTH, DESCRIPTION) + center_in_container(DUE_DATE_FIELD_LENGTH, DUE_DATE)
13
+ result += heading + '|' + "\n"
14
+ result += HEADER + "\n"
15
+ note_list.each do |note|
16
+ result += export_note note
17
+ result += "\n"
18
+ end
19
+ result += HEADER + "\n"
20
+ result
21
+ end
22
+
23
+ def export_note(note_hash)
24
+ result = center_in_container(TOKEN_FIELD_LENGTH, note_hash[Options::TOKEN.to_s])
25
+ result += center_in_container(TAG_FIELD_LENGTH, get_tags_string(note_hash[Options::TAG.to_s]))
26
+ result += center_in_container(DESCRIPTION_FIELD_LENGTH, note_hash[Options::DESCRIPTION.to_s])
27
+ result += center_in_container(DUE_DATE_FIELD_LENGTH, note_hash[Options::DUE_DATE.to_s])
28
+ result += '|'
29
+ result
30
+ end
31
+
32
+ private
33
+ def center_in_container(container_length, content)
34
+ '|' + ' ' * ((container_length - content.length)/2.0).floor + content + ' ' * ((container_length - content.length)/2.0).ceil
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,27 @@
1
+ module Notes
2
+ class CsvExport < BaseExport
3
+ CSV_VALUE_SEPARATOR = ', '
4
+
5
+ def initialize output_file_path
6
+ @file = File.new output_file_path, 'w+'
7
+ end
8
+
9
+ def export_notes notes_list
10
+ res = TOKEN + CSV_VALUE_SEPARATOR + TAG + CSV_VALUE_SEPARATOR + DESCRIPTION + CSV_VALUE_SEPARATOR + DUE_DATE + "\n"
11
+ notes_list.each do |note|
12
+ res += export_note note
13
+ res += "\n"
14
+ end
15
+ res.chomp! "\n"
16
+ @file.puts res
17
+ @file.close
18
+ end
19
+
20
+ def export_note note_hash
21
+ res = note_hash[Options::TOKEN.to_s] + CSV_VALUE_SEPARATOR + get_tags_string(note_hash[Options::TAG.to_s])
22
+ res += CSV_VALUE_SEPARATOR + '"' + note_hash[Options::DESCRIPTION.to_s] + '"'
23
+ res += CSV_VALUE_SEPARATOR + note_hash[Options::DUE_DATE.to_s]
24
+ res
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,51 @@
1
+ module Notes
2
+ class HtmlExport < BaseExport
3
+ DOCTYPE = '<!DOCTYPE html>'
4
+ HTML = '<html>'
5
+ HEAD = '<head>'
6
+ BODY = '<body>'
7
+ ENCODING = '<meta http-equiv="content-type" content="text/html; charset=utf-8" />'
8
+ TITLE = '<title>Notes</title>'
9
+ TABLE = '<table style="text-align: center;">'
10
+ TABLE_ROW = '<tr>'
11
+ TABLE_CELL = '<td>'
12
+
13
+ def initialize output_file_path
14
+ @file = File.new output_file_path , 'w+'
15
+ end
16
+
17
+ def export_notes notes_list
18
+ res = TABLE + TABLE_ROW + TABLE_CELL + TOKEN + get_closing_tag(TABLE_CELL) + TABLE_CELL + TAG + get_closing_tag(TABLE_CELL)
19
+ res += TABLE_CELL + DESCRIPTION + get_closing_tag(TABLE_CELL) + TABLE_CELL + DUE_DATE + get_closing_tag(TABLE_CELL)
20
+ res += get_closing_tag(TABLE_ROW)
21
+ notes_list.each do |note|
22
+ res += export_note note
23
+ end
24
+ res += get_closing_tag TABLE
25
+ @file.puts(attach_headers res)
26
+ @file.close
27
+ end
28
+
29
+ def export_note note_hash
30
+ res = TABLE_ROW
31
+ res += TABLE_CELL + note_hash[Notes::Options::TOKEN.to_s] + get_closing_tag(TABLE_CELL)
32
+ res += TABLE_CELL + get_tags_string(note_hash[Notes::Options::TAG.to_s]) + get_closing_tag(TABLE_CELL)
33
+ res += TABLE_CELL + note_hash[Notes::Options::DESCRIPTION.to_s] + get_closing_tag(TABLE_CELL)
34
+ res += TABLE_CELL + note_hash[Notes::Options::DUE_DATE.to_s] + get_closing_tag(TABLE_CELL)
35
+ res += get_closing_tag(TABLE_ROW)
36
+ res
37
+ end
38
+
39
+ private
40
+ def attach_headers html_body
41
+ res = DOCTYPE + HTML + HEAD + ENCODING
42
+ res += TITLE + get_closing_tag(HEAD)
43
+ res += BODY + html_body + get_closing_tag(BODY) + get_closing_tag(HTML)
44
+ res
45
+ end
46
+
47
+ def get_closing_tag opening_tag
48
+ opening_tag.sub("<","</")
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,16 @@
1
+ module Notes
2
+ class Criteria
3
+ attr_reader :name, :value
4
+ def initialize(name, value)
5
+ @name = name
6
+ @value = value
7
+ end
8
+
9
+ def to_hash
10
+ if @value.kind_of? Array
11
+ return {@name => (Notes::ArrayUtil.array_to_string @value)}
12
+ end
13
+ {@name => @value}
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,25 @@
1
+ module Notes
2
+ class Note
3
+ attr_reader :tag, :description, :due_date, :token
4
+
5
+ def initialize options
6
+ @tag = (options[Options::TAG] && options[Options::TAG] != [])? options[Options::TAG] : 'unspecified'
7
+ @description = options[Options::DESCRIPTION] ? options[Options::DESCRIPTION] : 'unspecified'
8
+ @due_date = options[Options::DUE_DATE] ? options[Options::DUE_DATE] : 'unspecified'
9
+ @token = options[Options::TOKEN] ? options[Options::TOKEN] : 'unspecified'
10
+ end
11
+
12
+ def to_hash
13
+ result_hash = {}
14
+ result_hash[Options::TAG.to_s] = @tag
15
+ result_hash[Options::DESCRIPTION.to_s] = @description
16
+ result_hash[Options::DUE_DATE.to_s] = @due_date
17
+ result_hash[Options::TOKEN.to_s] = get_token.to_s
18
+ result_hash
19
+ end
20
+
21
+ def get_token
22
+ @tag.hash * 1231 + @description.hash * 1237 + @due_date.hash * 37
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ module Notes
2
+ module Options
3
+ class AddNote < BaseOption
4
+ def name
5
+ Notes::Options::ADD_NOTE
6
+ end
7
+
8
+ def description
9
+ 'Add a new note with the parameters specified'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module Notes
2
+ module Options
3
+ class All < BaseOption
4
+ def name
5
+ Notes::Options::ALL
6
+ end
7
+
8
+ def description
9
+ 'Specified action is applied to all the matching notes'
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,17 @@
1
+ module Notes
2
+ module Options
3
+ class BaseOption
4
+ def name
5
+ raise 'Unsupported operation'
6
+ end
7
+
8
+ def description
9
+ raise 'Unsupported operation'
10
+ end
11
+
12
+ def options
13
+ {:type => nil, :multi => false}
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Notes
2
+ module Options
3
+ class Console < BaseOption
4
+ def name
5
+ Notes::Options::CONSOLE_EXPORT
6
+ end
7
+
8
+ def description
9
+ 'The result of this operation(if any) will be printed in the console'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module Notes
2
+ module Options
3
+ class CSV < BaseOption
4
+ def name
5
+ Notes::Options::CSV_EXPORT
6
+ end
7
+
8
+ def options
9
+ { :type => String, :multi => false}
10
+ end
11
+
12
+ def description
13
+ 'The result of this operation(if any) will be printed in the file specified in csv format.'
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,13 @@
1
+ module Notes
2
+ module Options
3
+ class Current < BaseOption
4
+ def name
5
+ Notes::Options::CURRENT
6
+ end
7
+
8
+ def description
9
+ 'Specified action will only be applied to notes with due date that is after or coincides with the current day.'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module Notes
2
+ module Options
3
+ class Description < BaseOption
4
+ def name
5
+ Notes::Options::DESCRIPTION
6
+ end
7
+
8
+ def description
9
+ 'Specify the description for the note'
10
+ end
11
+
12
+ def options
13
+ {:type => String, :multi => false }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Notes
2
+ module Options
3
+ class DueDate < BaseOption
4
+ def name
5
+ Notes::Options::DUE_DATE
6
+ end
7
+
8
+ def description
9
+ 'Specify the due date for the note'
10
+ end
11
+
12
+ def options
13
+ {:type => String, :multi => false }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Notes
2
+ module Options
3
+ class FindNote < BaseOption
4
+ def name
5
+ Notes::Options::FIND_NOTE
6
+ end
7
+
8
+ def description
9
+ 'Finds the note specified.'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module Notes
2
+ module Options
3
+ class Html < BaseOption
4
+ def name
5
+ Notes::Options::HTML_EXPORT
6
+ end
7
+
8
+ def options
9
+ { :type => String, :multi => false }
10
+ end
11
+
12
+ def description
13
+ 'The result of this operation(if any) will be saved into the file given in html format'
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Notes
2
+ module Options
3
+ ADD_NOTE = :add_note
4
+ REMOVE_NOTE = :remove_note
5
+ UPDATE_NOTE = :update_note
6
+ FIND_NOTE = :find_note
7
+ TAG = :tag
8
+ DESCRIPTION = :description
9
+ DUE_DATE = :due_date
10
+ TOKEN = :token
11
+ CONSOLE_EXPORT = :console
12
+ CSV_EXPORT = :csv
13
+ HTML_EXPORT = :html
14
+ CURRENT = :current
15
+ ALL = :all
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ module Notes
2
+ module Options
3
+ class Options
4
+ def self.get_options
5
+ options = [AddNote.new, RemoveNote.new, FindNote.new, UpdateNote.new]
6
+ options += [Tag.new, Description.new, DueDate.new, Token.new, Html.new]
7
+ options += [CSV.new, Console.new, Current.new, All.new]
8
+ options
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module Notes
2
+ module Options
3
+ class RemoveNote < BaseOption
4
+ def name
5
+ Notes::Options::REMOVE_NOTE
6
+ end
7
+
8
+ def description
9
+ 'Removes the specified note'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module Notes
2
+ module Options
3
+ class Tag < BaseOption
4
+ def name
5
+ Notes::Options::TAG
6
+ end
7
+
8
+ def description
9
+ 'Specified action only takes effect on notes with the tag given.'
10
+ end
11
+
12
+ def options
13
+ {:type => String, :multi => true}
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Notes
2
+ module Options
3
+ class Token < BaseOption
4
+ def name
5
+ Notes::Options::TOKEN
6
+ end
7
+
8
+ def description
9
+ 'Specified action is only applied to the note with the id given.'
10
+ end
11
+
12
+ def options
13
+ { :type => String, :multi => false}
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Notes
2
+ module Options
3
+ class UpdateNote < BaseOption
4
+ def name
5
+ Notes::Options::UPDATE_NOTE
6
+ end
7
+
8
+ def description
9
+ 'Update the note given'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ describe Notes::Criteria do
2
+ describe 'initialization' do
3
+ it 'correctly initializes fields' do
4
+ criteria = Notes::Criteria.new 'name', 'value'
5
+ criteria.name.should eq 'name'
6
+ criteria.value.should eq 'value'
7
+ end
8
+ end
9
+
10
+ describe 'to_hash' do
11
+ it 'correctly creates corresponding hash' do
12
+ criteria = Notes::Criteria.new 'name', 'value'
13
+ criteria.to_hash.should eq ({'name' => 'value'})
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,32 @@
1
+ describe Notes::CRUDController do
2
+ describe 'it correctly performs action' do
3
+
4
+ before do
5
+ @crud_controller = Notes::CRUDController.new 'test'
6
+ @db_controller = Notes::DatabaseController.new 'test'
7
+ end
8
+
9
+ after do
10
+ @crud_controller.perform_action({Notes::Options::REMOVE_NOTE => true, Notes::Options::ALL => true})
11
+ end
12
+
13
+ it 'creates new note' do
14
+ @crud_controller.perform_action({Notes::Options::ADD_NOTE => true})
15
+ result_count = 0
16
+ @db_controller.get_all_records.each do |record|
17
+ result_count += 1
18
+ end
19
+ result_count.should eq 1
20
+ end
21
+
22
+ it 'removes note' do
23
+ @crud_controller.perform_action({Notes::Options::ADD_NOTE => true, Notes::Options::TAG => 'to do'})
24
+ @crud_controller.perform_action({Notes::Options::REMOVE_NOTE => true, Notes::Options::TAG => 'to do'})
25
+ result_count = 0
26
+ @db_controller.get_all_records.each do |record|
27
+ result_count += 1
28
+ end
29
+ result_count.should eq 0
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,51 @@
1
+ describe 'works with db' do
2
+
3
+ before do
4
+ @db_controller = Notes::DatabaseController.new 'spec'
5
+ test_hash = {}
6
+ test_hash[Notes::Options::TAG] = 'to do'
7
+ test_hash[Notes::Options::DESCRIPTION] = 'description'
8
+ test_hash[Notes::Options::DUE_DATE] = '16.02.2012'
9
+ @note = Notes::Note.new(test_hash)
10
+ @db_controller.create @note
11
+ end
12
+
13
+ after do
14
+ @db_controller.remove_all
15
+ end
16
+
17
+ it 'can insert and find notes notes successfully' do
18
+ search_criteria = [Notes::Criteria.new(Notes::Options::TAG.to_s, 'to do')]
19
+ search_criteria << Notes::Criteria.new(Notes::Options::DESCRIPTION.to_s, 'description')
20
+ search_criteria << Notes::Criteria.new(Notes::Options::DUE_DATE.to_s, '16.02.2012')
21
+ query_result = @db_controller.find search_criteria
22
+ result_length = 0
23
+ query_result.each do |result|
24
+ result_length += 1
25
+ end
26
+ result_length.should eq 1
27
+ end
28
+
29
+ it 'can update note' do
30
+ inserted_note = @db_controller.find_one([Notes::Criteria.new(Notes::Options::TAG.to_s, 'to do')])
31
+ update_criteria = [Notes::Criteria.new(Notes::Options::TAG.to_s, 'other')]
32
+ @db_controller.update(Notes::Note.new({Notes::Options::TOKEN => inserted_note[Notes::Options::TOKEN.to_s]}), update_criteria)
33
+ query_result = @db_controller.find update_criteria
34
+ result_length = 0
35
+ query_result.each do |result|
36
+ result_length +=1
37
+ end
38
+ result_length.should eq 1
39
+ end
40
+
41
+ it 'can remove note' do
42
+ criterias = [Notes::Criteria.new(Notes::Options::TAG.to_s, 'to do')]
43
+ @db_controller.remove criterias
44
+ query_result = @db_controller.find criterias
45
+ result_length = 0
46
+ query_result.each do |result|
47
+ result_length +=1
48
+ end
49
+ result_length.should eq 0
50
+ end
51
+ end
@@ -0,0 +1,84 @@
1
+ describe 'export' do
2
+
3
+ before do
4
+ @test_hash = {}
5
+ @test_hash[Notes::Options::TOKEN.to_s] = '1963438776275'
6
+ @test_hash[Notes::Options::TAG.to_s] = 'unspecified'
7
+ @test_hash[Notes::Options::DESCRIPTION.to_s] = 'asd'
8
+ @test_hash[Notes::Options::DUE_DATE.to_s] = 'unspecified'
9
+ end
10
+
11
+ describe 'console export' do
12
+ it 'renders properly single line output'do
13
+ console_export = Notes::ConsoleExport.new
14
+ console_export.export_notes([@test_hash]).should eq <<EXPORT
15
+ +----------------------------------------------------------------------------------------------------------------+
16
+ | TOKEN | TAG | DESCRIPTION | DUE DATE |
17
+ +----------------------------------------------------------------------------------------------------------------+
18
+ | 1963438776275 | unspecified | asd | unspecified |
19
+ +----------------------------------------------------------------------------------------------------------------+
20
+ EXPORT
21
+ end
22
+
23
+ it 'renders properly complex output' do
24
+ console_export = Notes::ConsoleExport.new
25
+ console_export.export_notes([@test_hash,@test_hash,@test_hash]).should eq <<EXPORT
26
+ +----------------------------------------------------------------------------------------------------------------+
27
+ | TOKEN | TAG | DESCRIPTION | DUE DATE |
28
+ +----------------------------------------------------------------------------------------------------------------+
29
+ | 1963438776275 | unspecified | asd | unspecified |
30
+ | 1963438776275 | unspecified | asd | unspecified |
31
+ | 1963438776275 | unspecified | asd | unspecified |
32
+ +----------------------------------------------------------------------------------------------------------------+
33
+ EXPORT
34
+ end
35
+ end
36
+
37
+ describe 'html export' do
38
+ after do
39
+ File.delete "./out.html"
40
+ end
41
+ it 'renders properly single line output' do
42
+ html_export = Notes::HtmlExport.new './out.html'
43
+ html_export.export_notes [@test_hash]
44
+ IO.read("./out.html").should eq <<EXPORT
45
+ <!DOCTYPE html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>Notes</title></head><body><table style="text-align: center;"><tr><td>TOKEN</td><td>TAG</td><td>DESCRIPTION</td><td>DUE DATE</td></tr><tr><td>1963438776275</td><td>unspecified</td><td>asd</td><td>unspecified</td></tr></table style="text-align: center;"></body></html>
46
+ EXPORT
47
+ end
48
+
49
+ it 'renders complex output correctly' do
50
+ html_export = Notes::HtmlExport.new './out.html'
51
+ html_export.export_notes [@test_hash,@test_hash,@test_hash]
52
+ IO.read("./out.html").should eq <<EXPORT
53
+ <!DOCTYPE html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>Notes</title></head><body><table style="text-align: center;"><tr><td>TOKEN</td><td>TAG</td><td>DESCRIPTION</td><td>DUE DATE</td></tr><tr><td>1963438776275</td><td>unspecified</td><td>asd</td><td>unspecified</td></tr><tr><td>1963438776275</td><td>unspecified</td><td>asd</td><td>unspecified</td></tr><tr><td>1963438776275</td><td>unspecified</td><td>asd</td><td>unspecified</td></tr></table style="text-align: center;"></body></html>
54
+ EXPORT
55
+ end
56
+ end
57
+
58
+ describe 'csv export' do
59
+
60
+ after do
61
+ File.delete './out.csv'
62
+ end
63
+
64
+ it 'renders properly single line output' do
65
+ csv_export = Notes::CsvExport.new './out.csv'
66
+ csv_export.export_notes [@test_hash]
67
+ IO.read("./out.csv").should eq <<EXPORT
68
+ TOKEN, TAG, DESCRIPTION, DUE DATE
69
+ 1963438776275, unspecified, "asd", unspecified
70
+ EXPORT
71
+ end
72
+
73
+ it 'renders complex output correctly' do
74
+ csv_export = Notes::CsvExport.new './out.csv'
75
+ csv_export.export_notes [@test_hash, @test_hash, @test_hash]
76
+ IO.read("./out.csv").should eq <<EXPORT
77
+ TOKEN, TAG, DESCRIPTION, DUE DATE
78
+ 1963438776275, unspecified, "asd", unspecified
79
+ 1963438776275, unspecified, "asd", unspecified
80
+ 1963438776275, unspecified, "asd", unspecified
81
+ EXPORT
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,52 @@
1
+ describe Notes::Note do
2
+ before do
3
+ @test_hash = {}
4
+ end
5
+
6
+ describe 'initialization' do
7
+ it 'can be initialized with default args' do
8
+ note = Notes::Note.new(@test_hash)
9
+ end
10
+
11
+ it 'gets default values if none were specified ' do
12
+ note = Notes::Note.new(@test_hash)
13
+ note.tag.should eq 'unspecified'
14
+ note.description.should eq 'unspecified'
15
+ note.due_date.should eq 'unspecified'
16
+ end
17
+
18
+ it 'correctly reads passed values' do
19
+ @test_hash[Notes::Options::TAG] = ['to do']
20
+ @test_hash[Notes::Options::DESCRIPTION] = 'description'
21
+ @test_hash[Notes::Options::DUE_DATE] = '18.02.2012'
22
+ note = Notes::Note.new @test_hash
23
+ note.tag.should eq ['to do']
24
+ note.description.should eq 'description'
25
+ note.due_date.should eq '18.02.2012'
26
+ end
27
+ end
28
+
29
+ describe 'to_hash' do
30
+ it 'correctly creates corresponding hash when no parameters are specified' do
31
+ note = Notes::Note.new(@test_hash)
32
+ @test_hash[Notes::Options::TAG.to_s] = 'unspecified'
33
+ @test_hash[Notes::Options::DESCRIPTION.to_s] = 'unspecified'
34
+ @test_hash[Notes::Options::DUE_DATE.to_s] = 'unspecified'
35
+ @test_hash[Notes::Options::TOKEN.to_s] = note.get_token.to_s
36
+ note.to_hash.should eq @test_hash
37
+ end
38
+
39
+ it 'correctly creates corresponding has when parameters are given' do
40
+ @test_hash[Notes::Options::TAG] = ['to do']
41
+ @test_hash[Notes::Options::DESCRIPTION] = 'description'
42
+ @test_hash[Notes::Options::DUE_DATE] = '18.02.2012'
43
+ note = Notes::Note.new @test_hash
44
+ test_against_hash = {}
45
+ test_against_hash[Notes::Options::TAG.to_s] = ['to do']
46
+ test_against_hash[Notes::Options::DESCRIPTION.to_s] = 'description'
47
+ test_against_hash[Notes::Options::DUE_DATE.to_s] = '18.02.2012'
48
+ test_against_hash[Notes::Options::TOKEN.to_s] = note.get_token.to_s
49
+ note.to_hash.should eq test_against_hash
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,86 @@
1
+ describe 'Options' do
2
+ describe 'initialization' do
3
+ it 'returns name, description and type correctly' do
4
+ add_note = Notes::Options::AddNote.new
5
+ add_note.name.should eq Notes::Options::ADD_NOTE
6
+ add_note.description.should eq 'Add a new note with the parameters specified'
7
+ add_note.options.should eq ({:type => nil, :multi => false})
8
+ end
9
+
10
+ it 'returns name, description and type correctly' do
11
+ add_note = Notes::Options::Console.new
12
+ add_note.name.should eq Notes::Options::CONSOLE_EXPORT
13
+ add_note.description.should eq 'The result of this operation(if any) will be printed in the console'
14
+ add_note.options.should eq ({:type => nil, :multi => false})
15
+ end
16
+
17
+ it 'returns name, description and type correctly' do
18
+ add_note = Notes::Options::CSV.new
19
+ add_note.name.should eq Notes::Options::CSV_EXPORT
20
+ add_note.description.should eq 'The result of this operation(if any) will be printed in the file specified in csv format.'
21
+ add_note.options.should eq ({:type => String, :multi => false})
22
+ end
23
+
24
+ it 'returns name, description and type correctly' do
25
+ add_note = Notes::Options::Current.new
26
+ add_note.name.should eq Notes::Options::CURRENT
27
+ add_note.description.should eq 'Specified action will only be applied to notes with due date that is after or coincides with the current day.'
28
+ add_note.options.should eq ({:type => nil, :multi => false})
29
+ end
30
+
31
+ it 'returns name, description and type correctly' do
32
+ add_note = Notes::Options::Description.new
33
+ add_note.name.should eq Notes::Options::DESCRIPTION
34
+ add_note.description.should eq 'Specify the description for the note'
35
+ add_note.options.should eq ({:type => String, :multi => false})
36
+ end
37
+
38
+ it 'returns name, description and type correctly' do
39
+ add_note = Notes::Options::DueDate.new
40
+ add_note.name.should eq Notes::Options::DUE_DATE
41
+ add_note.description.should eq 'Specify the due date for the note'
42
+ add_note.options.should eq ({:type => String, :multi => false})
43
+ end
44
+
45
+ it 'returns name, description and type correctly' do
46
+ add_note = Notes::Options::FindNote.new
47
+ add_note.name.should eq Notes::Options::FIND_NOTE
48
+ add_note.description.should eq 'Finds the note specified.'
49
+ add_note.options.should eq ({:type => nil, :multi => false})
50
+ end
51
+ it 'returns name, description and type correctly' do
52
+ add_note = Notes::Options::Html.new
53
+ add_note.name.should eq Notes::Options::HTML_EXPORT
54
+ add_note.description.should eq 'The result of this operation(if any) will be saved into the file given in html format'
55
+ add_note.options.should eq ({:type => String, :multi => false})
56
+ end
57
+
58
+ it 'returns name, description and type correctly' do
59
+ add_note = Notes::Options::Token.new
60
+ add_note.name.should eq Notes::Options::TOKEN
61
+ add_note.description.should eq 'Specified action is only applied to the note with the id given.'
62
+ add_note.options.should eq ({:type => String, :multi => false})
63
+ end
64
+
65
+ it 'returns name, description and type correctly' do
66
+ add_note = Notes::Options::RemoveNote.new
67
+ add_note.name.should eq Notes::Options::REMOVE_NOTE
68
+ add_note.description.should eq 'Removes the specified note'
69
+ add_note.options.should eq ({:type => nil, :multi => false})
70
+ end
71
+
72
+ it 'returns name, description and type correctly' do
73
+ add_note = Notes::Options::Tag.new
74
+ add_note.name.should eq Notes::Options::TAG
75
+ add_note.description.should eq 'Specified action only takes effect on notes with the tag given.'
76
+ add_note.options.should eq ({:type => String, :multi => true})
77
+ end
78
+
79
+ it 'returns name, description and type correctly' do
80
+ add_note = Notes::Options::UpdateNote.new
81
+ add_note.name.should eq Notes::Options::UPDATE_NOTE
82
+ add_note.description.should eq 'Update the note given'
83
+ add_note.options.should eq ({:type => nil, :multi => false})
84
+ end
85
+ end
86
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-notes
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 0
9
+ version: 1.0.0
10
+ platform: ruby
11
+ authors:
12
+ - Martin Asenov
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2012-02-17 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Ruby notes is a console lne tool that let you keep reminders/notes and afterwards search within them and export the result to various formats.
22
+ email: asenov.m@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - bin/notes.rb
31
+ - lib/notes.rb
32
+ - lib/notes/controller/crud_controller.rb
33
+ - lib/notes/controller/db_controller.rb
34
+ - lib/notes/controller/option_parser.rb
35
+ - lib/notes/export/base_export.rb
36
+ - lib/notes/export/console_export.rb
37
+ - lib/notes/export/csv_export.rb
38
+ - lib/notes/export/html_export.rb
39
+ - lib/notes/model/note.rb
40
+ - lib/notes/model/criteria.rb
41
+ - lib/notes/options/add_note.rb
42
+ - lib/notes/options/all.rb
43
+ - lib/notes/options/base_option.rb
44
+ - lib/notes/options/console.rb
45
+ - lib/notes/options/csv.rb
46
+ - lib/notes/options/current.rb
47
+ - lib/notes/options/description.rb
48
+ - lib/notes/options/due_date.rb
49
+ - lib/notes/options/find_note.rb
50
+ - lib/notes/options/html.rb
51
+ - lib/notes/options/option_consts.rb
52
+ - lib/notes/options/options.rb
53
+ - lib/notes/options/remove_note.rb
54
+ - lib/notes/options/tag.rb
55
+ - lib/notes/options/token.rb
56
+ - lib/notes/options/update_note.rb
57
+ - spec/criteria_spec.rb
58
+ - spec/crud_spec.rb
59
+ - spec/db_spec.rb
60
+ - spec/export_spec.rb
61
+ - spec/note_spec.rb
62
+ - spec/options_spec.rb
63
+ has_rdoc: true
64
+ homepage: https://github.com/asenovm/Ruby-Notes
65
+ licenses: []
66
+
67
+ post_install_message:
68
+ rdoc_options: []
69
+
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ segments:
78
+ - 0
79
+ version: "0"
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ requirements: []
89
+
90
+ rubyforge_project:
91
+ rubygems_version: 1.3.7
92
+ signing_key:
93
+ specification_version: 3
94
+ summary: console line tool that let you easily keep reminders/notes.
95
+ test_files:
96
+ - spec/criteria_spec.rb
97
+ - spec/crud_spec.rb
98
+ - spec/db_spec.rb
99
+ - spec/export_spec.rb
100
+ - spec/note_spec.rb
101
+ - spec/options_spec.rb