Class: Checkoff::Projects
- Inherits:
-
Object
- Object
- Checkoff::Projects
- Extended by:
- CacheMethod::ClassMethods
- Includes:
- Logging
- Defined in:
- lib/checkoff/projects.rb
Overview
Work with projects in Asana
Constant Summary collapse
- MINUTE =
60- HOUR =
MINUTE * 60
- DAY =
24 * HOUR
- REALLY_LONG_CACHE_TIME =
MINUTE * 30
- LONG_CACHE_TIME =
MINUTE * 15
- MEDIUM_CACHE_TIME =
MINUTE * 5
- SHORT_CACHE_TIME =
MINUTE
Instance Method Summary collapse
-
#active_tasks(tasks) ⇒ Enumerable<Asana::Resources::Task>
find uncompleted tasks in a list.
- #as_cache_key ⇒ Hash
- #in_period?(project, field_name, period) ⇒ Boolean
-
#initialize(config: Checkoff::Internal::ConfigLoader.load(:asana), client: Checkoff::Clients.new(config: config).client, workspaces: Checkoff::Workspaces.new(config: config, client: client), project_hashes: Checkoff::Internal::ProjectHashes.new, project_timing: Checkoff::Internal::ProjectTiming.new(client: client), timing: Checkoff::Timing.new) ⇒ Projects
constructor
A new instance of Projects.
-
#project(workspace_name, project_name, extra_fields: []) ⇒ Asana::Resources::Project?
pulls an Asana API project class given a name.
- #project_by_gid(gid, extra_fields: []) ⇒ Asana::Resources::Project?
- #project_fields(extra_project_fields: []) ⇒ Array<String>
-
#project_options(extra_project_fields: []) ⇒ Hash<Symbol, Object>
Default options used in Asana API to pull projects.
- #project_or_raise(workspace_name, project_name, extra_fields: []) ⇒ Asana::Resources::Project
-
#project_ready?(project, period: :now_or_before) ⇒ Boolean
Indicates a project is ready for a person to work on it.
- #project_to_h(project_obj, project: :not_specified) ⇒ Hash
- #projects_by_workspace_name(workspace_name, extra_fields: []) ⇒ Enumerable<Asana::Resources::Project>
- #task_fields(extra_fields: []) ⇒ Array<String>
-
#task_options(extra_fields: [], only_uncompleted: false) ⇒ Hash<Symbol, Object>
Default options used in Asana API to pull tasks.
-
#tasks_from_project(project, only_uncompleted: true, extra_fields: []) ⇒ Enumerable<Asana::Resources::Task>
Pull task objects from a named project.
-
#tasks_from_project_gid(project_gid, only_uncompleted: true, extra_fields: []) ⇒ Enumerable<Asana::Resources::Task>
Pull task objects from a project identified by a gid.
Methods included from Logging
#debug, #error, #finer, #info, #logger, #warn
Constructor Details
#initialize(config: Checkoff::Internal::ConfigLoader.load(:asana), client: Checkoff::Clients.new(config: config).client, workspaces: Checkoff::Workspaces.new(config: config, client: client), project_hashes: Checkoff::Internal::ProjectHashes.new, project_timing: Checkoff::Internal::ProjectTiming.new(client: client), timing: Checkoff::Timing.new) ⇒ Projects
Returns a new instance of Projects.
40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/checkoff/projects.rb', line 40 def initialize(config: Checkoff::Internal::ConfigLoader.load(:asana), client: Checkoff::Clients.new(config: config).client, workspaces: Checkoff::Workspaces.new(config: config, client: client), project_hashes: Checkoff::Internal::ProjectHashes.new, project_timing: Checkoff::Internal::ProjectTiming.new(client: client), timing: Checkoff::Timing.new) @config = config @workspaces = workspaces @client = client @project_hashes = project_hashes @project_timing = project_timing @timing = timing end |
Instance Method Details
#active_tasks(tasks) ⇒ Enumerable<Asana::Resources::Task>
find uncompleted tasks in a list
145 146 147 |
# File 'lib/checkoff/projects.rb', line 145 def active_tasks(tasks) tasks.select { |task| task.completed_at.nil? } end |
#as_cache_key ⇒ Hash
229 230 231 |
# File 'lib/checkoff/projects.rb', line 229 def as_cache_key {} end |
#in_period?(project, field_name, period) ⇒ Boolean
221 222 223 224 225 226 |
# File 'lib/checkoff/projects.rb', line 221 def in_period?(project, field_name, period) # @type [Date,Time,nil] project_date = project_timing.date_or_time_field_by_name(project, field_name) timing.in_period?(project_date, period) end |
#project(workspace_name, project_name, extra_fields: []) ⇒ Asana::Resources::Project?
pulls an Asana API project class given a name
103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/checkoff/projects.rb', line 103 def project(workspace_name, project_name, extra_fields: []) if project_name.is_a?(Symbol) && project_name.to_s.start_with?('my_tasks') my_tasks(workspace_name) else # @type [Enumerable<Asana::Resources::Project>] ps = projects_by_workspace_name(workspace_name, extra_fields: extra_fields) # @type <Asana::Resources::Project,nil> # @sg-ignore project = ps.find { _1.name == project_name } project_by_gid(project.gid, extra_fields: extra_fields) unless project.nil? end end |
#project_by_gid(gid, extra_fields: []) ⇒ Asana::Resources::Project?
134 135 136 137 138 139 |
# File 'lib/checkoff/projects.rb', line 134 def project_by_gid(gid, extra_fields: []) projects.find_by_id(gid, options: (extra_project_fields: extra_fields)) rescue Asana::Errors::NotFound => e debug e nil end |
#project_fields(extra_project_fields: []) ⇒ Array<String>
84 85 86 |
# File 'lib/checkoff/projects.rb', line 84 def project_fields(extra_project_fields: []) (%w[name custom_fields] + extra_project_fields).sort.uniq end |
#project_options(extra_project_fields: []) ⇒ Hash<Symbol, Object>
Default options used in Asana API to pull projects
93 94 95 |
# File 'lib/checkoff/projects.rb', line 93 def (extra_project_fields: []) { fields: project_fields(extra_project_fields: extra_project_fields) } end |
#project_or_raise(workspace_name, project_name, extra_fields: []) ⇒ Asana::Resources::Project
122 123 124 125 126 127 |
# File 'lib/checkoff/projects.rb', line 122 def project_or_raise(workspace_name, project_name, extra_fields: []) p = project(workspace_name, project_name, extra_fields: extra_fields) raise "Could not find project #{project_name.inspect} under workspace #{workspace_name}." if p.nil? p end |
#project_ready?(project, period: :now_or_before) ⇒ Boolean
Indicates a project is ready for a person to work on it. This is subtly different than what is used by Asana to mark a date as red/green!
A project is ready if there is no start date, or if the start date is today or in the past.
214 215 216 |
# File 'lib/checkoff/projects.rb', line 214 def project_ready?(project, period: :now_or_before) in_period?(project, :ready, period) end |
#project_to_h(project_obj, project: :not_specified) ⇒ Hash
201 202 203 |
# File 'lib/checkoff/projects.rb', line 201 def project_to_h(project_obj, project: :not_specified) project_hashes.project_to_h(project_obj, project: project) end |
#projects_by_workspace_name(workspace_name, extra_fields: []) ⇒ Enumerable<Asana::Resources::Project>
186 187 188 189 190 191 192 193 194 |
# File 'lib/checkoff/projects.rb', line 186 def projects_by_workspace_name(workspace_name, extra_fields: []) workspace = @workspaces.workspace_or_raise(workspace_name) # 15 minute cache resulted in 'Your pagination token has # expired', so let's cache this a super long time and force # evaluation projects.find_by_workspace(workspace: workspace.gid, per_page: 100, options: (extra_project_fields: extra_fields)).to_a end |
#task_fields(extra_fields: []) ⇒ Array<String>
58 59 60 61 62 |
# File 'lib/checkoff/projects.rb', line 58 def task_fields(extra_fields: []) (%w[name completed_at start_at start_on due_at due_on tags memberships.project.gid memberships.project.name memberships.section.name dependencies] + extra_fields).sort.uniq end |
#task_options(extra_fields: [], only_uncompleted: false) ⇒ Hash<Symbol, Object>
Default options used in Asana API to pull tasks
70 71 72 73 74 75 76 77 78 79 |
# File 'lib/checkoff/projects.rb', line 70 def (extra_fields: [], only_uncompleted: false) = { per_page: 100, options: { fields: task_fields(extra_fields: extra_fields), }, } [:completed_since] = '9999-12-01' if only_uncompleted end |
#tasks_from_project(project, only_uncompleted: true, extra_fields: []) ⇒ Enumerable<Asana::Resources::Task>
Pull task objects from a named project
156 157 158 159 160 161 162 |
# File 'lib/checkoff/projects.rb', line 156 def tasks_from_project(project, only_uncompleted: true, extra_fields: []) tasks_from_project_gid(project.gid, only_uncompleted: only_uncompleted, extra_fields: extra_fields) end |
#tasks_from_project_gid(project_gid, only_uncompleted: true, extra_fields: []) ⇒ Enumerable<Asana::Resources::Task>
Pull task objects from a project identified by a gid
171 172 173 174 175 176 177 178 179 180 |
# File 'lib/checkoff/projects.rb', line 171 def tasks_from_project_gid(project_gid, only_uncompleted: true, extra_fields: []) = (extra_fields: extra_fields, only_uncompleted: only_uncompleted) [:project] = project_gid # Note: 30 minute cache time on a raw Enumerable from SDK gives # 'Your pagination token has expired' errors. So we go ahead # and eagerly evaluate here so we can enjoy the cache. client.tasks.find_all(**).to_a end |