yhara-ticketmap 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/.gitignore +2 -0
  2. data/.gitmodules +3 -0
  3. data/MANIFEST +29 -0
  4. data/README.rdoc +20 -0
  5. data/Rakefile +52 -0
  6. data/TODO +82 -0
  7. data/VERSION +1 -0
  8. data/controller/config.rb +9 -0
  9. data/controller/init.rb +7 -0
  10. data/controller/main.rb +11 -0
  11. data/controller/tickets.rb +49 -0
  12. data/db/migrate/001_create_tickets.rb +14 -0
  13. data/db/migrate/002_add_deleted_to_tickets.rb +13 -0
  14. data/db/migrate/003_add_timeouted_to_tickets.rb +13 -0
  15. data/main.rb +40 -0
  16. data/model/init.rb +32 -0
  17. data/model/ticket.rb +49 -0
  18. data/public/biwascheme/lib/biwascheme.js +106 -0
  19. data/public/biwascheme/lib/dumper.js +192 -0
  20. data/public/biwascheme/lib/extra_lib.js +534 -0
  21. data/public/biwascheme/lib/io.js +326 -0
  22. data/public/biwascheme/lib/prototype.js +4320 -0
  23. data/public/biwascheme/lib/r6rs_lib.js +2439 -0
  24. data/public/biwascheme/lib/stackbase.js +1697 -0
  25. data/public/biwascheme/lib/webscheme_lib.js +809 -0
  26. data/public/js/builder.js +136 -0
  27. data/public/js/controls.js +965 -0
  28. data/public/js/dragdrop.js +975 -0
  29. data/public/js/effects.js +1130 -0
  30. data/public/js/scriptaculous.js +60 -0
  31. data/public/js/slider.js +275 -0
  32. data/public/js/sound.js +55 -0
  33. data/public/js/unittest.js +568 -0
  34. data/public/scm/board.scm +23 -0
  35. data/public/scm/hand.scm +48 -0
  36. data/public/scm/main.scm +69 -0
  37. data/public/scm/server.scm +30 -0
  38. data/public/scm/ticket.scm +44 -0
  39. data/spec/config.rb +13 -0
  40. data/spec/helper.rb +2 -0
  41. data/spec/main.rb +13 -0
  42. data/spec/models.rb +34 -0
  43. data/spec/tickets.rb +65 -0
  44. data/ticketmap.gemspec +96 -0
  45. data/view/index.xhtml +63 -0
  46. data/view/track.xhtml +29 -0
  47. metadata +131 -0
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.swp
2
+ *.swo
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "public/biwascheme"]
2
+ path = public/biwascheme
3
+ url = git://github.com/yhara/biwascheme.git
data/MANIFEST ADDED
@@ -0,0 +1,29 @@
1
+ README.rdoc
2
+ TODO
3
+ bin/tickets-server
4
+ db/migrate/001_create_tickets.rb
5
+ db/migrate/002_add_deleted_to_tickets.rb
6
+ db/migrate/003_add_timeouted_to_tickets.rb
7
+ dot.tickets.conf.sample
8
+ model/ticket.rb
9
+ public/biwascheme/MIT-LICENSE.txt
10
+ public/biwascheme/README
11
+ public/biwascheme/lib/biwascheme.js
12
+ public/biwascheme/lib/extra_lib.js
13
+ public/biwascheme/lib/io.js
14
+ public/biwascheme/lib/prototype.js
15
+ public/biwascheme/lib/r6rs_lib.js
16
+ public/biwascheme/lib/stackbase.js
17
+ public/biwascheme/lib/webscheme_lib.js
18
+ public/js/builder.js
19
+ public/js/controls.js
20
+ public/js/dragdrop.js
21
+ public/js/effects.js
22
+ public/js/scriptaculous.js
23
+ public/js/slider.js
24
+ public/js/sound.js
25
+ public/js/unittest.js
26
+ public/scm/main.scm
27
+ public/scm/ticket.scm
28
+ tickets.gemspec
29
+ view/index.xhtml
data/README.rdoc ADDED
@@ -0,0 +1,20 @@
1
+ = tickets
2
+
3
+ Two-dimentional TODO manager.
4
+
5
+ == Install
6
+
7
+ gem install ramaze sequel sqlite3-ruby
8
+ gem install yhara-tickets
9
+
10
+ == Execute
11
+
12
+ tickets-server
13
+
14
+ then open http://localhost:7007/ in your browser.
15
+
16
+ in default, ~/.tickets.db is created to save tickets data.
17
+
18
+ == Configuration
19
+
20
+ write ~/.tickets.conf (see dot.tickets.conf.sample)
data/Rakefile ADDED
@@ -0,0 +1,52 @@
1
+ PROJECT_NAME = "ticketmap"
2
+
3
+ begin
4
+ require 'jeweler'
5
+ rescue LoadError
6
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
7
+ end
8
+
9
+ Jeweler::Tasks.new do |gemspec|
10
+ gemspec.name = "#{PROJECT_NAME}"
11
+ gemspec.summary = "Two-dimentional ToDo manager"
12
+ gemspec.email = "yutaka.hara/at/gmail.com"
13
+ gemspec.homepage = "http://github.com/yhara/#{PROJECT_NAME}"
14
+ gemspec.description = gemspec.summary
15
+ gemspec.authors = ["Yutaka HARA"]
16
+ gemspec.add_dependency('ramaze', '= 2009.06.12')
17
+ gemspec.add_dependency('dm-core')
18
+ gemspec.add_dependency('do_sqlite3')
19
+ gemspec.files.concat Dir["public/biwascheme/lib/*"]
20
+ end
21
+
22
+ desc "install current source as gem"
23
+ task :dogfood => [:gemspec, :build] do
24
+ sh "sudo gem install pkg/#{PROJECT_NAME}-#{File.read("VERSION").chomp}.gem"
25
+ end
26
+
27
+ desc "uninstall the installed gem"
28
+ task :undogfood do
29
+ sh "sudo gem uninstall #{PROJECT_NAME}"
30
+ end
31
+
32
+ desc "uninstall, then install current source as gem"
33
+ task :redogfood => [:undogfood, :dogfood]
34
+
35
+ desc "uninstall temporary gem and install from github"
36
+ task :nodogfood do
37
+ sh "sudo gem uninstall #{PROJECT_NAME}"
38
+ sh "sudo gem install yhara-#{PROJECT_NAME}"
39
+ end
40
+
41
+ desc "check for gem to be built"
42
+ task :stalk do
43
+ sh "gemstalk yhara #{PROJECT_NAME}"
44
+ end
45
+
46
+ desc "test all"
47
+ task "spec" do
48
+ sh "bacon spec/models.rb"
49
+ sh "bacon spec/main.rb"
50
+ sh "bacon spec/config.rb"
51
+ sh "bacon spec/tickets.rb"
52
+ end
data/TODO ADDED
@@ -0,0 +1,82 @@
1
+ = How to release
2
+
3
+ * (edit TODO)
4
+ * edit VERSION in bin/tickets-server
5
+ * rtask -> update version
6
+ * build gem test
7
+ * Then, push it!
8
+
9
+ = before 1.x.x
10
+
11
+ - write server tests
12
+ - write client tests
13
+ - when origin is clicked
14
+ - new ticket appears on the filed
15
+ - request: /tickets/create
16
+ - when a ticket is clicked
17
+ - ticket info is shown in the hand
18
+ - when a ticket is moved
19
+ - request: /tickets/move? id, x, y
20
+ - when ticket title is cliced
21
+ - show ticket form
22
+ - when ok is clicked
23
+ - show new title in the hand
24
+ - show new title in the field
25
+ - request: /tickets/rename? id, new
26
+ - when delete button is clicked
27
+ - ask really delete the ticket
28
+ - when Y is clicked
29
+ - remove the ticket from the field
30
+ - clear the hand
31
+ - request: /tickets/delete? id
32
+ - when N is clicked
33
+ - do not remove the ticket from the field
34
+ - keep the hand
35
+ - no request
36
+
37
+ - refactor scheme code (use hashtable as object)
38
+
39
+ = before 0.4.0
40
+
41
+ - implement tags
42
+ - different color
43
+ - show certain tag only
44
+ - tag 'Done' means fixed tags
45
+
46
+ = before 0.3.0
47
+
48
+ - change orm to datamapper(or ActiveRecord?)
49
+ - memorize date when a ticket is created
50
+ - memorize date when a ticket is deleted
51
+
52
+ = before 0.2.0
53
+
54
+ - edit ticket body
55
+
56
+ = before 0.1.1
57
+
58
+ - stick to board edge
59
+
60
+ = before 0.1.0.2
61
+
62
+ - fix track?
63
+ + fix ticket position when generated
64
+ + fix move position
65
+
66
+ = 0.1.0.1
67
+
68
+ + add Tickets::VERSION
69
+
70
+ + Make it work with gem
71
+
72
+ + fix ticket positions (center=0,0)
73
+ + show deleted tickets (including timeouted ones)
74
+ + automatically move tickets
75
+
76
+ + Make it installable :-)
77
+ + write gemspec (with rtask)
78
+ + dependency (ramaze)
79
+ + automatic migration in start.rb
80
+ + save database on ~/.tickets.db
81
+ + move executable to bin/
82
+ + command line option (port, db)
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.3.1
@@ -0,0 +1,9 @@
1
+ class ConfigController < Controller
2
+ map '/config'
3
+
4
+ def board_size
5
+ w = TicketMap.options[:board_width]
6
+ h = TicketMap.options[:board_height]
7
+ "(xy . (#{w} . #{h}))"
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ class Controller < Ramaze::Controller
2
+ engine :Etanni
3
+ end
4
+
5
+ require __DIR__("./main.rb")
6
+ require __DIR__("./config.rb")
7
+ require __DIR__("./tickets.rb")
@@ -0,0 +1,11 @@
1
+ class MainController < Controller
2
+ map '/'
3
+
4
+ def index
5
+ Ticket.shake! if Ticket.needs_shaking?
6
+ end
7
+
8
+ def track
9
+ @tickets = Ticket.all(:deleted => true, :order => [:id.desc])
10
+ end
11
+ end
@@ -0,0 +1,49 @@
1
+ class TicketsController < Controller
2
+ map '/tickets'
3
+
4
+ def create
5
+ ticket = Ticket.new
6
+ ticket.save
7
+
8
+ "(#t . (id . #{ticket.id}))"
9
+ end
10
+
11
+ def list
12
+ tickets = Ticket.all(:deleted => false)
13
+
14
+ '(#t . (' +
15
+ tickets.map{|ticket|
16
+ "(#{ticket.id} #{ticket.title.inspect} #{ticket.emergency} #{ticket.importance})"
17
+ }.join(' ') +
18
+ '))'
19
+ end
20
+
21
+ def move
22
+ raise "must be via POST" unless request.post?
23
+ ticket = Ticket.get(request["id"])
24
+ raise "ticket not found" unless ticket
25
+
26
+ ticket.update_attributes(:emergency => request["x"],
27
+ :importance => request["y"])
28
+ "(#t)"
29
+ end
30
+
31
+ def rename
32
+ raise "must be via POST" unless request.post?
33
+ ticket = Ticket.get(request["id"])
34
+ raise "ticket not found" unless ticket
35
+
36
+ ticket.update_attributes(:title => request["title"])
37
+ "(#t)"
38
+ end
39
+
40
+ def delete
41
+ raise "must be via POST" unless request.post?
42
+ ticket = Ticket.get(request["id"])
43
+ raise "ticket not found" unless ticket
44
+
45
+ ticket.update_attributes(:deleted => true)
46
+ "(#t)"
47
+ end
48
+ end
49
+
@@ -0,0 +1,14 @@
1
+ class CreateTickets < Sequel::Migration
2
+ def up
3
+ create_table :tickets do
4
+ primary_key :id
5
+ integer :importance, :null => false, :default => 0
6
+ integer :emergency, :null => false, :default => 0
7
+ string :title, :null => false, :default => ""
8
+ end
9
+ end
10
+
11
+ def down
12
+ drop_table :tickets
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ class AddDeletedToTickets < Sequel::Migration
2
+ def up
3
+ alter_table :tickets do
4
+ add_column :deleted, :boolean, :null => false, :default => false
5
+ end
6
+ end
7
+
8
+ def down
9
+ alter_table :tickets do
10
+ drop_column :deleted
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class AddTimeoutedToTickets < Sequel::Migration
2
+ def up
3
+ alter_table :tickets do
4
+ add_column :timeouted, :boolean, :null => false, :default => false
5
+ end
6
+ end
7
+
8
+ def down
9
+ alter_table :tickets do
10
+ drop_column :timeouted
11
+ end
12
+ end
13
+ end
data/main.rb ADDED
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+ require 'optparse'
3
+ require 'rubygems'
4
+ require 'ruby-station'; RubyStation.parse_argv
5
+ require 'ramaze'
6
+
7
+ module TicketMap
8
+ include Innate::Optioned
9
+ VERSION = File.read(__DIR__("VERSION"))
10
+
11
+ options.dsl do
12
+ o "Path of config file",
13
+ :config, File.expand_path("~/.ticketmap.rb")
14
+ # o "Path of database file",
15
+ # :db, File.expand_path("~/.ticketmap.db")
16
+ # o "Port number",
17
+ # :port, 7007
18
+ o "Interval to automatically move tickets (hours)",
19
+ :shake_interval, 24
20
+ o "Distance to automatically move tickets (pixels)",
21
+ :shake_distance, 8
22
+ o "Width of the board (pixels)",
23
+ :board_width, 600
24
+ o "Height of the board (pixels)",
25
+ :board_height, 600
26
+ end
27
+ end
28
+
29
+ $LOAD_PATH.unshift __DIR__("./")
30
+ require 'controller/init.rb'
31
+ require 'model/init.rb'
32
+
33
+ conf = TicketMap.options[:config]
34
+ if File.exist?(conf)
35
+ Ramaze::Log.info("Loading config file: #{conf}")
36
+ load conf
37
+ end
38
+
39
+ Ramaze.start :port => RubyStation.port,
40
+ :root => __DIR__('./')
data/model/init.rb ADDED
@@ -0,0 +1,32 @@
1
+ require 'dm-core'
2
+ require 'dm-validations'
3
+ require 'dm-aggregates' # needed for #count in spec
4
+ db_path = RubyStation.data_path('ticketmap.db')
5
+ DataMapper.setup(:default, "sqlite3://#{db_path}")
6
+
7
+ require __DIR__('./ticket.rb')
8
+
9
+ DataMapper.auto_upgrade!
10
+
11
+ #
12
+ # ramaze paginate for datamapper
13
+ #
14
+ require 'ramaze/helper/paginate'
15
+ class DataMapper::Collection
16
+ def paginate(page, limit)
17
+ DMCollectionPager.new(self, page, limit)
18
+ end
19
+
20
+ class DMCollectionPager < Ramaze::Helper::Paginate::Paginator::ArrayPager
21
+ def each(&block)
22
+ from = ((@page - 1) * @limit)
23
+ from = 0 if from < 0
24
+ to = from + @limit
25
+
26
+ a = @array[from...to] || []
27
+ a.each(&block)
28
+ end
29
+
30
+ end
31
+ end
32
+
data/model/ticket.rb ADDED
@@ -0,0 +1,49 @@
1
+ class Ticket
2
+ include DataMapper::Resource
3
+
4
+ # properties
5
+
6
+ property :id, Serial
7
+ property :importance, Integer
8
+ property :emergency, Integer
9
+ property :title, String
10
+ property :deleted, Boolean
11
+ property :timeouted, Boolean
12
+
13
+ # validations
14
+
15
+ before :save do
16
+ self.importance ||= 0
17
+ self.emergency ||= 0
18
+ self.title ||= ""
19
+ self.deleted = false if self.deleted == nil
20
+ self.timeouted = false if self.timeouted == nil
21
+ end
22
+
23
+ # class methods
24
+
25
+ @@last_shook = Time.now
26
+
27
+ def self.needs_shaking?
28
+ (Time.now - @@last_shook) > TicketMap.options[:shake_interval]*60*60
29
+ end
30
+
31
+ def self.shake!
32
+ Ticket.all.each do |ticket|
33
+ pos = ticket.emergency
34
+ dir = (ticket.importance < 0 ? 1 : -1)
35
+ newpos = pos + TicketMap.options[:shake_distance] * dir
36
+ if newpos > (TicketMap.options[:board_width] / 2)
37
+ newpos = (TicketMap.options[:board_width] / 2)
38
+ end
39
+
40
+ ticket.emergency = newpos if newpos != pos
41
+ if newpos < -(TicketMap.options[:board_width] / 2)
42
+ ticket.deleted = true
43
+ ticket.timeouted = true
44
+ end
45
+ ticket.save
46
+ end
47
+ @@last_shook = Time.now
48
+ end
49
+ end