checkoff 0.26.0 → 0.27.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1adcf7ca7bea1514f07f234a4952e550afeb47be68882a631d26b88231839ec4
4
- data.tar.gz: e2d86531a6e256cbfb9315199b529d6e587263dc6a750c6ab3a28faa8e1f0b12
3
+ metadata.gz: bac942429684609678acb06e7426577be0bfd0239b9bf7ca4123e71484125746
4
+ data.tar.gz: 5cad1409ce70028e43f52789878b3d2cbcfaceb3bfcd26b230890a27d9d87fbf
5
5
  SHA512:
6
- metadata.gz: 636615e7e3b49a763e71c867718b6441bde385eb30533263c67030cb9b6febd7a3c233087daec5c30e2ec1e2bf24d0fe97c7480faf6feb18baf121c140e14642
7
- data.tar.gz: ab00d105d5f79e402c2030a4a982fe3b863270c9477ffa4c4fccf686d79a1280ab3a20561be72311711ee481544a206f2af9785eaaab5db3d3646a466f6f888d
6
+ metadata.gz: b68f2aa40aef9ecfe7fb4fbbe1bfac3b48f99c7cdf4ed1ed6308f93e3f4ac9f0d8b289bd5e82a7e1e05ee189b9fc62ca7cf6e07a237cb5d626318509ec24f5b8
7
+ data.tar.gz: 493cc1f59007c7fce4146e3bebae38a9447fa57cf418079afd835783529f8952c981e4bf86819fc8ec66f40f2c32a251da43fccafaf064316bee90f8bdbf781a
data/Gemfile.lock CHANGED
@@ -12,7 +12,7 @@ GIT
12
12
  PATH
13
13
  remote: .
14
14
  specs:
15
- checkoff (0.26.0)
15
+ checkoff (0.27.0)
16
16
  activesupport
17
17
  asana (> 0.10.0)
18
18
  cache_method
@@ -49,6 +49,7 @@ module Checkoff
49
49
  VARIANTS = {
50
50
  'is' => CustomFieldVariant::Is,
51
51
  'no_value' => CustomFieldVariant::NoValue,
52
+ 'any_value' => CustomFieldVariant::AnyValue,
52
53
  'is_not' => CustomFieldVariant::IsNot,
53
54
  'less_than' => CustomFieldVariant::LessThan,
54
55
  'greater_than' => CustomFieldVariant::GreaterThan,
@@ -16,6 +16,12 @@ module Checkoff
16
16
 
17
17
  attr_reader :gid, :remaining_params
18
18
 
19
+ def ensure_no_remaining_params!
20
+ return if remaining_params.length.zero?
21
+
22
+ raise "Teach me how to handle these remaining keys: #{remaining_params}"
23
+ end
24
+
19
25
  def fetch_solo_param(param_name)
20
26
  case remaining_params.keys
21
27
  when [param_name]
@@ -96,39 +102,52 @@ module Checkoff
96
102
  # custom_field_#{gid}.variant = 'no_value'
97
103
  class NoValue < CustomFieldVariant
98
104
  def convert
99
- unless remaining_params.length.zero?
100
- raise "Teach me how to handle these remaining keys for #{variant_key}: #{remaining_params}"
101
- end
102
-
103
- empty_task_selector = []
104
- [{ "custom_fields.#{gid}.is_set" => 'false' }, empty_task_selector]
105
+ ensure_no_remaining_params!
106
+
107
+ api_params = { "custom_fields.#{gid}.is_set" => 'false' }
108
+ # As of 2023-02, the 'is_set' => 'false' seems to not do
109
+ # the intuitive thing on multi-select fields; it either
110
+ # operates as a no-op or operates the same as 'true'; not
111
+ # sure.
112
+ #
113
+ # Let's handle those with a filter afterwards.
114
+ task_selector = [:nil?, [:custom_field_gid_value, gid]]
115
+ [api_params, task_selector]
105
116
  end
106
117
  end
107
118
 
108
- # custom_field_#{gid}.variant = 'is'
109
- class Is < CustomFieldVariant
119
+ # custom_field_#{gid}.variant = 'any_value'
120
+ #
121
+ # Not used for multi-select fields
122
+ class AnyValue < CustomFieldVariant
110
123
  def convert
111
- unless remaining_params.length == 1
112
- raise "Teach me how to handle these remaining keys for #{variant_key}: #{remaining_params}"
113
- end
124
+ ensure_no_remaining_params!
114
125
 
115
- key, values = remaining_params.to_a[0]
116
- convert_custom_field_is_arg(key, values)
126
+ api_params = { "custom_fields.#{gid}.is_set" => 'true' }
127
+ task_selector = []
128
+ [api_params, task_selector]
117
129
  end
130
+ end
118
131
 
119
- private
132
+ # custom_field_#{gid}.variant = 'is'
133
+ class Is < CustomFieldVariant
134
+ def convert
135
+ selected_options = fetch_solo_param("custom_field_#{gid}.selected_options").split('~')
120
136
 
121
- def convert_custom_field_is_arg(key, values)
122
137
  empty_task_selector = []
123
-
124
- if key.end_with? '.selected_options'
125
- raise "Too many values found for #{key}: #{values}" if values.length != 1
126
-
127
- return [{ "custom_fields.#{gid}.value" => values[0] },
128
- empty_task_selector]
138
+ if selected_options.length == 1
139
+ [{ "custom_fields.#{gid}.value" => selected_options[0] },
140
+ empty_task_selector]
141
+ else
142
+ # As of 2023-01,
143
+ # https://developers.asana.com/reference/searchtasksforworkspace
144
+ # says "Not Supported: searching for multiple exact
145
+ # matches of a custom field". So I guess we have to
146
+ # search this manually.
147
+ api_params = { "custom_fields.#{gid}.is_set" => 'true' }
148
+ task_selector = [:custom_field_gid_value_contains_any_gid, gid, selected_options]
149
+ [api_params, task_selector]
129
150
  end
130
-
131
- raise "Teach me how to handle #{key} = #{values}"
132
151
  end
133
152
  end
134
153
  end
@@ -17,6 +17,21 @@ module Checkoff
17
17
  object.is_a?(Array) && !object.empty? && [fn_name, fn_name.to_s].include?(object[0])
18
18
  end
19
19
 
20
+ def pull_custom_field_or_raise(task, custom_field_gid)
21
+ custom_fields = task.custom_fields
22
+ if custom_fields.nil?
23
+ raise "Could not find custom_fields under task (was 'custom_fields' included in 'extra_fields'?)"
24
+ end
25
+
26
+ matched_custom_field = custom_fields.find { |data| data.fetch('gid') == custom_field_gid }
27
+ if matched_custom_field.nil?
28
+ raise "Could not find custom field with gid #{custom_field_gid} " \
29
+ "in task #{task.gid} with custom fields #{custom_fields}"
30
+ end
31
+
32
+ matched_custom_field
33
+ end
34
+
20
35
  attr_reader :task_selector
21
36
  end
22
37
 
@@ -91,6 +106,22 @@ module Checkoff
91
106
  end
92
107
  end
93
108
 
109
+ # :custom_field_gid_value function
110
+ class CustomFieldGidValueFunctionEvaluator < FunctionEvaluator
111
+ def matches?
112
+ fn?(task_selector, :custom_field_gid_value)
113
+ end
114
+
115
+ def evaluate_arg?(_index)
116
+ false
117
+ end
118
+
119
+ def evaluate(task, custom_field_gid)
120
+ custom_field = pull_custom_field_or_raise(task, custom_field_gid)
121
+ custom_field['display_value']
122
+ end
123
+ end
124
+
94
125
  # :custom_field_gid_value_contains_any_gid function
95
126
  class CustomFieldGidValueContainsAnyGidFunctionEvaluator < FunctionEvaluator
96
127
  def matches?
@@ -104,25 +135,13 @@ module Checkoff
104
135
  def evaluate(task, custom_field_gid, custom_field_values_gids)
105
136
  actual_custom_field_values_gids = pull_custom_field_values_gids(task, custom_field_gid)
106
137
 
107
- (custom_field_values_gids - actual_custom_field_values_gids).empty?
138
+ actual_custom_field_values_gids.any? do |custom_field_value|
139
+ custom_field_values_gids.include?(custom_field_value)
140
+ end
108
141
  end
109
142
 
110
143
  private
111
144
 
112
- def pull_custom_field_or_raise(task, custom_field_gid)
113
- custom_fields = task.custom_fields
114
- if custom_fields.nil?
115
- raise "Could not find custom_fields under task (was 'custom_fields' included in 'extra_fields'?)"
116
- end
117
-
118
- matched_custom_field = custom_fields.find { |data| data.fetch('gid') == custom_field_gid }
119
- if matched_custom_field.nil?
120
- raise "Could not find custom field with gid #{custom_field_gid} in #{task.gid} with #{custom_fields}"
121
- end
122
-
123
- matched_custom_field
124
- end
125
-
126
145
  def pull_enum_values(custom_field)
127
146
  resource_subtype = custom_field.fetch('resource_subtype')
128
147
  case resource_subtype
@@ -164,6 +183,7 @@ module Checkoff
164
183
  NilPFunctionEvaluator,
165
184
  TagPFunctionEvaluator,
166
185
  CustomFieldValueFunctionEvaluator,
186
+ CustomFieldGidValueFunctionEvaluator,
167
187
  CustomFieldGidValueContainsAnyGidFunctionEvaluator,
168
188
  AndFunctionEvaluator,
169
189
  ].freeze
@@ -3,5 +3,5 @@
3
3
  # Command-line and gem client for Asana (unofficial)
4
4
  module Checkoff
5
5
  # Version of library
6
- VERSION = '0.26.0'
6
+ VERSION = '0.27.0'
7
7
  end
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.26.0
4
+ version: 0.27.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-01-29 00:00:00.000000000 Z
11
+ date: 2023-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport