oughtve 110.e2f5bb28

Sign up to get free protection for your applications and to get access to all the features.
data/doc/TODO ADDED
@@ -0,0 +1,13 @@
1
+ To Do
2
+ =======
3
+
4
+ - Improve command parser. Guess more.
5
+
6
+ - Separate into entry, view, manage scripts.
7
+
8
+ - Need for several databases?
9
+
10
+ - Delete orphaned Chapters and Verses.
11
+
12
+ - Change the stupid names.
13
+
data/lib/oughtve.rb ADDED
@@ -0,0 +1,87 @@
1
+ # LICENCE
2
+ # =========
3
+ #
4
+ # Authors
5
+ # ---------
6
+ #
7
+ # See doc/AUTHORS.
8
+ #
9
+ #
10
+ # Copyright
11
+ # -----------
12
+ #
13
+ # Copyright (c) 2006-2010 Eero Saynatkari, all rights reserved.
14
+ #
15
+ #
16
+ # Licence
17
+ # ---------
18
+ #
19
+ # Redistribution and use in source and binary forms, with or without
20
+ # modification, are permitted provided that the following conditions
21
+ # are met:
22
+ #
23
+ # - Redistributions of source code must retain the above copyright
24
+ # notice, this list of conditions, the following disclaimer and
25
+ # attribution to the original authors.
26
+ #
27
+ # - Redistributions in binary form must reproduce the above copyright
28
+ # notice, this list of conditions, the following disclaimer and
29
+ # attribution to the original authors in the documentation and/or
30
+ # other materials provided with the distribution.
31
+ #
32
+ # - The names of the authors may not be used to endorse or promote
33
+ # products derived from this software without specific prior
34
+ # written permission.
35
+ #
36
+ #
37
+ # Disclaimer
38
+ # ------------
39
+ #
40
+ # This software is provided "as is" and without any express or
41
+ # implied warranties, including, without limitation, the implied
42
+ # warranties of merchantability and fitness for a particular purpose.
43
+ # Authors are not responsible for any damages, direct or indirect.
44
+ #
45
+
46
+ require "fileutils"
47
+
48
+
49
+ # Project
50
+ require "oughtve/errors"
51
+ require "oughtve/options"
52
+
53
+
54
+ module Oughtve
55
+
56
+ #
57
+ # Directory in which our resources are stored.
58
+ #
59
+ ResourceDirectory = File.expand_path File.join(ENV["HOME"], ".oughtve")
60
+
61
+
62
+ #
63
+ # Entry point to the library.
64
+ #
65
+ # Parses arguments and performs the requested action.
66
+ #
67
+ def self.run(arguments)
68
+ options = parse_from arguments
69
+
70
+ Database.connect and self.send options.action, options
71
+ end
72
+
73
+ #
74
+ # Bootstrap a brand new setup.
75
+ #
76
+ def self.bootstrap(*)
77
+ FileUtils.mkdir_p ResourceDirectory and Database.bootstrap
78
+ run %w[ --new --tangent default --directory / ]
79
+
80
+ "Oughtve has been set up. A default tangent has been created."
81
+ end
82
+
83
+
84
+ end
85
+
86
+ require "oughtve/database"
87
+
@@ -0,0 +1,93 @@
1
+ # LICENCE
2
+ # =========
3
+ #
4
+ # Authors
5
+ # ---------
6
+ #
7
+ # See doc/AUTHORS.
8
+ #
9
+ #
10
+ # Copyright
11
+ # -----------
12
+ #
13
+ # Copyright (c) 2006-2010 Eero Saynatkari, all rights reserved.
14
+ #
15
+ #
16
+ # Licence
17
+ # ---------
18
+ #
19
+ # Redistribution and use in source and binary forms, with or without
20
+ # modification, are permitted provided that the following conditions
21
+ # are met:
22
+ #
23
+ # - Redistributions of source code must retain the above copyright
24
+ # notice, this list of conditions, the following disclaimer and
25
+ # attribution to the original authors.
26
+ #
27
+ # - Redistributions in binary form must reproduce the above copyright
28
+ # notice, this list of conditions, the following disclaimer and
29
+ # attribution to the original authors in the documentation and/or
30
+ # other materials provided with the distribution.
31
+ #
32
+ # - The names of the authors may not be used to endorse or promote
33
+ # products derived from this software without specific prior
34
+ # written permission.
35
+ #
36
+ #
37
+ # Disclaimer
38
+ # ------------
39
+ #
40
+ # This software is provided "as is" and without any express or
41
+ # implied warranties, including, without limitation, the implied
42
+ # warranties of merchantability and fitness for a particular purpose.
43
+ # Authors are not responsible for any damages, direct or indirect.
44
+ #
45
+
46
+
47
+ module Oughtve
48
+
49
+ # Forward-declare Tangent
50
+ class Tangent; end
51
+
52
+
53
+ #
54
+ # A Chapter is a (hopefully) logical section of a Tangent.
55
+ #
56
+ class Chapter
57
+ include DataMapper::Resource
58
+
59
+ # Unique identifier
60
+ property :id, Serial
61
+
62
+ # Time when closed
63
+ property :ended, Time
64
+
65
+ # Summary of what the chapter was about
66
+ property :summary, Text
67
+
68
+
69
+ has n, :verses
70
+ belongs_to :tangent
71
+
72
+
73
+ #
74
+ # Hash representation of data, including all verses.
75
+ #
76
+ def to_hash()
77
+ closed, open = verses.partition {|verse| verse.struck }
78
+ hash = {:open => open.map {|v| v.to_hash },
79
+ :closed => closed.map {|v| v.to_hash }
80
+ }
81
+
82
+ if ended
83
+ hash[:ended] = ended
84
+ hash[:summary] = summary
85
+ end
86
+
87
+ hash
88
+ end
89
+
90
+ end
91
+
92
+ end
93
+
@@ -0,0 +1,83 @@
1
+ # LICENCE
2
+ # =========
3
+ #
4
+ # Authors
5
+ # ---------
6
+ #
7
+ # See doc/AUTHORS.
8
+ #
9
+ #
10
+ # Copyright
11
+ # -----------
12
+ #
13
+ # Copyright (c) 2006-2010 Eero Saynatkari, all rights reserved.
14
+ #
15
+ #
16
+ # Licence
17
+ # ---------
18
+ #
19
+ # Redistribution and use in source and binary forms, with or without
20
+ # modification, are permitted provided that the following conditions
21
+ # are met:
22
+ #
23
+ # - Redistributions of source code must retain the above copyright
24
+ # notice, this list of conditions, the following disclaimer and
25
+ # attribution to the original authors.
26
+ #
27
+ # - Redistributions in binary form must reproduce the above copyright
28
+ # notice, this list of conditions, the following disclaimer and
29
+ # attribution to the original authors in the documentation and/or
30
+ # other materials provided with the distribution.
31
+ #
32
+ # - The names of the authors may not be used to endorse or promote
33
+ # products derived from this software without specific prior
34
+ # written permission.
35
+ #
36
+ #
37
+ # Disclaimer
38
+ # ------------
39
+ #
40
+ # This software is provided "as is" and without any express or
41
+ # implied warranties, including, without limitation, the implied
42
+ # warranties of merchantability and fitness for a particular purpose.
43
+ # Authors are not responsible for any damages, direct or indirect.
44
+ #
45
+
46
+ require "rubygems"
47
+ require "dm-core"
48
+
49
+ require "oughtve/tangent"
50
+ require "oughtve/chapter"
51
+ require "oughtve/verse"
52
+
53
+
54
+ module Oughtve
55
+
56
+ module Database
57
+
58
+ # The database file path.
59
+ Path = File.expand_path "#{Oughtve::ResourceDirectory}/data.db"
60
+
61
+ # The full URI to access the DB.
62
+ URI = "sqlite3:///#{Path}"
63
+
64
+
65
+ #
66
+ # Connect to database (new or existing)
67
+ #
68
+ def self.connect()
69
+ DataMapper::Logger.new(STDOUT, :debug) if $VERBOSE
70
+ DataMapper.setup :default, URI
71
+ end
72
+
73
+ #
74
+ # Create a brand-new database.
75
+ #
76
+ def self.bootstrap()
77
+ raise OughtveError, "#{Path} already exists!" if File.exist? Path
78
+ connect and DataMapper.auto_migrate!
79
+ end
80
+
81
+ end
82
+
83
+ end
@@ -0,0 +1,6 @@
1
+
2
+ #
3
+ # Special type for our errors.
4
+ #
5
+ class OughtveError < StandardError; end
6
+
@@ -0,0 +1,193 @@
1
+ # LICENCE
2
+ # =========
3
+ #
4
+ # Authors
5
+ # ---------
6
+ #
7
+ # See doc/AUTHORS.
8
+ #
9
+ #
10
+ # Copyright
11
+ # -----------
12
+ #
13
+ # Copyright (c) 2006-2010 Eero Saynatkari, all rights reserved.
14
+ #
15
+ #
16
+ # Licence
17
+ # ---------
18
+ #
19
+ # Redistribution and use in source and binary forms, with or without
20
+ # modification, are permitted provided that the following conditions
21
+ # are met:
22
+ #
23
+ # - Redistributions of source code must retain the above copyright
24
+ # notice, this list of conditions, the following disclaimer and
25
+ # attribution to the original authors.
26
+ #
27
+ # - Redistributions in binary form must reproduce the above copyright
28
+ # notice, this list of conditions, the following disclaimer and
29
+ # attribution to the original authors in the documentation and/or
30
+ # other materials provided with the distribution.
31
+ #
32
+ # - The names of the authors may not be used to endorse or promote
33
+ # products derived from this software without specific prior
34
+ # written permission.
35
+ #
36
+ #
37
+ # Disclaimer
38
+ # ------------
39
+ #
40
+ # This software is provided "as is" and without any express or
41
+ # implied warranties, including, without limitation, the implied
42
+ # warranties of merchantability and fitness for a particular purpose.
43
+ # Authors are not responsible for any damages, direct or indirect.
44
+ #
45
+
46
+ require "optparse"
47
+ require "ostruct"
48
+
49
+
50
+ module Oughtve
51
+
52
+ #
53
+ # Parse allowed options from given arguments
54
+ #
55
+ def self.parse_from(arguments)
56
+ result = OpenStruct.new
57
+
58
+ # Grab time here to be a bit closer to true
59
+ result.time = Time.now
60
+
61
+ def result.action!(given)
62
+ raise ArgumentError, "Two actions given: 1) --#{action}, 2) --#{given}" if action
63
+ self.action = given
64
+ end
65
+
66
+ OptionParser.new do |opts|
67
+
68
+ opts.banner = "Usage: #{$0} [--ACTION [OPTIONS]]"
69
+
70
+ opts.separator ""
71
+ opts.separator " Actions:"
72
+
73
+
74
+ # Actions
75
+
76
+ opts.on "-s", "--scribe [TEXT]", "Enter a new note." do |text|
77
+ result.action! :scribe
78
+ result.text = text
79
+ end
80
+
81
+ opts.on "-S", "--strike [ID_OR_REGEXP]", "Strike out a note." do |id_or_regexp|
82
+ result.action! :strike
83
+
84
+ if id_or_regexp
85
+ begin
86
+ result.serial = Integer(id_or_regexp)
87
+ rescue ArgumentError
88
+ result.regexp = /#{Regexp.escape id_or_regexp}/
89
+ end
90
+ end
91
+ end
92
+
93
+ opts.on "-w", "--show [all | old]", "Show notes for tangent(s). [All notes / old chapters too]" do |specifier|
94
+ result.action! :show
95
+
96
+ if specifier
97
+ case specifier
98
+ when "all"
99
+ result.all = true
100
+ when "old"
101
+ result.all = true
102
+ result.old = true
103
+ else
104
+ raise ArgumentError, "--show #{specifier} is not a valid option!"
105
+ end
106
+ end
107
+ end
108
+
109
+ opts.on "-l", "--list", "Show defined Tangents and their base directories." do
110
+ result.action! :list
111
+ end
112
+
113
+ opts.on "-c", "--chapter ENDNOTE", "Mark end of chapter and start new one." do |endnote|
114
+ result.action! :chapter
115
+ result.endnote = endnote
116
+ end
117
+
118
+
119
+ # Options
120
+ opts.separator ""
121
+ opts.separator " Maintenance Actions:"
122
+
123
+ opts.on "-b", "--bootstrap", "Set up database and initial structures." do
124
+ result.action! :bootstrap
125
+ end
126
+
127
+ opts.on "-n", "--new", "Create new Tangent. (Use -t to give it a name.)" do
128
+ result.action! :tangent
129
+ end
130
+
131
+ opts.on "-D", "--delete [NAME]", "Delete tangent." do |name|
132
+ result.action! :delete
133
+ result.name = name
134
+ end
135
+
136
+
137
+ # Options
138
+ opts.separator ""
139
+ opts.separator " Options:"
140
+
141
+ opts.on "-d", "--directory DIR", "Use given directory instead of Dir.pwd." do |dir|
142
+ result.dir = dir
143
+ end
144
+
145
+ opts.on "-i", "--id ID", "Use specific note ID." do |id|
146
+ result.serial = id
147
+ end
148
+
149
+ opts.on "-m", "--match REGEXP", "Match note using regexp, specific branch only." do |regexp|
150
+ result.regexp = /#{Regexp.escape regexp}/
151
+ end
152
+
153
+ opts.on "-t", "--tangent NAME", "Use named Tangent specifically." do |name|
154
+ result.name = name
155
+ end
156
+
157
+ opts.on "-x", "--text TEXT", "Text to use for note." do |text|
158
+ result.text = text
159
+ end
160
+
161
+ opts.on "-v", "--verbose", "Give extra information for some actions." do
162
+ result.verbose = true
163
+ end
164
+
165
+ opts.on "-J", "--json", "JSON output" do
166
+ result.format = :json
167
+ end
168
+
169
+ opts.on "-Y", "--yaml", "YAML output" do
170
+ result.format = :yaml
171
+ end
172
+
173
+
174
+ # Bookkeeping stuff
175
+
176
+ opts.on_tail "-h", "--help", "Display this message." do
177
+ puts opts
178
+ exit!
179
+ end
180
+
181
+ end.parse! arguments
182
+
183
+ rescue OptionParser::InvalidOption => e
184
+ $stderr.print "\n#{e.message}\n\n"
185
+ parse_from %w[ -h ]
186
+
187
+ else
188
+ result.rest = arguments
189
+ result.action = :scribe unless result.action
190
+ result
191
+ end
192
+
193
+ end