wolf_core 1.1.16 → 1.1.18

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f6517e8c433534aeeff5bb76afd2b66ebfae48b55015f8c7e400d52dc6a9350f
4
- data.tar.gz: e4a67c85e97cfd59aacf54dd6245b549c88601a7fa3ce986b13cc7acf859b2b3
3
+ metadata.gz: e7902f57aef2702eebecbaed2c0d1440e5d240794d9aada38418188f901a19e5
4
+ data.tar.gz: 49197fe42dee0f101d30a7cc33fa7410253291deb1a2126533600f49edf08e5c
5
5
  SHA512:
6
- metadata.gz: 4a416bf327987838e7e4f4fa0ac706bf556d4b9c80d7d1126a14b2ab50cfa94e4e050e3f8a542d17407900fcdf55a3bef5f9cd8fe4fb09c0ed4c693abdfe7768
7
- data.tar.gz: eab0636707b283a7a6132b70f1f9a03ff225755da0788cb620beadd20bc3de57878c0823bfd0347a900110d2dfa63226f9a9cb567d179842d50ee05b4c007679
6
+ metadata.gz: 6f928e6b894e78ba52b7eef72bdbbab416884ec4449cfd0dc4bc07c62dbfb4efd7f1540ed91b625f609d9fc5451fc4eba16dec4049c94a3c71faf6495d009d40
7
+ data.tar.gz: aa7daf76e407ff4ed29677fbd7f116bfb4405cefb8b392aef3288ee73a15963c784a5cf42b93222374d245d4ee7d902c887cf4fc0f37db08da823553ec619f9a
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "time"
4
+ require "json"
5
+
6
+ module WolfCore
7
+ class JobSchedulerDataSource
8
+ attr_reader :default_group_name, :default_timezone
9
+
10
+ def initialize(region: "us-east-1", client: nil, default_group_name: "default", default_timezone: "UTC")
11
+ @client = client || Aws::Scheduler::Client.new(region: region)
12
+ @default_group_name = default_group_name
13
+ @default_timezone = default_timezone
14
+ end
15
+
16
+ def schedule_at(job_id:, run_at:, target:, config: {})
17
+ Result.try do
18
+ expr = at_expression(run_at)
19
+ normalized_target = normalize_target(target)
20
+ response = schedule_with_expression(job_id: job_id, expr: expr, target: normalized_target, config: config)
21
+ Result.success(data: { response: response })
22
+ end
23
+ end
24
+
25
+ def schedule_recurring(job_id:, schedule:, target:, config: {})
26
+ Result.try do
27
+ expr = expression_from_schedule!(schedule)
28
+ normalized_target = normalize_target(target)
29
+ response = schedule_with_expression(job_id: job_id, expr: expr, target: normalized_target,
30
+ config: config)
31
+ Result.success(data: { response: response })
32
+ end
33
+ end
34
+
35
+ def cancel_schedule(job_id:, options: {})
36
+ Result.try do
37
+ response = @client.delete_schedule(
38
+ name: job_id,
39
+ group_name: options[:group_name] || default_group_name
40
+ )
41
+ Result.success(data: { response: response })
42
+ end
43
+ end
44
+
45
+ def get_schedule(job_id:, options: {})
46
+ Result.try do
47
+ response = @client.get_schedule(
48
+ name: job_id,
49
+ group_name: options[:group_name] || default_group_name
50
+ )
51
+ Result.success(data: { schedule: response })
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def create_schedule(name:, schedule_expression:, target:, options: {})
58
+ @client.create_schedule(
59
+ name: name,
60
+ group_name: options[:group_name],
61
+ schedule_expression: schedule_expression,
62
+ schedule_expression_timezone: options[:timezone],
63
+ flexible_time_window: { mode: "OFF" },
64
+ target: target,
65
+ description: options[:description],
66
+ state: "ENABLED",
67
+ client_token: options[:client_token]
68
+ )
69
+ end
70
+
71
+ def schedule_with_expression(job_id:, expr:, target:, config: {})
72
+ options = build_options(config)
73
+ create_schedule(name: job_id, schedule_expression: expr, target: target, options: options)
74
+ end
75
+
76
+ def normalize_target(target)
77
+ arn = target[:arn] || target[:target_arn]
78
+ role = target[:role_arn]
79
+ payload = target[:payload]
80
+ raise ArgumentError, "target[:arn] o target[:target_arn] es requerido" unless arn
81
+ raise ArgumentError, "target[:role_arn] es requerido" unless role
82
+
83
+ build_target(target_arn: arn, role_arn: role, payload: payload)
84
+ end
85
+
86
+ def build_options(config)
87
+ {
88
+ description: config[:description],
89
+ group_name: config[:group_name] || default_group_name,
90
+ timezone: config[:timezone] || default_timezone,
91
+ client_token: config[:client_token]
92
+ }
93
+ end
94
+
95
+ def expression_from_schedule!(schedule)
96
+ expr = schedule[:cron_expression] || schedule[:cron] || schedule[:rate_expression] || schedule[:rate]
97
+ raise ArgumentError, "Se requiere schedule[:cron] o schedule[:rate]" unless expr
98
+
99
+ expr
100
+ end
101
+
102
+ def build_target(target_arn:, role_arn:, payload: nil)
103
+ input = case payload
104
+ when nil then nil
105
+ when String then payload
106
+ else
107
+ payload.respond_to?(:to_json) ? payload.to_json : payload.to_s
108
+ end
109
+
110
+ target = { arn: target_arn, role_arn: role_arn }
111
+ target[:input] = input if input
112
+ target
113
+ end
114
+
115
+ def at_expression(run_at)
116
+ time = case run_at
117
+ when Time then run_at.utc
118
+ when DateTime then run_at.to_time.utc
119
+ when String then Time.parse(run_at).utc
120
+ else
121
+ raise ArgumentError, "run_at debe ser Time, DateTime o String ISO8601"
122
+ end
123
+ "at(#{time.iso8601})"
124
+ end
125
+ end
126
+ end
@@ -76,14 +76,16 @@ class Result
76
76
  fold_result
77
77
  end
78
78
 
79
+ def data_or_raise_error
80
+ raise_error.data
81
+ end
82
+
79
83
  def raise_error
80
- if failure?
81
- err_class = error.error_class || StandardError
82
- e = err_class.new(error.message)
83
- if error.backtrace
84
- e.set_backtrace(error.backtrace)
85
- end
86
- raise e
87
- end
84
+ return self if success?
85
+
86
+ err_class = error.error_class || StandardError
87
+ e = err_class.new(error.message)
88
+ e.set_backtrace(error.backtrace) if error.backtrace
89
+ raise e
88
90
  end
89
- end
91
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WolfCore
4
- VERSION = "1.1.16"
4
+ VERSION = "1.1.18"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wolf_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.16
4
+ version: 1.1.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Javier Roncallo
@@ -143,6 +143,7 @@ files:
143
143
  - lib/wolf_core/infrastructure/in_memory_storage_data_source.rb
144
144
  - lib/wolf_core/infrastructure/in_memory_storage_operations.rb
145
145
  - lib/wolf_core/infrastructure/instance_application_serializer.rb
146
+ - lib/wolf_core/infrastructure/job_scheduler_data_source.rb
146
147
  - lib/wolf_core/infrastructure/lambda_function_data_source.rb
147
148
  - lib/wolf_core/infrastructure/lambda_function_operations.rb
148
149
  - lib/wolf_core/infrastructure/no_sql_db_data_source.rb