watch_tower 0.0.1.beta10 → 0.0.1.beta11

Sign up to get free protection for your applications and to get access to all the features.
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