win32-taskscheduler 0.2.0 → 2.0.4

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.
@@ -0,0 +1,163 @@
1
+ module Win32
2
+ class TaskScheduler
3
+ module TimeCalcHelper
4
+
5
+ # No of days in given month. Deliberately placed 0 in the
6
+ # beginning to avoid any miscalculations
7
+ #
8
+ DAYS_IN_A_MONTH = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31].freeze
9
+
10
+ # No of days in a month for given year
11
+ #
12
+ # @param [Integer] month
13
+ # @param [Integer] year
14
+ # @return [Integer] No of days
15
+ #
16
+ def days_in_month(month, year)
17
+ month == 2 && is_leap_year?(year) ? 29 : DAYS_IN_A_MONTH[month]
18
+ end
19
+
20
+ # Checks weather the given year is a leap year or not
21
+ #
22
+ # @param [Integer] year
23
+ # @return [Boolean]
24
+ #
25
+ def is_leap_year?(year)
26
+ (((year % 4).zero? && !(year % 100).zero?) || (year % 400).zero?)
27
+ end
28
+
29
+ # Calculates the total minutes within given PTM format time
30
+ #
31
+ # @param [Integer] time_str
32
+ # @return [Integer] Time duration in minutes
33
+ #
34
+ def time_in_minutes(time_str)
35
+ time_in_seconds(time_str) / 60
36
+ end
37
+
38
+ # Calculates the total seconds within given PTM format time
39
+ #
40
+ # @param [Integer] time_str the time in PTM format
41
+ # @return [Integer] Time duration in seconds
42
+ #
43
+ def time_in_seconds(time_str)
44
+ dt_tm_hash = time_details(time_str)
45
+ curr_time = Time.now
46
+
47
+ # Basic time variables
48
+ future_year = curr_time.year + dt_tm_hash[:year].to_i
49
+ future_month = curr_time.month + dt_tm_hash[:month].to_i
50
+ future_day = curr_time.day + dt_tm_hash[:day].to_i
51
+ future_hr = curr_time.hour + dt_tm_hash[:hour].to_i
52
+ future_min = curr_time.min + dt_tm_hash[:min].to_i
53
+ future_sec = curr_time.sec + dt_tm_hash[:sec].to_i
54
+
55
+ # 'extra value' calculations for these time variables
56
+ future_sec, future_min = extra_time(future_sec, future_min, 60)
57
+ future_min, future_hr = extra_time(future_min, future_hr, 60)
58
+ future_hr, future_day = extra_time(future_hr, future_day, 24)
59
+
60
+ # explicit method to calculate overloaded days;
61
+ # They may stretch upto years; heance leap year & months are into consideration
62
+ future_day, future_month, future_year = extra_days(future_day, future_month, future_year, curr_time.month, curr_time.year)
63
+
64
+ future_month, future_year = extra_months(future_month, future_year, curr_time.month, curr_time.year)
65
+
66
+ future_time = Time.new(future_year, future_month, future_day, future_hr, future_min, future_sec)
67
+
68
+ # Difference in time will return seconds
69
+ future_time.to_i - curr_time.to_i
70
+ end
71
+
72
+ # Adjusts the overlapping seconds and returns actual minutes and seconds
73
+ #
74
+ # @example
75
+ # extra_time(65, 2, 60) #=> => [5, 3]
76
+ #
77
+ def extra_time(low_rank, high_rank, div_val)
78
+ a, b = low_rank.divmod(div_val)
79
+ high_rank += a; low_rank = b
80
+ [low_rank, high_rank]
81
+ end
82
+
83
+ # Adjusts the overlapping months and returns actual month and year
84
+ #
85
+ def extra_months(month_count, year_count, _init_month, _init_year)
86
+ year, month_count = month_count.divmod(12)
87
+ if year.positive? && month_count.zero?
88
+ month_count = 12
89
+ year -= 1
90
+ end
91
+ year_count += year
92
+ [month_count, year_count]
93
+ end
94
+
95
+ # Adjusts the overlapping years and months and returns actual days, month and year
96
+ #
97
+ def extra_days(days_count, month_count, year_count, init_month, init_year)
98
+ # Will keep increamenting them with surplus days
99
+ days = days_count
100
+ mth = init_month
101
+ yr = init_year
102
+
103
+ loop do
104
+ days -= days_in_month(mth, yr)
105
+ break if days <= 0
106
+ mth += 1
107
+ if mth > 12
108
+ mth = 1; yr += 1
109
+ end
110
+ days_count = days
111
+ end
112
+
113
+ # Setting actual incremented values
114
+ month_count += (mth - init_month)
115
+ year_count += (yr - init_year)
116
+
117
+ [days_count, month_count, year_count]
118
+ end
119
+
120
+ # Extracts a hash out of given PTM formatted time
121
+ #
122
+ # @param [String] time_str
123
+ # @return [Hash<:year, :month, :day, :hour, :min, :sec>] With their values in Integer
124
+ #
125
+ # @example
126
+ # time_details("PT3S") #=> {sec: 3}
127
+ #
128
+ def time_details(time_str)
129
+ tm_detail = {}
130
+ if time_str.to_s != ""
131
+ # time_str will be like "PxxYxxMxxDTxxHxxMxxS"
132
+ # Ignoring 'P' and extracting date and time
133
+ dt, tm = time_str[1..-1].split("T")
134
+
135
+ # Replacing strings
136
+ if dt.to_s != ""
137
+ dt["Y"] = "year" if dt["Y"]; dt["M"] = "month" if dt["M"]; dt["D"] = "day" if dt["D"]
138
+ dt_tm_string_to_hash(dt, tm_detail)
139
+ end
140
+
141
+ if tm.to_s != ""
142
+ tm["H"] = "hour" if tm["H"]; tm["M"] = "min" if tm["M"]; tm["S"] = "sec" if tm["S"]
143
+ dt_tm_string_to_hash(tm, tm_detail)
144
+ end
145
+ end
146
+ tm_detail
147
+ end
148
+
149
+ # Converts the given date/time string to the hash
150
+ #
151
+ # @param [String] str
152
+ # @param [Hash] tm_detail May be loaded
153
+ # @return [Hash]
154
+ #
155
+ # @example
156
+ # dt_tm_string_to_hash("10year3month", {}) #=> {:year=>"10", :month=>"3"}
157
+ #
158
+ def dt_tm_string_to_hash(str, tm_detail)
159
+ str.split(/(\d+)/)[1..-1].each_slice(2).each_with_object(tm_detail) { |i, h| h[i.last.to_sym] = i.first; }
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,6 @@
1
+ module Win32
2
+ class TaskScheduler
3
+ # The version of the win32-taskscheduler library
4
+ VERSION = "2.0.4".freeze
5
+ end
6
+ end
metadata CHANGED
@@ -1,67 +1,110 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: win32-taskscheduler
3
- version: !ruby/object:Gem::Version
4
- version: 0.2.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.4
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Park Heesob
8
8
  - Daniel J. Berger
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2009-06-19 00:00:00 -06:00
14
- default_executable:
15
- dependencies: []
16
-
17
- description: " The win32-taskscheduler library provides an interface to the MS Windows\n Task Scheduler. With this interface you can create new scheduled tasks,\n configure existing tasks, or delete tasks.\n"
12
+ date: 2019-01-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ffi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: structured_warnings
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: test-unit
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: win32-security
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ description: |2
71
+ The win32-taskscheduler library provides an interface to the MS Windows
72
+ Task Scheduler. With this interface you can create new scheduled tasks,
73
+ configure existing tasks, or delete tasks.
18
74
  email: djberg96@gmail.com
19
75
  executables: []
20
-
21
76
  extensions: []
22
-
23
- extra_rdoc_files:
24
- - README
25
- - CHANGES
26
- - MANIFEST
27
- - doc/taskscheduler.txt
28
- files:
29
- - CHANGES
30
- - doc/taskscheduler.txt
31
- - examples/taskscheduler_example.rb
77
+ extra_rdoc_files: []
78
+ files:
79
+ - lib/win32-taskscheduler.rb
32
80
  - lib/win32/taskscheduler.rb
33
- - MANIFEST
34
- - Rakefile
35
- - README
36
- - test/test_taskscheduler.rb
37
- - win32-taskscheduler.gemspec
38
- has_rdoc: true
39
- homepage: http://www.rubyforge.org/projects/win32utils
40
- licenses:
41
- - Artistic 2.0
81
+ - lib/win32/taskscheduler/constants.rb
82
+ - lib/win32/taskscheduler/helper.rb
83
+ - lib/win32/taskscheduler/sid.rb
84
+ - lib/win32/taskscheduler/time_calc_helper.rb
85
+ - lib/win32/taskscheduler/version.rb
86
+ homepage: https://github.com/chef/win32-taskscheduler
87
+ licenses:
88
+ - Artistic-2.0
89
+ metadata: {}
42
90
  post_install_message:
43
91
  rdoc_options: []
44
-
45
- require_paths:
92
+ require_paths:
46
93
  - lib
47
- required_ruby_version: !ruby/object:Gem::Requirement
48
- requirements:
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
49
96
  - - ">="
50
- - !ruby/object:Gem::Version
51
- version: 1.8.0
52
- version:
53
- required_rubygems_version: !ruby/object:Gem::Requirement
54
- requirements:
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
55
101
  - - ">="
56
- - !ruby/object:Gem::Version
57
- version: "0"
58
- version:
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
59
104
  requirements: []
60
-
61
- rubyforge_project: win32utils
62
- rubygems_version: 1.3.4
105
+ rubyforge_project:
106
+ rubygems_version: 2.7.6
63
107
  signing_key:
64
- specification_version: 3
108
+ specification_version: 4
65
109
  summary: A library for the Windows task scheduler
66
- test_files:
67
- - test/test_taskscheduler.rb
110
+ test_files: []
data/CHANGES DELETED
@@ -1,51 +0,0 @@
1
- == 0.2.0 - 19-Jun-2009
2
- * Rewritten in pure Ruby!
3
- * The TaskScheduler::ONCE constant is now a valid trigger type. Thanks go to
4
- Uri Iurgel for the spot and patch.
5
- * Added the TaskScheduler#exists? method.
6
- * Added the TaskScheduler#tasks alias for the TaskScheduler#enum method.
7
- * The TaskScheduler#new_work_item method now accepts symbols as well as
8
- strings for hash keys, and ignores case. Also, the keys are now validated.
9
- * Renamed the example file and test file.
10
- * Added the 'example' Rake task.
11
- * Fixed some code in the README synopsis that was incorrect.
12
-
13
- == 0.1.0 - 11-May-2008
14
- * The TaskScheduler#save instance method now accepts an optional file name.
15
- * Most of the TaskScheduler setter methods now return the value specified
16
- instead of true.
17
- * Removed the RUN_ONLY_IF_DOCKED and RUN_IF_CONNECTED_TO_INTERNET constants.
18
- The MSDN docs say that they are unused.
19
- * Added more documentation. Much more rdoc friendly now.
20
- * Added many more tests.
21
- * Better type handling for bad arguments.
22
- * Added a Rakefile with tasks for building, installation and testing.
23
- * Added a gemspec.
24
- * Inlined the rdoc documentation.
25
- * Internal project reorganization and code cleanup.
26
-
27
- == 0.0.3 - 1-Mar-2005
28
- * Bug fix for the bitFieldToHumanDays() internal function.
29
- * Moved the 'examples' directory to the toplevel directory.
30
- * Made the CHANGES and README files rdoc friendly.
31
- * Minor updates to taskscheduler.h.
32
-
33
- == 0.0.2 - 04-Aug-2004
34
- * Now uses the newer allocation framework and replaced all instances of the
35
- deprecated STR2CSTR() function with StringValuePtr(). This means that, as
36
- of this release, Ruby 1.8.0 or later is required.
37
- * Modified the constructor to accept arguments. This is just some sugar for
38
- creating a new task item in one call instead of two.
39
- * The argument to trigger= now must be a hash. The same goes for the 'type'
40
- sub-hash.
41
- * Added the add_trigger() method. Actually, the C code for this method was
42
- already in place, I simply forgot to create a corresponding Ruby method
43
- for it.
44
- * Removed the create_trigger() method. This was really nothing more than an
45
- alias for trigger=(). I got confused somehow.
46
- * Test suite modified and many more tests added.
47
- * Documentation updates, including docs for a couple of methods that I had
48
- accidentally omitted previously.
49
-
50
- == 0.0.1 - 24-Apr-2004
51
- * Initial release
data/MANIFEST DELETED
@@ -1,11 +0,0 @@
1
- * CHANGES
2
- * MANIFEST
3
- * README
4
- * Rakefile
5
- * win32-taskscheduler.gemspec
6
- * ext/extconf.rb
7
- * ext/win32/taskscheduler.c
8
- * ext/win32/taskscheduler.h
9
- * doc/taskscheduler.txt
10
- * examples/taskscheduler_test.rb
11
- * test/tc_taskscheduler.rb
data/README DELETED
@@ -1,68 +0,0 @@
1
- = Description
2
- The win32-taskscheduler library is a Ruby interface to the MS Windows Task
3
- Scheduler. It is analogous to the Unix cron daemon.
4
-
5
- = Synopsis
6
- require 'win32/taskscheduler'
7
- include Win32
8
-
9
- ts = TaskScheduler.new
10
-
11
- # Create a trigger that starts on April 25, 2014 at 11:05 pm. The trigger
12
- # will run on the first and last week of the month, on Monday and Friday,
13
- # in the months of April and May.
14
- #
15
- trigger = {
16
- :start_year => 2014,
17
- :start_month => 4,
18
- :start_day => 25,
19
- :start_hour => 23,
20
- :start_minute => 5,
21
- :trigger_type => TaskScheduler::MONTHLYDOW,
22
- :type => {
23
- :weeks => TaskScheduler::FIRST_WEEK | TaskScheduler::LAST_WEEK,
24
- :days_of_week => TaskScheduler::MONDAY | TaskScheduler::FRIDAY,
25
- :months => TaskScheduler::APRIL | TaskScheduler::MAY
26
- }
27
- }
28
-
29
- ts.new_work_item('foo', trigger)
30
- ts.application_name = 'notepad.exe'
31
- ts.save
32
-
33
- = Prerequisites
34
- Ruby 1.8.2 or later.
35
- Building from source requires VC++ 6.0 or later.
36
- Windows XP or earlier. Vista and later not currently supported.
37
-
38
- = Installation
39
- rake install (non-gem) OR rake install_gem (gem)
40
-
41
- For most of you 'gem install win32-taskscheduler' will work.
42
-
43
- = Documentation
44
- If you installed this library as a gem then the documentation was built for
45
- you and can be viewed if your gem server is running.
46
-
47
- Otherwise, you can look at the doc/taskscheduler.txt file which should have
48
- everything you need.
49
-
50
- = Acknowledgements
51
- This library was modeled to some degree on the Win32::TaskScheduler Perl
52
- module by Umberto Nicoletti. However, there are some differences. Please see
53
- the documentation for details.
54
-
55
- = On using OLE + WMI + Win32_ScheduledJob
56
- I will probably include a pure Ruby version of this library at some point,
57
- and you can find what I have so far in CVS under lib/win32. Note, however,
58
- that there are some significant differences in behavior between the C
59
- library and WMI, along with limitations regarding modification to existing
60
- tasks.
61
-
62
- You can find a list of differences here: http://tinyurl.com/2l3yau
63
-
64
- = Developer's Notes
65
- The CoInitialize() function is used internally instead of CoInitializeEx()
66
- function intentionally. The CoInitialize() function merely calls the
67
- CoInitializeEx() function with NULL and COINIT_APARTMENTTHREADED arguments,
68
- which is what we would do in any case.