watch_tower 0.0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. data/.gitignore +10 -0
  2. data/.todo +33 -0
  3. data/.travis.yml +14 -0
  4. data/Gemfile +43 -0
  5. data/Guardfile +25 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +38 -0
  8. data/Rakefile +8 -0
  9. data/TODO +17 -0
  10. data/bin/watchtower +10 -0
  11. data/ci/adapters/jruby-mysql.yml +8 -0
  12. data/ci/adapters/jruby-postgresql.yml +6 -0
  13. data/ci/adapters/jruby-sqlite.yml +6 -0
  14. data/ci/adapters/ruby-mysql.yml +8 -0
  15. data/ci/adapters/ruby-postgresql.yml +6 -0
  16. data/ci/adapters/ruby-sqlite.yml +6 -0
  17. data/ci/travis.rb +102 -0
  18. data/lib/watch_tower.rb +60 -0
  19. data/lib/watch_tower/appscript.rb +22 -0
  20. data/lib/watch_tower/cli.rb +15 -0
  21. data/lib/watch_tower/cli/.gitkeep +0 -0
  22. data/lib/watch_tower/cli/install.rb +63 -0
  23. data/lib/watch_tower/cli/open.rb +24 -0
  24. data/lib/watch_tower/cli/start.rb +140 -0
  25. data/lib/watch_tower/config.rb +38 -0
  26. data/lib/watch_tower/core_ext.rb +4 -0
  27. data/lib/watch_tower/core_ext/.gitkeep +0 -0
  28. data/lib/watch_tower/editor.rb +17 -0
  29. data/lib/watch_tower/editor/.gitkeep +0 -0
  30. data/lib/watch_tower/editor/base_appscript.rb +34 -0
  31. data/lib/watch_tower/editor/base_ps.rb +6 -0
  32. data/lib/watch_tower/editor/textmate.rb +17 -0
  33. data/lib/watch_tower/editor/xcode.rb +22 -0
  34. data/lib/watch_tower/errors.rb +25 -0
  35. data/lib/watch_tower/eye.rb +79 -0
  36. data/lib/watch_tower/project.rb +14 -0
  37. data/lib/watch_tower/project/.gitkeep +0 -0
  38. data/lib/watch_tower/project/any_based.rb +22 -0
  39. data/lib/watch_tower/project/git_based.rb +86 -0
  40. data/lib/watch_tower/project/init.rb +38 -0
  41. data/lib/watch_tower/project/path_based.rb +144 -0
  42. data/lib/watch_tower/server.rb +62 -0
  43. data/lib/watch_tower/server/.gitkeep +0 -0
  44. data/lib/watch_tower/server/app.rb +37 -0
  45. data/lib/watch_tower/server/assets/images/WatchTower.jpg +0 -0
  46. data/lib/watch_tower/server/assets/images/percentage.png +0 -0
  47. data/lib/watch_tower/server/assets/javascripts/application.js +3 -0
  48. data/lib/watch_tower/server/assets/javascripts/percentage.coffee +8 -0
  49. data/lib/watch_tower/server/assets/stylesheets/application.css +7 -0
  50. data/lib/watch_tower/server/assets/stylesheets/global.sass +71 -0
  51. data/lib/watch_tower/server/assets/stylesheets/project.sass +59 -0
  52. data/lib/watch_tower/server/configurations.rb +10 -0
  53. data/lib/watch_tower/server/configurations/asset.rb +43 -0
  54. data/lib/watch_tower/server/database.rb +105 -0
  55. data/lib/watch_tower/server/db/migrate/001_create_projects.rb +15 -0
  56. data/lib/watch_tower/server/db/migrate/002_create_files.rb +16 -0
  57. data/lib/watch_tower/server/db/migrate/003_create_time_entries.rb +12 -0
  58. data/lib/watch_tower/server/db/migrate/004_create_durations.rb +14 -0
  59. data/lib/watch_tower/server/db/migrate/005_add_hash_to_time_entries.rb +6 -0
  60. data/lib/watch_tower/server/db/migrate/006_add_hash_to_files.rb +6 -0
  61. data/lib/watch_tower/server/decorator.rb +21 -0
  62. data/lib/watch_tower/server/decorator/application_decorator.rb +91 -0
  63. data/lib/watch_tower/server/decorator/file_decorator.rb +38 -0
  64. data/lib/watch_tower/server/decorator/project_decorator.rb +51 -0
  65. data/lib/watch_tower/server/helpers.rb +13 -0
  66. data/lib/watch_tower/server/helpers/asset.rb +29 -0
  67. data/lib/watch_tower/server/helpers/improved_partials.rb +41 -0
  68. data/lib/watch_tower/server/models/duration.rb +11 -0
  69. data/lib/watch_tower/server/models/file.rb +31 -0
  70. data/lib/watch_tower/server/models/project.rb +17 -0
  71. data/lib/watch_tower/server/models/time_entry.rb +64 -0
  72. data/lib/watch_tower/server/public/assets/WatchTower-4d6de11e1bd34165ad91ac46fb711bf3.jpg +0 -0
  73. data/lib/watch_tower/server/public/assets/application-7829b53b5ece1a16d22dc3d00f329023.css +107 -0
  74. data/lib/watch_tower/server/public/assets/application-e0e6b7731aade460f680331e65cf0682.js +9359 -0
  75. data/lib/watch_tower/server/public/assets/percentage-d8589e21a5fc85d32a445f531ff8ab95.png +0 -0
  76. data/lib/watch_tower/server/vendor/assets/javascripts/jquery-ui.js +11729 -0
  77. data/lib/watch_tower/server/vendor/assets/javascripts/jquery.js +8981 -0
  78. data/lib/watch_tower/server/vendor/assets/javascripts/jquery_ujs.js +363 -0
  79. data/lib/watch_tower/server/views/.gitkeep +0 -0
  80. data/lib/watch_tower/server/views/_file.haml +9 -0
  81. data/lib/watch_tower/server/views/_project.haml +13 -0
  82. data/lib/watch_tower/server/views/index.haml +7 -0
  83. data/lib/watch_tower/server/views/layout.haml +32 -0
  84. data/lib/watch_tower/server/views/project.haml +12 -0
  85. data/lib/watch_tower/templates/config.yml +146 -0
  86. data/lib/watch_tower/templates/watchtower.plist +23 -0
  87. data/lib/watch_tower/version.rb +8 -0
  88. data/spec/factories.rb +45 -0
  89. data/spec/spec_helper.rb +26 -0
  90. data/spec/support/active_record.rb +44 -0
  91. data/spec/support/factory_girl.rb +6 -0
  92. data/spec/support/launchy.rb +3 -0
  93. data/spec/support/sinatra.rb +10 -0
  94. data/spec/support/timecop.rb +7 -0
  95. data/spec/watch_tower/appscript_spec.rb +6 -0
  96. data/spec/watch_tower/cli/install_spec.rb +16 -0
  97. data/spec/watch_tower/cli/open_spec.rb +14 -0
  98. data/spec/watch_tower/cli/start_spec.rb +17 -0
  99. data/spec/watch_tower/cli_spec.rb +15 -0
  100. data/spec/watch_tower/config_spec.rb +25 -0
  101. data/spec/watch_tower/editor/textmate_spec.rb +43 -0
  102. data/spec/watch_tower/editor/xcode_spec.rb +43 -0
  103. data/spec/watch_tower/editor_spec.rb +19 -0
  104. data/spec/watch_tower/eye_spec.rb +130 -0
  105. data/spec/watch_tower/project/git_based_spec.rb +131 -0
  106. data/spec/watch_tower/project/path_based_spec.rb +111 -0
  107. data/spec/watch_tower/project_spec.rb +82 -0
  108. data/spec/watch_tower/server/app_spec.rb +186 -0
  109. data/spec/watch_tower/server/decorator/project_decorator_spec.rb +60 -0
  110. data/spec/watch_tower/server/models/file_spec.rb +284 -0
  111. data/spec/watch_tower/server/models/project_spec.rb +165 -0
  112. data/spec/watch_tower/server/models/time_entry_spec.rb +37 -0
  113. data/spec/watch_tower/server_spec.rb +4 -0
  114. data/watch_tower.gemspec +80 -0
  115. metadata +450 -0
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rbx
6
+ .rvmrc
7
+
8
+ # Tranmuter output
9
+ README.pdf
10
+ README.html
data/.todo ADDED
@@ -0,0 +1,33 @@
1
+ <?xml version="1.0"?>
2
+ <todo version="0.1.20">
3
+ <note priority="medium" time="1317884658" done="1317889968">
4
+ Remove the last_id from File and Project as it's not needed.
5
+ </note>
6
+ <note priority="medium" time="1317884720" done="1317891752">
7
+ Add a default_scope to sort files and projects by their elapsed time
8
+ </note>
9
+ <note priority="medium" time="1317888883" done="1317895336">
10
+ Add a config file, a yaml file to configure watch_tower a section under database/environment should be added to configure the server's database... watch_tower should not be run unless the config file has been edited.
11
+ </note>
12
+ <note priority="medium" time="1317889118" done="1317980852">
13
+ Add a ci/travis.rb script which runs the tests under Travis-CI, needed because the config file added in todo number 3 won't exist and the current setup (sqlite) does not work with JRuby
14
+ </note>
15
+ <note priority="high" time="1318256016">
16
+ Figure out how to load assets from gems and remove the bundled jQuery files.
17
+ </note>
18
+ <note priority="medium" time="1317895354">
19
+ The Config module need some tests.
20
+ </note>
21
+ <note priority="medium" time="1317980873">
22
+ Convert the Editor module to be Enumerable for easier access to the list of editors
23
+ </note>
24
+ <note priority="medium" time="1317996464">
25
+ maybe use sinatra-simple-navigation gem
26
+ </note>
27
+ <note priority="medium" time="1318109702">
28
+ Add tracking by git branch, needs a branches table that belongs to a project and has many time_entries
29
+ </note>
30
+ <note priority="medium" time="1318258373">
31
+ Maybe use a Rails engine instead of Sinatra ?
32
+ </note>
33
+ </todo>
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ script: 'ci/travis.rb'
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ # - jruby
6
+ # - rbx-2.0
7
+ env:
8
+ - WATCH_TOWER_ENV=test RBXOPT="${RBXOPT} -X19" JRUBY_OPTS="${JRUBY_OPTS} --1.9" ADAPTERS="sqlite:mysql:postgresql"
9
+ notifications:
10
+ recipients:
11
+ - wael.nasreddine@gmail.com
12
+ email:
13
+ on_success: change
14
+ on_failure: always
data/Gemfile ADDED
@@ -0,0 +1,43 @@
1
+ # Sources
2
+ source "http://rubygems.org"
3
+
4
+ # Parse watch_tower.gemspec
5
+ gemspec
6
+
7
+ ####
8
+ # For development or testing
9
+ ###
10
+
11
+ # Require rbconfig to figure out the target OS
12
+ require 'rbconfig'
13
+
14
+ platforms :jruby do
15
+ gem 'activerecord-jdbcmysql-adapter'
16
+ gem 'activerecord-jdbcpostgresql-adapter'
17
+ gem 'activerecord-jdbcsqlite3-adapter'
18
+ end
19
+
20
+ platforms :ruby do
21
+ gem 'mysql2'
22
+ gem 'sqlite3'
23
+
24
+ unless ENV['TRAVIS']
25
+ if RbConfig::CONFIG['target_os'] =~ /darwin/i
26
+ gem 'rb-fsevent', require: false
27
+ gem 'ruby-growl', require: false
28
+ gem 'growl', require: false
29
+ end
30
+ if RbConfig::CONFIG['target_os'] =~ /linux/i
31
+ gem 'rb-inotify', require: false
32
+ gem 'libnotify', require: false
33
+ end
34
+ end
35
+ end
36
+
37
+ platforms :mri do
38
+ gem 'pg'
39
+
40
+ if RbConfig::CONFIG['target_os'] =~ /darwin/i
41
+ gem 'rb-appscript', '~>0.6.1'
42
+ end
43
+ end
data/Guardfile ADDED
@@ -0,0 +1,25 @@
1
+ $:.push File.expand_path(File.join(File.dirname(__FILE__), 'lib'))
2
+ require 'watch_tower'
3
+
4
+ guard 'bundler' do
5
+ watch('Gemfile')
6
+ watch(/^.+\.gemspec/)
7
+ end
8
+
9
+ guard 'sprockets2',
10
+ sprockets: WatchTower::Server::App.sprockets,
11
+ assets_path: 'lib/watch_tower/server/public/assets' do
12
+ watch(%r{^lib/watch_tower/server/assets/.+$})
13
+ watch('lib/watch_tower/server/app.rb')
14
+ end
15
+
16
+ guard 'rspec', :version => 2 do
17
+ # All specs
18
+ watch(%r{^spec/.+_spec\.rb$})
19
+ watch('spec/spec_helper.rb') { "spec" }
20
+ watch(%r{spec/factories/(.+)\.rb} ) { "spec" }
21
+ watch(%r{spec/support/(.+)\.rb} ) { "spec" }
22
+
23
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
24
+ watch(%r(^lib/watch_tower/server/(views|extensions|presenters)/(.+)$)) { "spec/watch_tower/server/app_spec.rb" }
25
+ end
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Wael Nasreddine <wael.nasreddine@gmail.com>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # Watch Tower [![Build Status](http://travis-ci.org/TechnoGate/watch_tower.png)](http://travis-ci.org/TechnoGate/watch_tower) ![Still Maintained](http://stillmaintained.com/TechnoGate/watch_tower.png)
2
+
3
+ <a href='http://www.pledgie.com/campaigns/16123'><img alt='Click here to lend your support to: Open Source Projects and make a donation at www.pledgie.com !' src='http://www.pledgie.com/campaigns/16123.png?skin_name=chrome' border='0' /></a>
4
+
5
+ WatchTower helps you track the time you spend on each project.
6
+
7
+ # Introduction
8
+
9
+ Are you tired of not-knowing how much each of your projects really costs? Watch Tower
10
+ comes to the rescue.
11
+
12
+ WatchTower runs in the background and it monitors your editors (see Supported
13
+ Editors) and records the time you spend on each file and thus on the project
14
+ in total, and using a web interface, it presents you with statistics on each
15
+ project
16
+
17
+ # Installation
18
+
19
+ The installation has been made as simple as possible, here's the steps required:
20
+
21
+ ```bash
22
+ $ gem install watch_tower
23
+ $ watchtower intall
24
+ ```
25
+
26
+ This creates a configuration file which you __should__ review before invoking
27
+ __WatchTower__, located at __~/.watch_tower/config.yml__ the configuration file
28
+ is self explanatory.
29
+
30
+ # Usage
31
+
32
+ The installation process should create a launcher on login which starts
33
+ __WatchTower__ you can open the web interface by going to
34
+ http://localhost:9282 or using the command
35
+
36
+ ```bash
37
+ $ watchtower open
38
+ ```
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ # Require RSpec tasks
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ # The default task is tests
8
+ task :default => :spec
data/TODO ADDED
@@ -0,0 +1,17 @@
1
+ - Figure out how to load assets from gems and remove the bundled jQuery files.
2
+ (added Mon Oct 10 16:13:36 2011, incomplete, priority high)
3
+
4
+ - The Config module need some tests.
5
+ (added Thu Oct 6 12:02:34 2011, incomplete, priority medium)
6
+
7
+ - Convert the Editor module to be Enumerable for easier access to the list of editors
8
+ (added Fri Oct 7 11:47:53 2011, incomplete, priority medium)
9
+
10
+ - maybe use sinatra-simple-navigation gem
11
+ (added Fri Oct 7 16:07:44 2011, incomplete, priority medium)
12
+
13
+ - Add tracking by git branch, needs a branches table that belongs to a project and has many time_entries
14
+ (added Sat Oct 8 23:35:02 2011, incomplete, priority medium)
15
+
16
+ - Maybe use a Rails engine instead of Sinatra ?
17
+ (added Mon Oct 10 16:52:53 2011, incomplete, priority medium)
data/bin/watchtower ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ ENV['WATCH_TOWER_ENV'] ||= 'production'
5
+
6
+ $:.push File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+
8
+ require 'watch_tower'
9
+
10
+ WatchTower::CLI::Runner.start
@@ -0,0 +1,8 @@
1
+ database:
2
+ test:
3
+ adapter: jdbcmysql
4
+ encoding: utf8
5
+ reconnect: false
6
+ database: watch_tower_test
7
+ pool: 5
8
+ username: root
@@ -0,0 +1,6 @@
1
+ database:
2
+ test:
3
+ adapter: jdbcpostgresql
4
+ encoding: unicode
5
+ database: watch_tower_test
6
+ pool: 5
@@ -0,0 +1,6 @@
1
+ database:
2
+ test:
3
+ adapter: jdbcsqlite3
4
+ database: ":memory:"
5
+ pool: 5
6
+ timeout: 5000
@@ -0,0 +1,8 @@
1
+ database:
2
+ test:
3
+ adapter: mysql2
4
+ encoding: utf8
5
+ reconnect: false
6
+ database: watch_tower_test
7
+ pool: 5
8
+ username: root
@@ -0,0 +1,6 @@
1
+ database:
2
+ test:
3
+ adapter: postgresql
4
+ encoding: unicode
5
+ database: watch_tower_test
6
+ pool: 5
@@ -0,0 +1,6 @@
1
+ database:
2
+ test:
3
+ adapter: sqlite3
4
+ database: ":memory:"
5
+ pool: 5
6
+ timeout: 5000
data/ci/travis.rb ADDED
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env ruby
2
+ # This file has been taken from rails
3
+ # https://github.com/rails/rails/blob/master/ci/travis.rb
4
+ require 'fileutils'
5
+ include FileUtils
6
+
7
+ commands = [
8
+ 'mysql -e "create database watch_tower_test;"',
9
+ 'psql -c "create database watch_tower_test;" -U postgres'
10
+ ]
11
+
12
+ commands.each do |command|
13
+ system("#{command} > /dev/null 2>&1")
14
+ end
15
+
16
+ class Build
17
+ attr_reader :options
18
+
19
+ def initialize(options = {})
20
+ @options = options
21
+ end
22
+
23
+ def run!(options = {})
24
+ self.options.update(options)
25
+ create_config_file
26
+ announce(heading)
27
+ rake(*tasks)
28
+ end
29
+
30
+ def create_config_file
31
+ commands = [
32
+ "mkdir -p ~/.watch_tower",
33
+ "cp lib/watch_tower/templates/config.yml ~/.watch_tower/config.yml",
34
+ "cat ci/adapters/#{ruby_platform}-#{adapter}.yml >> ~/.watch_tower/config.yml"
35
+ ]
36
+
37
+ commands.each do |command|
38
+ system("#{command}")
39
+ end
40
+ end
41
+
42
+ def ruby_platform
43
+ RUBY_PLATFORM == 'java' ? 'jruby' : 'ruby'
44
+ end
45
+
46
+ def announce(heading)
47
+ puts "\n\e[1;33m[Travis CI] #{heading}\e[m\n"
48
+ end
49
+
50
+ def heading
51
+ heading = [gem]
52
+ heading << "with #{adapter}"
53
+ heading.join(' ')
54
+ end
55
+
56
+ def tasks
57
+ "spec"
58
+ end
59
+
60
+ def gem
61
+ 'watch_tower'
62
+ end
63
+
64
+ def adapter
65
+ @options[:adapter]
66
+ end
67
+
68
+ def rake(*tasks)
69
+ tasks.each do |task|
70
+ cmd = "bundle exec rake #{task}"
71
+ puts "Running command: #{cmd}"
72
+ return false unless system(cmd)
73
+ end
74
+ true
75
+ end
76
+ end
77
+
78
+ results = {}
79
+
80
+ ENV['ADAPTERS'].split(':').each do |adapter|
81
+ # PG is not working on RBX
82
+ # Probably a bug on Travis, to investigate of course
83
+ if adapter == 'postgresql' && RUBY_ENGINE == 'rbx'
84
+ results[adapter] = true
85
+ else
86
+ build = Build.new(adapter: adapter)
87
+ results[adapter] = build.run!
88
+ end
89
+ end
90
+
91
+ failures = results.select { |key, value| value == false }
92
+
93
+ if failures.empty?
94
+ puts
95
+ puts "WatchTower build finished sucessfully"
96
+ exit(true)
97
+ else
98
+ puts
99
+ puts "WatchTower build FAILED"
100
+ puts "Failed adapters: #{failures.join(', ')}"
101
+ exit(false)
102
+ end
@@ -0,0 +1,60 @@
1
+ # RubyGems is needed at first
2
+ require 'rubygems'
3
+
4
+ # Require daemon from active_support's core_ext allows us to fork really quickly
5
+ require 'active_support/core_ext/process/daemon'
6
+
7
+ # External requirements
8
+ require 'fileutils'
9
+ require 'logger'
10
+ require 'active_record'
11
+
12
+ # Define a few pathes
13
+ ROOT_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..'))
14
+ LIB_PATH = File.join(ROOT_PATH, 'lib', 'watch_tower')
15
+ SERVER_PATH = File.join(LIB_PATH, 'server')
16
+ MODELS_PATH = File.join(SERVER_PATH, 'models')
17
+ EXTENSIONS_PATH = File.join(SERVER_PATH, 'extensions')
18
+ MIGRATIONS_PATH = File.join(SERVER_PATH, 'db', 'migrate')
19
+ TEMPLATE_PATH = File.join(LIB_PATH, 'templates')
20
+ USER_PATH = File.expand_path(File.join(ENV['HOME'], '.watch_tower'))
21
+ DATABASE_PATH = File.join(USER_PATH, 'databases')
22
+ LOG_PATH = File.join(USER_PATH, 'log')
23
+
24
+ # Define the environment by default set to development
25
+ ENV['WATCH_TOWER_ENV'] ||= 'development'
26
+
27
+ # Make sure the USER_PATH exist
28
+ FileUtils.mkdir_p USER_PATH
29
+ FileUtils.mkdir_p DATABASE_PATH
30
+ FileUtils.mkdir_p LOG_PATH
31
+
32
+ # module WatchTower
33
+ module WatchTower
34
+
35
+ # Create a logger
36
+ LOG = Logger.new(File.join(LOG_PATH, 'watch_tower.log'))
37
+
38
+ # Threads
39
+ # Hash
40
+ @@threads = {}
41
+
42
+ # Returh the threads
43
+ #
44
+ # @return [Hash] Threads
45
+ def self.threads
46
+ @@threads
47
+ end
48
+
49
+ end
50
+
51
+ # Require watch_tower's libraries
52
+ require "watch_tower/version"
53
+ require "watch_tower/errors"
54
+ require "watch_tower/core_ext"
55
+ require "watch_tower/config"
56
+ require "watch_tower/cli"
57
+ require "watch_tower/editor"
58
+ require "watch_tower/project"
59
+ require "watch_tower/eye"
60
+ require "watch_tower/server"