checkoff 0.133.0 → 0.134.0
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 +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +6 -5
- data/lib/checkoff/events.rb +88 -0
- data/lib/checkoff/internal/asana_event_filter.rb +75 -0
- data/lib/checkoff/internal/logging.rb +63 -0
- data/lib/checkoff/version.rb +1 -1
- data/lib/checkoff.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 774ff63fdebd9187b4aedf1cad2ee5ba52c4d7f5d582747b0414e698c6c31d9d
|
4
|
+
data.tar.gz: de61ee88dc1e575702bbe15df6fcd0e70738a3b0f5ffb10654633260831c9923
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 767386a4cb59daf9085a545e1e6bb8b76d01ac374785c2c574a285142b0531ebf1c3c7f930b3d104262452bdb1975b8158a2906d157cc88b46bce0852fd357e9
|
7
|
+
data.tar.gz: c3f95457b476ff66133dba010920db1feee0f27f98fa35ed92246b677dde95f17fd8347b91de6aa63f2777c2dcebef061a8d5aefaf85638e4c321009b68185d6
|
data/Gemfile
CHANGED
@@ -11,7 +11,7 @@ gem 'fakeweb'
|
|
11
11
|
gem 'mdl'
|
12
12
|
gem 'minitest-profile'
|
13
13
|
gem 'minitest-reporters'
|
14
|
-
gem 'mocha', ['
|
14
|
+
gem 'mocha', ['>= 2']
|
15
15
|
# 0.58.0 and 0.57.0 don't seem super compatible with signatures, and
|
16
16
|
# magit doesn't seem to want to use the bundled version at the moment,
|
17
17
|
# so let's favor the more recent version...
|
data/Gemfile.lock
CHANGED
@@ -12,7 +12,7 @@ GIT
|
|
12
12
|
PATH
|
13
13
|
remote: .
|
14
14
|
specs:
|
15
|
-
checkoff (0.
|
15
|
+
checkoff (0.134.0)
|
16
16
|
activesupport
|
17
17
|
asana (> 0.10.0)
|
18
18
|
cache_method
|
@@ -22,7 +22,7 @@ PATH
|
|
22
22
|
GEM
|
23
23
|
remote: https://rubygems.org/
|
24
24
|
specs:
|
25
|
-
activesupport (7.1.
|
25
|
+
activesupport (7.1.2)
|
26
26
|
base64
|
27
27
|
bigdecimal
|
28
28
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
@@ -104,7 +104,7 @@ GEM
|
|
104
104
|
mixlib-shellout
|
105
105
|
method_source (1.0.0)
|
106
106
|
mini_portile2 (2.8.2)
|
107
|
-
minitest (5.
|
107
|
+
minitest (5.20.0)
|
108
108
|
minitest-profile (0.0.2)
|
109
109
|
minitest-reporters (1.5.0)
|
110
110
|
ansi
|
@@ -116,7 +116,8 @@ GEM
|
|
116
116
|
tomlrb
|
117
117
|
mixlib-shellout (3.2.7)
|
118
118
|
chef-utils
|
119
|
-
mocha (2.
|
119
|
+
mocha (2.1.0)
|
120
|
+
ruby2_keywords (>= 0.0.5)
|
120
121
|
multi_json (1.15.0)
|
121
122
|
multi_xml (0.6.0)
|
122
123
|
multipart-post (2.1.1)
|
@@ -232,7 +233,7 @@ DEPENDENCIES
|
|
232
233
|
mdl
|
233
234
|
minitest-profile
|
234
235
|
minitest-reporters
|
235
|
-
mocha (
|
236
|
+
mocha (>= 2)
|
236
237
|
overcommit (>= 0.60.0, < 0.61.0)
|
237
238
|
pry
|
238
239
|
punchlist
|
@@ -0,0 +1,88 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require 'forwardable'
|
6
|
+
require 'cache_method'
|
7
|
+
require_relative 'internal/config_loader'
|
8
|
+
require_relative 'internal/asana_event_filter'
|
9
|
+
require_relative 'workspaces'
|
10
|
+
require_relative 'clients'
|
11
|
+
|
12
|
+
# https://developers.asana.com/reference/events
|
13
|
+
|
14
|
+
module Checkoff
|
15
|
+
# Methods related to the Asana events / webhooks APIs
|
16
|
+
class Events
|
17
|
+
# @!parse
|
18
|
+
# extend CacheMethod::ClassMethods
|
19
|
+
|
20
|
+
MINUTE = 60
|
21
|
+
private_constant :MINUTE
|
22
|
+
HOUR = MINUTE * 60
|
23
|
+
private_constant :HOUR
|
24
|
+
DAY = 24 * HOUR
|
25
|
+
private_constant :DAY
|
26
|
+
REALLY_LONG_CACHE_TIME = HOUR * 1
|
27
|
+
private_constant :REALLY_LONG_CACHE_TIME
|
28
|
+
LONG_CACHE_TIME = MINUTE * 15
|
29
|
+
private_constant :LONG_CACHE_TIME
|
30
|
+
SHORT_CACHE_TIME = MINUTE
|
31
|
+
private_constant :SHORT_CACHE_TIME
|
32
|
+
|
33
|
+
# @param config [Hash]
|
34
|
+
# @param workspaces [Checkoff::Workspaces]
|
35
|
+
# @param clients [Checkoff::Clients]
|
36
|
+
# @param client [Asana::Client]
|
37
|
+
# @param asana_event_filter_class [Class<Checkoff::Internal::AsanaEventFilter>]
|
38
|
+
def initialize(config: Checkoff::Internal::ConfigLoader.load(:asana),
|
39
|
+
workspaces: Checkoff::Workspaces.new(config: config),
|
40
|
+
clients: Checkoff::Clients.new(config: config),
|
41
|
+
client: clients.client,
|
42
|
+
asana_event_filter_class: Checkoff::Internal::AsanaEventFilter)
|
43
|
+
@workspaces = workspaces
|
44
|
+
@client = client
|
45
|
+
@asana_event_filter_class = asana_event_filter_class
|
46
|
+
end
|
47
|
+
|
48
|
+
# @param filters [Array<Hash>, nil] The filters to match against
|
49
|
+
# @param asana_events [Array<Hash>] The events that Asana sent
|
50
|
+
#
|
51
|
+
# @return [Array<Hash>] The events that should be acted on
|
52
|
+
def filter_asana_events(filters, asana_events)
|
53
|
+
asana_event_filter = @asana_event_filter_class.new(filters: filters)
|
54
|
+
asana_events.select { |event| asana_event_filter.matches?(event) }
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
# @return [Checkoff::Workspaces]
|
60
|
+
attr_reader :workspaces
|
61
|
+
|
62
|
+
# @return [Asana::Client]
|
63
|
+
attr_reader :client
|
64
|
+
|
65
|
+
# bundle exec ./events.rb
|
66
|
+
# :nocov:
|
67
|
+
class << self
|
68
|
+
# @return [void]
|
69
|
+
def run
|
70
|
+
# @sg-ignore
|
71
|
+
# @type [String]
|
72
|
+
# workspace_name = ARGV[0] || raise('Please pass workspace name as first argument')
|
73
|
+
# @sg-ignore
|
74
|
+
# @type [String]
|
75
|
+
# event_name = ARGV[1] || raise('Please pass event name as second argument')
|
76
|
+
# events = Checkoff::Events.new
|
77
|
+
# event = events.event_or_raise(workspace_name, event_name)
|
78
|
+
# puts "Results: #{event}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
# :nocov:
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# :nocov:
|
86
|
+
abs_program_name = File.expand_path($PROGRAM_NAME)
|
87
|
+
Checkoff::Events.run if abs_program_name == File.expand_path(__FILE__)
|
88
|
+
# :nocov:
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'logging'
|
4
|
+
|
5
|
+
module Checkoff
|
6
|
+
module Internal
|
7
|
+
# Uses an enhanced version of Asana event filter configuration
|
8
|
+
#
|
9
|
+
# See https://developers.asana.com/reference/createwebhook | body
|
10
|
+
# params | data | filters for a general description of the scheme.
|
11
|
+
#
|
12
|
+
# Additional supported filter keys:
|
13
|
+
#
|
14
|
+
# * 'checkoff:parent.gid' - requires that the 'gid' key in the 'parent' object
|
15
|
+
# match the given value
|
16
|
+
class AsanaEventFilter
|
17
|
+
include Logging
|
18
|
+
|
19
|
+
# @param filters [Array<Hash>, nil] The filters to match against
|
20
|
+
def initialize(filters:)
|
21
|
+
@filters = filters
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param asana_event [Hash] The event that Asana sent
|
25
|
+
def matches?(asana_event)
|
26
|
+
logger.debug { "Filtering using #{@filters.inspect}" }
|
27
|
+
return true if @filters.nil?
|
28
|
+
|
29
|
+
@filters.any? do |filter|
|
30
|
+
out = filter_matches_asana_event?(filter, asana_event)
|
31
|
+
logger.debug { "Filter #{filter.inspect} matched? #{out} against event #{asana_event.inspect}" }
|
32
|
+
out
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# @param filter [Hash]
|
39
|
+
# @param asana_event [Hash]
|
40
|
+
#
|
41
|
+
# @sg-ignore
|
42
|
+
# @return [Boolean]
|
43
|
+
def filter_matches_asana_event?(filter, asana_event)
|
44
|
+
# @param key [String]
|
45
|
+
# @param value [String, Array<String>]
|
46
|
+
filter.all? do |key, value|
|
47
|
+
asana_event_matches_filter_item?(key, value, asana_event)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# @param key [String]
|
52
|
+
# @param value [String, Array<String>]
|
53
|
+
# @param asana_event [Hash]
|
54
|
+
#
|
55
|
+
# @sg-ignore
|
56
|
+
# @return [Boolean]
|
57
|
+
def asana_event_matches_filter_item?(key, value, asana_event)
|
58
|
+
case key
|
59
|
+
when 'resource_type'
|
60
|
+
asana_event.fetch('resource', {})['resource_type'] == value
|
61
|
+
when 'resource_subtype'
|
62
|
+
asana_event.fetch('resource', {})['resource_subtype'] == value
|
63
|
+
when 'action'
|
64
|
+
asana_event['action'] == value
|
65
|
+
when 'fields'
|
66
|
+
value.include? asana_event.fetch('change', {})['field']
|
67
|
+
when 'checkoff:parent.gid'
|
68
|
+
asana_event.fetch('parent', {})['gid'] == value
|
69
|
+
else
|
70
|
+
raise "Unknown filter key #{key}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
# include this to add ability to log at different levels
|
6
|
+
module Logging
|
7
|
+
# @return [::Logger]
|
8
|
+
def logger
|
9
|
+
# @sg-ignore
|
10
|
+
@logger ||= if defined?(Rails) && Rails.respond_to?(:logger) && Rails.logger
|
11
|
+
# @sg-ignore
|
12
|
+
Rails.logger
|
13
|
+
else
|
14
|
+
::Logger.new($stdout, level: log_level)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# @param message [String,nil]
|
19
|
+
#
|
20
|
+
# @return [void]
|
21
|
+
def error(message = nil, &block)
|
22
|
+
logger.error(message, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
# @param message [String,nil]
|
26
|
+
#
|
27
|
+
# @return [void]
|
28
|
+
def warn(message = nil, &block)
|
29
|
+
logger.warn(message, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
# @param message [String,nil]
|
33
|
+
#
|
34
|
+
# @return [void]
|
35
|
+
def info(message = nil, &block)
|
36
|
+
logger.info(message, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
# @param message [String,nil]
|
40
|
+
#
|
41
|
+
# @return [void]
|
42
|
+
def debug(message = nil, &block)
|
43
|
+
logger.debug(message, &block)
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param message [String,nil]
|
47
|
+
#
|
48
|
+
# @return [void]
|
49
|
+
def finer(message = nil, &block)
|
50
|
+
# No such level by default
|
51
|
+
#
|
52
|
+
# logger.finer(message, &block)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
# @sg-ignore
|
58
|
+
# @return [Symbol]
|
59
|
+
def log_level
|
60
|
+
# @sg-ignore
|
61
|
+
ENV.fetch('LOG_LEVEL', 'INFO').downcase.to_sym
|
62
|
+
end
|
63
|
+
end
|
data/lib/checkoff/version.rb
CHANGED
data/lib/checkoff.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: checkoff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.134.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vince Broz
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -131,8 +131,11 @@ files:
|
|
131
131
|
- lib/checkoff/clients.rb
|
132
132
|
- lib/checkoff/create-entity.sh
|
133
133
|
- lib/checkoff/custom_fields.rb
|
134
|
+
- lib/checkoff/events.rb
|
135
|
+
- lib/checkoff/internal/asana_event_filter.rb
|
134
136
|
- lib/checkoff/internal/config_loader.rb
|
135
137
|
- lib/checkoff/internal/create-class.sh
|
138
|
+
- lib/checkoff/internal/logging.rb
|
136
139
|
- lib/checkoff/internal/project_hashes.rb
|
137
140
|
- lib/checkoff/internal/project_selector_evaluator.rb
|
138
141
|
- lib/checkoff/internal/project_timing.rb
|