watch_tower 0.0.1.beta10 → 0.0.1.beta11

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.
data/README.md CHANGED
@@ -111,12 +111,24 @@ following guidelines:
111
111
  colon and a space, for example 'README: fix a typo' or 'Server/Project: Fix
112
112
  a typo'.
113
113
  - Include tests.
114
- - Do not change the version, We will take care of that.
114
+ - __Do not change the version__, We will take care of that.
115
115
 
116
116
  You can also take a look at the [TODO
117
117
  list](https://github.com/TechnoGate/watch_tower/blob/master/TODO) for what's
118
118
  in mind for the project
119
119
 
120
+ # Contact
121
+
122
+ For bugs and feature request, please use __Github issues__, for other
123
+ requests, you can contact us:
124
+
125
+ - [Github private
126
+ message](https://github.com/inbox/new/eMxyzptlk)
127
+ - Email: [contact@technogate.fr](mailto:contact@technogate.fr)
128
+
129
+ Don't forget to follow me on [Github](https://github.com/eMxyzptlk) and
130
+ [Twitter](https://twitter.com/eMxyzptlk) for news and updates.
131
+
120
132
  # Credits
121
133
 
122
134
  Please see the
@@ -41,7 +41,7 @@ module WatchTower
41
41
  LOG = Logger.new(File.join(LOG_PATH, "#{ENV['WATCH_TOWER_ENV']}.log"))
42
42
 
43
43
  # Make it by default warn level
44
- LOG.level = Logger::WARN
44
+ LOG.level = Logger::INFO
45
45
 
46
46
  # Threads
47
47
  # Hash
@@ -49,12 +49,24 @@ module WatchTower
49
49
  def start
50
50
  # Set the logger to debug mode if necessary
51
51
  LOG.level = Logger::DEBUG if options[:debug]
52
- if Config[:enabled] &&
53
- (!options[:bootloader] || (options[:bootloader] && Config[:launch_on_boot]))
54
- LOG.info "Starting WatchTower."
55
- start!
56
- else
57
- abort "You need to edit the config file located at #{Config::CONFIG_FILE}."
52
+
53
+ begin
54
+ if Config[:enabled] &&
55
+ (!options[:bootloader] || (options[:bootloader] && Config[:launch_on_boot]))
56
+ LOG.info "#{__FILE__}:#{__LINE__}: Starting WatchTower."
57
+ start!
58
+ LOG.info "#{__FILE__}:#{__LINE__}: WatchTower has finished."
59
+ else
60
+ abort "You need to edit the config file located at \#{Config.config_file}."
61
+ end
62
+ rescue ConfigNotReadableError => e
63
+ LOG.fatal "#{__FILE__}:#{__LINE__}: The config file is not readable."
64
+ STDERR.puts "The config file is not readable, please make sure \#{Config.config_file} exists and you have the necessary permissions to read it."
65
+ exit(1)
66
+ rescue ConfigNotValidError => e
67
+ LOG.fatal "#{__FILE__}:#{__LINE__}: The config file is not valid: \#{e.message}."
68
+ STDERR.puts "The config file \#{Config.config_file} is not valid: \#{e.message}."
69
+ exit(1)
58
70
  end
59
71
  end
60
72
 
@@ -65,8 +77,6 @@ module WatchTower
65
77
 
66
78
  # Start WatchTower
67
79
  start_watch_tower
68
-
69
- LOG.debug "#{__FILE__}:#{__LINE__}: WatchTower has finished."
70
80
  else
71
81
  LOG.debug "#{__FILE__}:#{__LINE__}: Running WatchTower in the background."
72
82
  pid = fork do
@@ -79,8 +89,6 @@ module WatchTower
79
89
 
80
90
  # Start WatchTower
81
91
  start_watch_tower
82
-
83
- LOG.debug "#{__FILE__}:#{__LINE__}: WatchTower has finished."
84
92
  rescue => e
85
93
  LOG.fatal "#{__FILE__}:#{__LINE__ - 2}: The process raised an exception \#{e.message}"
86
94
  LOG.fatal "#{__FILE__}:#{__LINE__ - 3}: ==== Backtrace ===="
@@ -6,9 +6,6 @@ module WatchTower
6
6
  module Config
7
7
  extend self
8
8
 
9
- # Define the config file's path
10
- CONFIG_FILE = File.join(USER_PATH, 'config.yml')
11
-
12
9
  # Define the config class variable
13
10
  @@config = nil
14
11
 
@@ -18,23 +15,56 @@ module WatchTower
18
15
  # @return mixed
19
16
  # @raise [Void]
20
17
  def [](config)
21
- ensure_config_file_exists
22
- @@config ||= HashWithIndifferentAccess.new(YAML.parse_file(CONFIG_FILE).to_ruby)
18
+ if @@config.nil?
19
+ check_config_file
20
+ @@config ||= parse_config_file
21
+ end
22
+
23
23
  @@config[:watch_tower].send(:[], config)
24
24
  end
25
25
 
26
+ # Get the config file
27
+ #
28
+ # @return [String] Absolute path to the config file
29
+ def config_file
30
+ File.join(USER_PATH, 'config.yml')
31
+ end
32
+
26
33
  protected
27
- # Ensures config file exists in the user config folder
34
+ # Initialize the configuration file
35
+ def initialize_config_file
36
+ File.open(config_file, 'w') do |f|
37
+ f.write(File.read(File.join(TEMPLATE_PATH, 'config.yml')))
38
+ end
39
+ end
40
+
41
+ # Check the config file
42
+ def check_config_file
43
+ # Check that config_file is defined
44
+ raise ConfigNotDefinedError unless config_file
45
+ # Check that the config file exists
46
+ initialize_config_file unless ::File.exists?(config_file)
47
+ # Check that the config file is readable?
48
+ raise ConfigNotReadableError unless ::File.readable?(config_file)
49
+ end
50
+
51
+ # Parse the config file
28
52
  #
29
- # @param [Void]
30
- # @return [Void]
31
- # @raise [Void]
32
- def ensure_config_file_exists
33
- unless File.exists?(CONFIG_FILE)
34
- File.open(CONFIG_FILE, 'w') do |f|
35
- f.write(File.read(File.join(TEMPLATE_PATH, 'config.yml')))
36
- end
53
+ # @return [HashWithIndifferentAccess] The config
54
+ def parse_config_file
55
+ begin
56
+ parsed_yaml = YAML.parse_file config_file
57
+ rescue Psych::SyntaxError => e
58
+ raise ConfigNotValidError,
59
+ "Not valid YAML file: #{e.message}."
37
60
  end
61
+ raise ConfigNotValidError,
62
+ "Not valid YAML file: The YAML does not respond_to to_ruby." unless parsed_yaml.respond_to?(:to_ruby)
63
+ config = HashWithIndifferentAccess.new(parsed_yaml.to_ruby)
64
+ raise ConfigNotValidError,
65
+ "Not valid YAML file: It doesn't contain watch_tower root key." unless config.has_key?(:watch_tower)
66
+
67
+ config
38
68
  end
39
69
  end
40
- end
70
+ end
@@ -29,4 +29,11 @@ module WatchTower
29
29
 
30
30
  # Exceptions raised by the Eye module
31
31
  EyeError = Class.new WatchTowerError
32
+
33
+ # Exceptions raised by the Config module
34
+ ConfigError = Class.new WatchTowerError
35
+ ConfigNotReadableError = Class.new ConfigError
36
+ ConfigNotFound = Class.new ConfigError
37
+ ConfigNotDefinedError = Class.new ConfigError
38
+ ConfigNotValidError = Class.new ConfigError
32
39
  end
@@ -21,11 +21,11 @@ module WatchTower
21
21
  # Migrate the database
22
22
  migrate!
23
23
  rescue DatabaseConfigNotFoundError
24
- STDERR.puts "Database configurations are missing, please edit #{Config::CONFIG_FILE} and try again."
25
- exit(1)
24
+ raise ConfigNotFound,
25
+ "Database configurations are missing, please edit #{Config.config_file} and try again."
26
26
  rescue ::ActiveRecord::ConnectionNotEstablished => e
27
- STDERR.puts "There was an error connecting to the database: #{e}"
28
- exit(1)
27
+ raise DatabaseError,
28
+ "There was an error connecting to the database: #{error}"
29
29
  end
30
30
 
31
31
  # Stop the database server
@@ -36,11 +36,11 @@ module WatchTower
36
36
  # Disconnect from the database
37
37
  disconnect!
38
38
  rescue DatabaseConfigNotFoundError
39
- STDERR.puts "Database configurations are missing, please edit #{Config::CONFIG_FILE} and try again."
40
- exit(1)
39
+ raise ConfigNotFound,
40
+ "Database configurations are missing, please edit #{Config.config_file} and try again."
41
41
  rescue ::ActiveRecord::ConnectionNotEstablished => e
42
- STDERR.puts "There was an error connecting to the database: #{e}"
43
- exit(1)
42
+ raise DatabaseError,
43
+ "There was an error connecting to the database: #{error}"
44
44
  end
45
45
 
46
46
  def is_connected?
@@ -103,4 +103,4 @@ module WatchTower
103
103
  end
104
104
  end
105
105
  end
106
- end
106
+ end
@@ -4,7 +4,7 @@ module WatchTower
4
4
  MAJOR = 0
5
5
  MINOR = 0
6
6
  TINY = 1
7
- PRE = 'beta10'
7
+ PRE = 'beta11'
8
8
 
9
9
  def self.version
10
10
  # Init the version
@@ -1,6 +1,21 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe WatchTower::Config do
4
+ before(:each) do
5
+ @config = {watch_tower: {enabled: true}}
6
+ @config_path = '/valid/path'
7
+ @invalid_config_path = '/invalid/path'
8
+ @yaml = mock
9
+ @yaml.stubs(:to_ruby).returns(@config)
10
+ Psych.stubs(:parse_file).with(@config_path).returns(@yaml)
11
+ WatchTower::Config.stubs(:config_file).returns(@config_path)
12
+
13
+ ::File.stubs(:exists?).with(@config_path).returns(true)
14
+ ::File.stubs(:readable?).with(@config_path).returns(true)
15
+
16
+ ::File.stubs(:exists?).with(@invalid_config_path).returns(false)
17
+ ::File.stubs(:readable?).with(@invalid_config_path).returns(false)
18
+ end
4
19
 
5
20
  describe "@@config" do
6
21
  it "should have and class_variable @@config" do
@@ -8,18 +23,135 @@ describe WatchTower::Config do
8
23
  end
9
24
  end
10
25
 
11
- describe "#ensure_config_file_exists" do
12
- it "should respond_to ensure_config_file_exists" do
13
- -> { subject.send :ensure_config_file_exists }.should_not raise_error NoMethodError
26
+ describe "#check_config_file" do
27
+ before(:each) do
28
+ WatchTower::Config.stubs(:initialize_config_file)
29
+ end
30
+
31
+ it { should respond_to :check_config_file }
32
+
33
+ it "should call File.exists?" do
34
+ ::File.expects(:exists?).with(@config_path).returns(true).once
35
+
36
+ subject.send(:check_config_file)
14
37
  end
15
38
 
16
- it "should be able to create the config file from the template if it doesn't exist" do
39
+ it "should call File.readable?" do
40
+ ::File.expects(:readable?).with(@config_path).returns(true).once
41
+
42
+ subject.send(:check_config_file)
43
+ end
44
+ end
45
+
46
+ describe "#initialize_config_file" do
47
+ it { should respond_to :initialize_config_file }
48
+
49
+ it "should be able to create the config file from the template" do
17
50
  config_file = mock
18
51
  config_file.expects(:write).once
19
- File.expects(:exists?).with(WatchTower::Config::CONFIG_FILE).returns(false).once
20
- File.expects(:open).with(WatchTower::Config::CONFIG_FILE, 'w').yields(config_file).once
52
+ File.expects(:open).with(WatchTower::Config.config_file, 'w').yields(config_file).once
53
+
54
+ subject.send :initialize_config_file
55
+ end
56
+ end
57
+
58
+ describe "#parse_config_file" do
59
+ before(:each) do
60
+ WatchTower::Config.send(:class_variable_set, :@@config, nil)
61
+ WatchTower::Config.stubs(:initialize_config_file)
62
+ end
63
+
64
+ it { should respond_to :parse_config_file }
65
+
66
+ it "should parse the config file and return an instance of HashWithIndifferentAccess" do
67
+ subject.send(:parse_config_file).should be_instance_of HashWithIndifferentAccess
68
+ end
69
+
70
+ it "should handle the case where config is not a valid YAML file." do
71
+ Psych.stubs(:parse_file).raises(Psych::SyntaxError)
72
+
73
+ -> { subject.send :parse_config_file }.should raise_error ConfigNotValidError
74
+ end
75
+
76
+ it "should handle the case where Psych returns nil." do
77
+ Psych.stubs(:parse_file).with(@config_path).returns(nil)
78
+
79
+ -> { subject.send :parse_config_file }.should raise_error ConfigNotValidError
80
+ end
81
+
82
+ it "should handle the case where :watch_tower key does not exist" do
83
+ config = {}
84
+ yaml = mock
85
+ yaml.stubs(:to_ruby).returns(config)
86
+ Psych.stubs(:parse_file).with(@config_path).returns(yaml)
87
+
88
+ -> { subject.send :parse_config_file }.should raise_error ConfigNotValidError
89
+ end
90
+ end
91
+
92
+ describe "#[]" do
93
+ before(:each) do
94
+ WatchTower::Config.send(:class_variable_set, :@@config, nil)
95
+ WatchTower::Config.stubs(:initialize_config_file)
96
+ end
97
+
98
+ it "should call check_config_file" do
99
+ WatchTower::Config.expects(:check_config_file).once
100
+
101
+ subject[:enabled]
102
+ end
103
+
104
+ it "should call config_file" do
105
+ WatchTower::Config.expects(:config_file).returns(@config_path).once
106
+
107
+ subject[:enabled]
108
+ end
109
+
110
+ it "should call YAML.parse_file" do
111
+ Psych.expects(:parse_file).with(@config_path).returns(@yaml).once
112
+
113
+ subject[:enabled]
114
+ end
115
+
116
+ it "should call to_ruby on the YAML result" do
117
+ @yaml.expects(:to_ruby).returns(@config).once
118
+
119
+ subject[:enabled]
120
+ end
121
+
122
+ it "should create a new HashWithIndifferentAccess" do
123
+ HashWithIndifferentAccess.expects(:new).returns(@config).once
124
+
125
+ subject[:enabled]
126
+ end
127
+
128
+ it "should raise ConfigNotDefinedError if config not found" do
129
+ WatchTower::Config.stubs(:config_file).returns(nil)
130
+ ::File.stubs(:exists?).with(@invalid_config_path).returns(false)
131
+
132
+ -> { subject[:enabled] }.should raise_error ConfigNotDefinedError
133
+ end
134
+
135
+ it "should raise ConfigNotReadableError if config not found" do
136
+ WatchTower::Config.stubs(:config_file).returns(@invalid_config_path)
137
+ ::File.stubs(:readable?).with(@invalid_config_path).returns(false)
138
+
139
+ -> { subject[:enabled] }.should raise_error ConfigNotReadableError
140
+ end
141
+
142
+ it "should handle the case where config is not a valid YAML file." do
143
+ Psych.stubs(:parse_file).with(@config_path).returns(nil)
144
+
145
+ -> { subject[:enabled] }.should raise_error ConfigNotValidError
146
+ end
147
+
148
+ it "should handle the case where :watch_tower key does not exist" do
149
+ config = {}
150
+ yaml = mock
151
+ yaml.stubs(:to_ruby).returns(config)
152
+ Psych.stubs(:parse_file).with(@config_path).returns(yaml)
21
153
 
22
- subject.send :ensure_config_file_exists
154
+ -> { subject[:enabled] }.should raise_error ConfigNotValidError
23
155
  end
24
156
  end
25
157
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watch_tower
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.beta10
4
+ version: 0.0.1.beta11
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-27 00:00:00.000000000 Z
12
+ date: 2011-10-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &4456300 !ruby/object:Gem::Requirement
16
+ requirement: &5402520 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.1.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *4456300
24
+ version_requirements: *5402520
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: i18n
27
- requirement: &4469840 !ruby/object:Gem::Requirement
27
+ requirement: &4966260 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.6.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *4469840
35
+ version_requirements: *4966260
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activerecord
38
- requirement: &4466500 !ruby/object:Gem::Requirement
38
+ requirement: &5093740 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 3.1.1
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *4466500
46
+ version_requirements: *5093740
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: sinatra
49
- requirement: &4465200 !ruby/object:Gem::Requirement
49
+ requirement: &5092860 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.3.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *4465200
57
+ version_requirements: *5092860
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: sinatra-snap
60
- requirement: &4464520 !ruby/object:Gem::Requirement
60
+ requirement: &5092160 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.3.2
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *4464520
68
+ version_requirements: *5092160
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: haml
71
- requirement: &4463680 !ruby/object:Gem::Requirement
71
+ requirement: &5089700 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 3.1.3
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *4463680
79
+ version_requirements: *5089700
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: grit
82
- requirement: &4475980 !ruby/object:Gem::Requirement
82
+ requirement: &5048100 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 2.4.1
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *4475980
90
+ version_requirements: *5048100
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: coffee-script
93
- requirement: &4473680 !ruby/object:Gem::Requirement
93
+ requirement: &5439660 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 2.2.0
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *4473680
101
+ version_requirements: *5439660
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: uglifier
104
- requirement: &4485180 !ruby/object:Gem::Requirement
104
+ requirement: &5523540 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 1.0.3
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *4485180
112
+ version_requirements: *5523540
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: sass
115
- requirement: &5352920 !ruby/object:Gem::Requirement
115
+ requirement: &5608600 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 3.1.10
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *5352920
123
+ version_requirements: *5608600
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: sprockets
126
- requirement: &5349780 !ruby/object:Gem::Requirement
126
+ requirement: &5608120 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 2.0.2
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *5349780
134
+ version_requirements: *5608120
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: cronedit
137
- requirement: &5347480 !ruby/object:Gem::Requirement
137
+ requirement: &5607480 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 0.3.0
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *5347480
145
+ version_requirements: *5607480
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: guard
148
- requirement: &5362620 !ruby/object:Gem::Requirement
148
+ requirement: &5606940 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ~>
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 0.8.4
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *5362620
156
+ version_requirements: *5606940
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: guard-bundler
159
- requirement: &5361640 !ruby/object:Gem::Requirement
159
+ requirement: &5606120 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ~>
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: 0.1.3
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *5361640
167
+ version_requirements: *5606120
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: guard-rspec
170
- requirement: &5360740 !ruby/object:Gem::Requirement
170
+ requirement: &5604680 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ~>
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: 0.4.5
176
176
  type: :development
177
177
  prerelease: false
178
- version_requirements: *5360740
178
+ version_requirements: *5604680
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: guard-sprockets2
181
- requirement: &5359540 !ruby/object:Gem::Requirement
181
+ requirement: &5603880 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ~>
@@ -186,10 +186,10 @@ dependencies:
186
186
  version: 0.0.5
187
187
  type: :development
188
188
  prerelease: false
189
- version_requirements: *5359540
189
+ version_requirements: *5603880
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: yard
192
- requirement: &5358300 !ruby/object:Gem::Requirement
192
+ requirement: &5603200 !ruby/object:Gem::Requirement
193
193
  none: false
194
194
  requirements:
195
195
  - - ~>
@@ -197,10 +197,10 @@ dependencies:
197
197
  version: 0.7.2
198
198
  type: :development
199
199
  prerelease: false
200
- version_requirements: *5358300
200
+ version_requirements: *5603200
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: rspec
203
- requirement: &5356340 !ruby/object:Gem::Requirement
203
+ requirement: &5602120 !ruby/object:Gem::Requirement
204
204
  none: false
205
205
  requirements:
206
206
  - - ~>
@@ -208,10 +208,10 @@ dependencies:
208
208
  version: 2.6.0
209
209
  type: :development
210
210
  prerelease: false
211
- version_requirements: *5356340
211
+ version_requirements: *5602120
212
212
  - !ruby/object:Gem::Dependency
213
213
  name: rspec-rails
214
- requirement: &5368240 !ruby/object:Gem::Requirement
214
+ requirement: &5601240 !ruby/object:Gem::Requirement
215
215
  none: false
216
216
  requirements:
217
217
  - - ~>
@@ -219,10 +219,10 @@ dependencies:
219
219
  version: 2.6.1
220
220
  type: :development
221
221
  prerelease: false
222
- version_requirements: *5368240
222
+ version_requirements: *5601240
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: capybara
225
- requirement: &5365440 !ruby/object:Gem::Requirement
225
+ requirement: &5678180 !ruby/object:Gem::Requirement
226
226
  none: false
227
227
  requirements:
228
228
  - - ~>
@@ -230,10 +230,10 @@ dependencies:
230
230
  version: 1.1.1
231
231
  type: :development
232
232
  prerelease: false
233
- version_requirements: *5365440
233
+ version_requirements: *5678180
234
234
  - !ruby/object:Gem::Dependency
235
235
  name: launchy
236
- requirement: &5394640 !ruby/object:Gem::Requirement
236
+ requirement: &5677000 !ruby/object:Gem::Requirement
237
237
  none: false
238
238
  requirements:
239
239
  - - ~>
@@ -241,10 +241,10 @@ dependencies:
241
241
  version: 2.0.5
242
242
  type: :development
243
243
  prerelease: false
244
- version_requirements: *5394640
244
+ version_requirements: *5677000
245
245
  - !ruby/object:Gem::Dependency
246
246
  name: mocha
247
- requirement: &5402720 !ruby/object:Gem::Requirement
247
+ requirement: &5674720 !ruby/object:Gem::Requirement
248
248
  none: false
249
249
  requirements:
250
250
  - - ~>
@@ -252,10 +252,10 @@ dependencies:
252
252
  version: 0.10.0
253
253
  type: :development
254
254
  prerelease: false
255
- version_requirements: *5402720
255
+ version_requirements: *5674720
256
256
  - !ruby/object:Gem::Dependency
257
257
  name: factory_girl
258
- requirement: &4967600 !ruby/object:Gem::Requirement
258
+ requirement: &5672560 !ruby/object:Gem::Requirement
259
259
  none: false
260
260
  requirements:
261
261
  - - ~>
@@ -263,10 +263,10 @@ dependencies:
263
263
  version: 2.1.2
264
264
  type: :development
265
265
  prerelease: false
266
- version_requirements: *4967600
266
+ version_requirements: *5672560
267
267
  - !ruby/object:Gem::Dependency
268
268
  name: timecop
269
- requirement: &5094520 !ruby/object:Gem::Requirement
269
+ requirement: &5671000 !ruby/object:Gem::Requirement
270
270
  none: false
271
271
  requirements:
272
272
  - - ~>
@@ -274,10 +274,10 @@ dependencies:
274
274
  version: 0.3.5
275
275
  type: :development
276
276
  prerelease: false
277
- version_requirements: *5094520
277
+ version_requirements: *5671000
278
278
  - !ruby/object:Gem::Dependency
279
279
  name: pry
280
- requirement: &5090800 !ruby/object:Gem::Requirement
280
+ requirement: &5724100 !ruby/object:Gem::Requirement
281
281
  none: false
282
282
  requirements:
283
283
  - - ~>
@@ -285,7 +285,7 @@ dependencies:
285
285
  version: 0.9.6.2
286
286
  type: :development
287
287
  prerelease: false
288
- version_requirements: *5090800
288
+ version_requirements: *5724100
289
289
  description: ! 'Did you ever want to keep track of how much time you _really_ spend
290
290
  on all of
291
291