file_monitoring 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/bin/file_monitoring CHANGED
@@ -41,18 +41,14 @@ if ARGV.length > 1
41
41
  conf_file_path = File.expand_path(ARGV[1])
42
42
  end
43
43
 
44
- daemon_suffix = ''
45
- if ARGV.length > 2
46
- daemon_suffix = '_' + ARGV[2]
47
- end
48
-
49
- puts "Config taken from:" + conf_file_path
44
+ puts "Taking config from:" + conf_file_path
45
+ YAML::load_file(conf_file_path) rescue abort("Can't load %s" % conf_file_path)
50
46
  pid_dir = File.expand_path('~/.bbfs/run/')
51
47
  FileUtils.mkdir_p(pid_dir)
52
48
  puts "pid dir:" + pid_dir
53
49
 
54
50
  Daemons.run_proc(
55
- 'file_monitoring' + daemon_suffix, # name of daemon
51
+ 'file_monitoring', # name of daemon
56
52
  :dir_mode => :normal,
57
53
  :dir => pid_dir, # directory where pid file will be stored
58
54
  # :backtrace => true,
@@ -1,52 +1,71 @@
1
- require './file_monitoring/monitor_path.rb'
2
1
  require 'algorithms'
3
2
  require 'fileutils'
3
+ require 'params'
4
4
  require 'yaml'
5
5
 
6
- # The main method. Loops on all paths each time span and monitors them.
7
- def monitor_files(config_path)
8
- config_yml = YAML::load_file(config_path)
9
- if config_yml
10
- puts "Error loading config file, exiting."
11
- return
12
- end
6
+ require_relative 'monitor_path'
13
7
 
14
- conf_array = config_yml["paths"]
15
-
16
- pq = Containers::PriorityQueue.new
17
- conf_array.each { |elem|
18
- priority = (Time.now + elem["scan_period"]).to_i
19
- pq.push([priority, elem, DirStat.new(elem["path"], elem["stable_state"])], -priority)
20
- }
21
-
22
- log_path = File.expand_path("~/.bbfs/log/file_monitoring.log")
23
- if config_yml.key?("log_path")
24
- log_path = File.expand_path(config_yml["log_path"])
25
- end
8
+ module BBFS
9
+ module FileMonitoring
26
10
 
27
- puts "Log path:" + log_path
28
- FileUtils.mkdir_p(File.dirname(log_path))
29
- log = File.open(log_path, 'w')
30
- FileStat.set_log(log)
11
+ PARAMS.parameter('default_log_path', File.expand_path('~/.bbfs/log/file_monitoring.log'),
12
+ 'Default path for log file.')
31
13
 
32
- while true do
33
- time, conf, dir_stat = pq.pop
34
- #puts "time:" + time.to_s()
35
- #puts "now:" + Time.now.to_i.to_s()
36
- #puts conf
14
+ class FileMonitoring
37
15
 
38
- time_span = time - Time.now.to_i
39
- if (time_span > 0)
40
- sleep(time_span)
41
- end
16
+ def set_config_path(config_path)
17
+ @config_path = config_path
18
+ end
42
19
 
43
- dir_stat.monitor
20
+ def set_event_queue(queue)
21
+ @event_queue = queue
22
+ end
44
23
 
45
- #puts conf["path"]
46
- #puts conf["scan_period"]
47
- priority = (Time.now + conf["scan_period"]).to_i
48
- pq.push([priority, conf, dir_stat], -priority)
49
- end
24
+ def monitor_files
25
+ config_yml = YAML::load_file(@config_path)
26
+
27
+ conf_array = config_yml['paths']
28
+
29
+ pq = Containers::PriorityQueue.new
30
+ conf_array.each { |elem|
31
+ priority = (Time.now + elem['scan_period']).to_i
32
+ dir_stat = DirStat.new(elem['path'], elem['stable_state'])
33
+ dir_stat.set_event_queue(@event_queue) if @event_queue
34
+ pq.push([priority, elem, dir_stat], -priority)
35
+ }
36
+
37
+ log_path = PARAMS.default_log_path
38
+ if config_yml.key?('log_path')
39
+ log_path = File.expand_path(config_yml['log_path'])
40
+ end
41
+
42
+ puts 'Log path:' + log_path
43
+ FileUtils.mkdir_p(File.dirname(log_path))
44
+ log = File.open(log_path, 'w')
45
+ FileStat.set_log(log)
50
46
 
51
- log.close
47
+ while true do
48
+ time, conf, dir_stat = pq.pop
49
+ #puts 'time:' + time.to_s()
50
+ #puts 'now:' + Time.now.to_i.to_s()
51
+ #puts conf
52
+
53
+ time_span = time - Time.now.to_i
54
+ if (time_span > 0)
55
+ sleep(time_span)
56
+ end
57
+
58
+ dir_stat.monitor
59
+
60
+ #puts conf['path']
61
+ #puts conf['scan_period']
62
+ priority = (Time.now + conf['scan_period']).to_i
63
+ pq.push([priority, conf, dir_stat], -priority)
64
+ end
65
+
66
+ log.close
67
+ end
68
+ end
69
+
70
+ end
52
71
  end
@@ -1,265 +1,283 @@
1
- # Path monitoring.
2
-
3
- # Enum-like structure that includes possible filesystem entities (files/directories) states:
4
- # * <tt>NON_EXISTING</tt> - Entity that was treated during previous run, but absent currently
5
- # * <tt>NEW</tt> - Entity that was found and added to control during this run
6
- # * <tt>CHANGED</tt> - State was changed between two checks
7
- # * <tt>UNCHANGED</tt> - Opposite to CHANGED
8
- # * <tt>STABLE</tt> - Entity is in the UNCHANGED state for a defined (by user) number of iterations
9
- class FileStatEnum
10
- NON_EXISTING = "NON_EXISTING"
11
- NEW = "NEW"
12
- CHANGED = "CHANGED"
13
- UNCHANGED = "UNCHANGED"
14
- STABLE = "STABLE"
15
- end
16
-
17
- # This class holds current state of file and methods to control and report changes
18
- class FileStat
19
- attr_reader :cycles, :path, :stable_state, :state, :size, :modification_time
1
+ module BBFS
2
+ module FileMonitoring
3
+ # Path monitoring.
4
+
5
+ # Enum-like structure that includes possible filesystem entities (files/directories) states:
6
+ # * <tt>NON_EXISTING</tt> - Entity that was treated during previous run, but absent currently
7
+ # * <tt>NEW</tt> - Entity that was found and added to control during this run
8
+ # * <tt>CHANGED</tt> - State was changed between two checks
9
+ # * <tt>UNCHANGED</tt> - Opposite to CHANGED
10
+ # * <tt>STABLE</tt> - Entity is in the UNCHANGED state for a defined (by user) number of iterations
11
+ class FileStatEnum
12
+ NON_EXISTING = "NON_EXISTING"
13
+ NEW = "NEW"
14
+ CHANGED = "CHANGED"
15
+ UNCHANGED = "UNCHANGED"
16
+ STABLE = "STABLE"
17
+ end
20
18
 
21
- DEFAULT_STABLE_STATE = 10
19
+ # This class holds current state of file and methods to control and report changes
20
+ class FileStat
21
+ attr_reader :cycles, :path, :stable_state, :state, :size, :modification_time
22
22
 
23
- @@log = nil
23
+ DEFAULT_STABLE_STATE = 10
24
24
 
25
- # Initializes new file monitoring object
26
- # ==== Arguments:
27
- #
28
- # * <tt>path</tt> - File location
29
- # * <tt>stable_state</tt> - Number of iterations to move unchanged file to stable state
30
- def initialize(path, stable_state = DEFAULT_STABLE_STATE)
31
- @path ||= path
32
- @size = nil
33
- @modification_time = nil
34
- @cycles = 0 # number of iterations from the last file modification
35
- @state = FileStatEnum::NON_EXISTING
25
+ @@log = nil
36
26
 
37
- @stable_state = stable_state # number of iteration to move unchanged file to stable state
38
- end
27
+ # Initializes new file monitoring object
28
+ # ==== Arguments:
29
+ #
30
+ # * <tt>path</tt> - File location
31
+ # * <tt>stable_state</tt> - Number of iterations to move unchanged file to stable state
32
+ def initialize(path, stable_state = DEFAULT_STABLE_STATE)
33
+ @path ||= path
34
+ @size = nil
35
+ @modification_time = nil
36
+ @cycles = 0 # number of iterations from the last file modification
37
+ @state = FileStatEnum::NON_EXISTING
39
38
 
40
- # Sets a log file to report changes
41
- # ==== Arguments:
42
- #
43
- # * <tt>log</tt> - already opened ruby File object
44
- def self.set_log (log)
45
- @@log = log
46
- end
39
+ @stable_state = stable_state # number of iteration to move unchanged file to stable state
40
+ end
47
41
 
48
- # Checks whether file was changed from the last iteration.
49
- # For files size and modification time are checked.
50
- def monitor
51
- file_stats = File.lstat(@path) rescue nil
52
- new_state = nil
53
- if file_stats == nil
54
- new_state = FileStatEnum::NON_EXISTING
55
- @size = nil
56
- @modification_time = nil
57
- @cycles = 0
58
- elsif @size == nil
59
- new_state = FileStatEnum::NEW
60
- @size = file_stats.size
61
- @modification_time = file_stats.mtime.utc
62
- @cycles = 0
63
- elsif changed?(file_stats)
64
- new_state = FileStatEnum::CHANGED
65
- @size = file_stats.size
66
- @modification_time = file_stats.mtime.utc
67
- @cycles = 0
68
- else
69
- new_state = FileStatEnum::UNCHANGED
70
- @cycles += 1
71
- if @cycles >= @stable_state
72
- new_state = FileStatEnum::STABLE
42
+ def set_output_queue event_queue
43
+ @event_queue
73
44
  end
74
- end
75
45
 
76
- # The assignment
77
- self.state= new_state
78
- end
46
+ # Sets a log file to report changes
47
+ # ==== Arguments:
48
+ #
49
+ # * <tt>log</tt> - already opened ruby File object
50
+ def self.set_log (log)
51
+ @@log = log
52
+ end
79
53
 
80
- # Checks that stored file attributes are the same as file attributes taken from file system.
81
- def changed?(file_stats)
82
- not (file_stats.size == size and file_stats.mtime.utc == modification_time.utc)
83
- end
54
+ # Checks whether file was changed from the last iteration.
55
+ # For files size and modification time are checked.
56
+ def monitor
57
+ file_stats = File.lstat(@path) rescue nil
58
+ new_state = nil
59
+ if file_stats == nil
60
+ new_state = FileStatEnum::NON_EXISTING
61
+ @size = nil
62
+ @modification_time = nil
63
+ @cycles = 0
64
+ elsif @size == nil
65
+ new_state = FileStatEnum::NEW
66
+ @size = file_stats.size
67
+ @modification_time = file_stats.mtime.utc
68
+ @cycles = 0
69
+ elsif changed?(file_stats)
70
+ new_state = FileStatEnum::CHANGED
71
+ @size = file_stats.size
72
+ @modification_time = file_stats.mtime.utc
73
+ @cycles = 0
74
+ else
75
+ new_state = FileStatEnum::UNCHANGED
76
+ @cycles += 1
77
+ if @cycles >= @stable_state
78
+ new_state = FileStatEnum::STABLE
79
+ end
80
+ end
84
81
 
85
- # Sets and writes to the log a new state.
86
- def state= (new_state)
87
- if (@state != new_state or @state == FileStatEnum::CHANGED)
88
- @state = new_state
89
- if (@@log)
90
- @@log.puts(cur_stat)
91
- @@log.flush #Ruby1.9.3: note that this is Ruby internal buffering only; the OS may buffer the data as well
82
+ # The assignment
83
+ self.state= new_state
92
84
  end
93
- end
94
- end
95
85
 
96
- # Checks whether path and state are the same as of the argument
97
- def == (other)
98
- @path == other.path and @stable_state == other.stable_state
99
- end
86
+ # Checks that stored file attributes are the same as file attributes taken from file system.
87
+ def changed?(file_stats)
88
+ not (file_stats.size == size and file_stats.mtime.utc == modification_time.utc)
89
+ end
100
90
 
101
- # Returns path and state of the file with indentation
102
- def to_s (indent = 0)
103
- (" " * indent) + path.to_s + " : " + state.to_s
104
- end
91
+ def set_event_queue(queue)
92
+ @event_queue = queue
93
+ end
105
94
 
106
- # Reports current state with identification.
107
- # # This format used by log file.
108
- def cur_stat
109
- # TODO what output format have to be ?
110
- Time.now.utc.to_s + " : " + self.state + " : " + self.path
111
- end
112
- end
95
+ # Sets and writes to the log a new state.
96
+ def state= (new_state)
97
+ if (@state != new_state or @state == FileStatEnum::CHANGED)
98
+ @state = new_state
99
+ if (@@log)
100
+ @@log.puts(cur_stat)
101
+ @@log.flush #Ruby1.9.3: note that this is Ruby internal buffering only; the OS may buffer the data as well
102
+ end
103
+ if (@event_queue && !self.instance_of?(DirStat))
104
+ p "Writing to event queue [#{self.state}, #{self.path}]"
105
+ @event_queue.push([self.state, self.path])
106
+ end
107
+ end
108
+ end
113
109
 
114
- # This class holds current state of directory and methods to control changes
115
- class DirStat < FileStat
116
- # Initializes new directory monitoring object
117
- # ==== Arguments:
118
- #
119
- # * <tt>path</tt> - File location
120
- # * <tt>stable_state</tt> - Number of iterations to move unchanged directory to stable state
121
- def initialize(path, stable_state = DEFAULT_STABLE_STATE)
122
- super
123
- @dirs = nil
124
- @files = nil
125
- end
110
+ # Checks whether path and state are the same as of the argument
111
+ def == (other)
112
+ @path == other.path and @stable_state == other.stable_state
113
+ end
126
114
 
127
- # Adds directory for monitoring.
128
- def add_dir (dir)
129
- @dirs[dir.path] = dir
130
- end
115
+ # Returns path and state of the file with indentation
116
+ def to_s (indent = 0)
117
+ (" " * indent) + path.to_s + " : " + state.to_s
118
+ end
131
119
 
132
- # Adds file for monitoring.
133
- def add_file (file)
134
- @files[file.path] = file
135
- end
120
+ # Reports current state with identification.
121
+ # # This format used by log file.
122
+ def cur_stat
123
+ # TODO what output format have to be ?
124
+ Time.now.utc.to_s + " : " + self.state + " : " + self.path
125
+ end
126
+ end
136
127
 
137
- # Removes directory from monitoring.
138
- def rm_dir(dir)
139
- @dirs.delete(dir.path)
140
- end
128
+ # This class holds current state of directory and methods to control changes
129
+ class DirStat < FileStat
130
+ # Initializes new directory monitoring object
131
+ # ==== Arguments:
132
+ #
133
+ # * <tt>path</tt> - File location
134
+ # * <tt>stable_state</tt> - Number of iterations to move unchanged directory to stable state
135
+ def initialize(path, stable_state = DEFAULT_STABLE_STATE)
136
+ super
137
+ @dirs = nil
138
+ @files = nil
139
+ end
141
140
 
142
- # Removes file from monitoring.
143
- def rm_file(file)
144
- @files.delete(file.path)
145
- end
141
+ # Adds directory for monitoring.
142
+ def add_dir (dir)
143
+ @dirs[dir.path] = dir
144
+ end
146
145
 
147
- # Checks that there is a sub-folder with a given path.
148
- def has_dir?(path)
149
- @dirs.has_key?(path)
150
- end
146
+ # Adds file for monitoring.
147
+ def add_file (file)
148
+ @files[file.path] = file
149
+ end
151
150
 
152
- # Checks that there is a file with a given path.
153
- def has_file?(path)
154
- @files.has_key?(path)
155
- end
151
+ # Removes directory from monitoring.
152
+ def rm_dir(dir)
153
+ @dirs.delete(dir.path)
154
+ end
156
155
 
157
- # Returns string with contains path and state of this directory as well as it's structure.
158
- def to_s(indent = 0)
159
- indent_increment = 2
160
- child_indent = indent + indent_increment
161
- res = super
162
- @files.each_value do |file|
163
- res += "\n" + file.to_s(child_ident)
164
- end
165
- @dirs.each_value do |dir|
166
- res += "\n" + dir.to_s(child_ident)
167
- end
168
- res
169
- end
156
+ # Removes file from monitoring.
157
+ def rm_file(file)
158
+ @files.delete(file.path)
159
+ end
170
160
 
171
- # Checks that directory structure (i.e. files and directories located directly under this directory)
172
- # wasn't changed since the last iteration.
173
- def monitor
174
- was_changed = false
175
- new_state = nil
176
- self_stat = File.lstat(@path) rescue nil
177
- if self_stat == nil
178
- new_state = FileStatEnum::NON_EXISTING
179
- @files = nil
180
- @dirs = nil
181
- @cycles = 0
182
- elsif @files == nil
183
- new_state = FileStatEnum::NEW
184
- @files = Hash.new
185
- @dirs = Hash.new
186
- @cycles = 0
187
- update_dir
188
- elsif update_dir
189
- new_state = FileStatEnum::CHANGED
190
- @cycles = 0
191
- else
192
- new_state = FileStatEnum::UNCHANGED
193
- @cycles += 1
194
- if @cycles >= @stable_state
195
- new_state = FileStatEnum::STABLE
161
+ # Checks that there is a sub-folder with a given path.
162
+ def has_dir?(path)
163
+ @dirs.has_key?(path)
196
164
  end
197
- end
198
165
 
199
- # The assignment
200
- self.state= new_state
201
- end
166
+ # Checks that there is a file with a given path.
167
+ def has_file?(path)
168
+ @files.has_key?(path)
169
+ end
202
170
 
203
- # Updates the files and directories hashes and globs the directory for changes.
204
- def update_dir
205
- was_changed = false
171
+ # Returns string with contains path and state of this directory as well as it's structure.
172
+ def to_s(indent = 0)
173
+ indent_increment = 2
174
+ child_indent = indent + indent_increment
175
+ res = super
176
+ @files.each_value do |file|
177
+ res += "\n" + file.to_s(child_ident)
178
+ end
179
+ @dirs.each_value do |dir|
180
+ res += "\n" + dir.to_s(child_ident)
181
+ end
182
+ res
183
+ end
206
184
 
207
- # monitor existing and absent files
208
- @files.each_value do |file|
209
- file.monitor
185
+ # Checks that directory structure (i.e. files and directories located directly under this directory)
186
+ # wasn't changed since the last iteration.
187
+ def monitor
188
+ was_changed = false
189
+ new_state = nil
190
+ self_stat = File.lstat(@path) rescue nil
191
+ if self_stat == nil
192
+ new_state = FileStatEnum::NON_EXISTING
193
+ @files = nil
194
+ @dirs = nil
195
+ @cycles = 0
196
+ elsif @files == nil
197
+ new_state = FileStatEnum::NEW
198
+ @files = Hash.new
199
+ @dirs = Hash.new
200
+ @cycles = 0
201
+ update_dir
202
+ elsif update_dir
203
+ new_state = FileStatEnum::CHANGED
204
+ @cycles = 0
205
+ else
206
+ new_state = FileStatEnum::UNCHANGED
207
+ @cycles += 1
208
+ if @cycles >= @stable_state
209
+ new_state = FileStatEnum::STABLE
210
+ end
211
+ end
210
212
 
211
- if file.state == FileStatEnum::NON_EXISTING
212
- was_changed = true
213
- rm_file(file)
213
+ # The assignment
214
+ self.state= new_state
214
215
  end
215
- end
216
216
 
217
- @dirs.each_value do |dir|
218
- dir.monitor
217
+ # Updates the files and directories hashes and globs the directory for changes.
218
+ def update_dir
219
+ was_changed = false
219
220
 
220
- if dir.state == FileStatEnum::NON_EXISTING
221
- was_changed = true
222
- rm_dir(dir)
223
- end
224
- end
221
+ # monitor existing and absent files
222
+ @files.each_value do |file|
223
+ file.monitor
225
224
 
226
- was_changed = was_changed || glob_me
225
+ if file.state == FileStatEnum::NON_EXISTING
226
+ was_changed = true
227
+ rm_file(file)
228
+ end
229
+ end
227
230
 
228
- return was_changed
229
- end
231
+ @dirs.each_value do |dir|
232
+ dir.monitor
230
233
 
231
- # Globs the directory for new files and directories
232
- def glob_me
233
- was_changed = false
234
- files = Dir.glob(path + "/*")
235
-
236
- # add and monitor new files and directories
237
- files.each do |file|
238
- file_stat = File.lstat(file) rescue nil
239
- if (file_stat.directory?)
240
- unless (has_dir?(file)) # new directory
241
- # change state only for existing directories
242
- # newly added directories have to remain with NEW state
243
- was_changed = true
244
- ds = DirStat.new(file, self.stable_state)
245
- ds.monitor
246
- add_dir(ds)
234
+ if dir.state == FileStatEnum::NON_EXISTING
235
+ was_changed = true
236
+ rm_dir(dir)
237
+ end
247
238
  end
248
- else # it is a file
249
- unless(has_file?(file)) # new file
250
- # change state only for existing directories
251
- # newly added directories have to remain with NEW state
252
- was_changed = true
253
- fs = FileStat.new(file, self.stable_state)
254
- fs.monitor
255
- add_file(fs)
239
+
240
+ was_changed = was_changed || glob_me
241
+
242
+ return was_changed
243
+ end
244
+
245
+ # Globs the directory for new files and directories
246
+ def glob_me
247
+ was_changed = false
248
+ files = Dir.glob(path + "/*")
249
+
250
+ # add and monitor new files and directories
251
+ files.each do |file|
252
+ file_stat = File.lstat(file) rescue nil
253
+ if (file_stat.directory?)
254
+ unless (has_dir?(file)) # new directory
255
+ # change state only for existing directories
256
+ # newly added directories have to remain with NEW state
257
+ was_changed = true
258
+ ds = DirStat.new(file, self.stable_state)
259
+ ds.set_event_queue(@event_queue) if @event_queue
260
+ ds.monitor
261
+ add_dir(ds)
262
+ end
263
+ else # it is a file
264
+ unless(has_file?(file)) # new file
265
+ # change state only for existing directories
266
+ # newly added directories have to remain with NEW state
267
+ was_changed = true
268
+ fs = FileStat.new(file, self.stable_state)
269
+ fs.set_event_queue(@event_queue) if @event_queue
270
+ fs.monitor
271
+ add_file(fs)
272
+ end
273
+ end
256
274
  end
275
+
276
+ return was_changed
257
277
  end
278
+
279
+ protected :add_dir, :add_file, :rm_dir, :rm_file, :update_dir, :glob_me
258
280
  end
259
281
 
260
- return was_changed
261
282
  end
262
-
263
- protected :add_dir, :add_file, :rm_dir, :rm_file, :update_dir, :glob_me
264
283
  end
265
-
@@ -0,0 +1,19 @@
1
+ require 'params'
2
+
3
+ require_relative 'file_monitoring/file_monitoring'
4
+
5
+ # TODO add description
6
+ module BBFS
7
+ module FileMonitoring
8
+ VERSION = "0.0.3"
9
+
10
+ PARAMS.parameter("config_path","~/.bbfs/etc/file_monitoring.yml",
11
+ "Configuration file for monitoring.")
12
+
13
+ # The main method. Loops on all paths each time span and monitors them.
14
+ def monitor_files
15
+ fm = FileMonitoring.new
16
+ fm.monitor_files
17
+ end
18
+ end
19
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: file_monitoring
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-01-01 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: algorithms
16
- requirement: &70118919911460 !ruby/object:Gem::Requirement
16
+ requirement: &70205909596200 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70118919911460
24
+ version_requirements: *70205909596200
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: daemons
27
- requirement: &70118919911020 !ruby/object:Gem::Requirement
27
+ requirement: &70205909785420 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,18 +32,30 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70118919911020
36
- description: Deamon for monitoring file changes.
35
+ version_requirements: *70205909785420
36
+ - !ruby/object:Gem::Dependency
37
+ name: params
38
+ requirement: &70205909903360 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70205909903360
47
+ description: Deamon for monitoring file changes in set of patterns (blobs).
37
48
  email: kolmanv@gmail.com
38
49
  executables:
39
50
  - file_monitoring
40
51
  extensions: []
41
52
  extra_rdoc_files: []
42
53
  files:
54
+ - lib/file_monitoring.rb
43
55
  - lib/file_monitoring/file_monitoring.rb
44
56
  - lib/file_monitoring/monitor_path.rb
45
57
  - bin/file_monitoring
46
- homepage:
58
+ homepage: http://github.com/kolmanv/bbfs
47
59
  licenses: []
48
60
  post_install_message:
49
61
  rdoc_options: []