Class: Houston::Adapters::TicketTracker::UnfuddleAdapter::Connection
- Inherits:
-
Object
- Object
- Houston::Adapters::TicketTracker::UnfuddleAdapter::Connection
- Includes:
- Unfuddle::NeqHelper
- Defined in:
- app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb
Instance Attribute Summary collapse
-
#config ⇒ Object
readonly
Idiomatic API.
-
#project_id ⇒ Object
readonly
Idiomatic API.
Instance Method Summary collapse
- #all_milestones ⇒ Object
- #all_tickets ⇒ Object
- #as_user(user, &block) ⇒ Object
-
#build_milestone(attributes) ⇒ Object
Optional API.
- #build_ticket(attributes) ⇒ Object
- #close_milestone!(houston_milestone) ⇒ Object
- #construct_ticket_query(*args) ⇒ Object
- #create_milestone!(houston_milestone) ⇒ Object
- #create_ticket!(houston_ticket) ⇒ Object
-
#features ⇒ Object
Required API.
- #find_in_cache_or_execute(key, &block) ⇒ Object
- #find_milestone(id) ⇒ Object
- #find_ticket_by_number(number) ⇒ Object
- #find_tickets!(*args) ⇒ Object
- #find_tickets_numbered(*numbers) ⇒ Object
-
#initialize(unfuddle) ⇒ Connection
constructor
A new instance of Connection.
- #invalidate_cache!(*keys) ⇒ Object
- #open_milestones ⇒ Object
- #open_tickets ⇒ Object
- #project_url ⇒ Object
- #query_key(query) ⇒ Object
- #reporter_key(reporter_id) ⇒ Object
- #ticket_url(ticket_number) ⇒ Object
Constructor Details
#initialize(unfuddle) ⇒ Connection
Returns a new instance of Connection.
12 13 14 15 16 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 12 def initialize(unfuddle) @unfuddle = unfuddle @project_id = unfuddle.id @config = Houston.config.ticket_tracker_configuration(:unfuddle) end |
Instance Attribute Details
#config ⇒ Object (readonly)
Idiomatic API
138 139 140 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 138 def config @config end |
#project_id ⇒ Object (readonly)
Idiomatic API
138 139 140 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 138 def project_id @project_id end |
Instance Method Details
#all_milestones ⇒ Object
84 85 86 87 88 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 84 def all_milestones unfuddle.milestones .reject { |m| m.archived } .map { |attributes | build_milestone(attributes) } end |
#all_tickets ⇒ Object
62 63 64 65 66 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 62 def all_tickets Unfuddle.with_config(timeout: 300) do find_tickets! end end |
#as_user(user, &block) ⇒ Object
179 180 181 182 183 184 185 186 187 188 189 190 191 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 179 def as_user(user, &block) login, password = *user.credentials.for("Unfuddle") Unfuddle.with_config(username: login, password: password, &block) rescue Unfuddle::ConfigurationError raise UserCredentials::MissingCredentials rescue Unfuddle::UnauthorizedError begin Unfuddle.with_config(username: login, password: password) { Unfuddle.instance.get("people/current") } rescue Unfuddle::UnauthorizedError raise UserCredentials::InvalidCredentials end raise UserCredentials::InsufficientPermissions, "You do not have permission in Unfuddle to perform this action." end |
#build_milestone(attributes) ⇒ Object
Optional API
105 106 107 108 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 105 def build_milestone(attributes) attributes = attributes.attributes if attributes.is_a?(Unfuddle::Milestone) Houston::Adapters::TicketTracker::UnfuddleAdapter::Milestone.new(self, attributes) end |
#build_ticket(attributes) ⇒ Object
26 27 28 29 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 26 def build_ticket(attributes) attributes["reporter_email"] = find_reporter_email(attributes["reporter_id"]) Houston::Adapters::TicketTracker::UnfuddleAdapter::Ticket.new(self, attributes) end |
#close_milestone!(houston_milestone) ⇒ Object
119 120 121 122 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 119 def close_milestone!(houston_milestone) native_milestone = unfuddle.milestone(houston_milestone.remote_id) native_milestone.update_attribute(:completed, true) end |
#construct_ticket_query(*args) ⇒ Object
151 152 153 154 155 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 151 def construct_ticket_query(*args) unfuddle.construct_ticket_query(*args) rescue Unfuddle::UndefinedCustomField, Unfuddle::UndefinedCustomFieldValue, Unfuddle::UndefinedSeverity raise Houston::Adapters::TicketTracker::InvalidQueryError.new($!) end |
#create_milestone!(houston_milestone) ⇒ Object
110 111 112 113 114 115 116 117 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 110 def create_milestone!(houston_milestone) native_milestone = unfuddle.create_milestone( "project_id" => project_id, # required for fetch! to work below "title" => houston_milestone.name) native_milestone.fetch! # fetch attributes we don't know yet build_milestone(native_milestone) end |
#create_ticket!(houston_ticket) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 31 def create_ticket!(houston_ticket) as_user(houston_ticket.reporter) do attrs = get_attributes_from_type(houston_ticket.type) native_ticket = unfuddle.create_ticket( "project_id" => project_id, # required for fetch! to work below "priority" => "3", # required by Unfuddle "summary" => houston_ticket.summary, "description" => houston_ticket.description, "severity_id" => attrs[:severity] && unfuddle.find_severity_by_name!(attrs[:severity]).id, "milestone_id" => (houston_ticket.milestone && houston_ticket.milestone.remote_id) || 0) native_ticket.fetch! # fetch attributes we don't know yet (like number and created_at) build_ticket(native_ticket.attributes) end rescue Unfuddle::Error raise Houston::Adapters::TicketTracker::Error.new($!) end |
#features ⇒ Object
Required API
22 23 24 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 22 def features [:syncing_tickets, :syncing_milestones] end |
#find_in_cache_or_execute(key, &block) ⇒ Object
167 168 169 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 167 def find_in_cache_or_execute(key, &block) Rails.cache.fetch(key, &block) end |
#find_milestone(id) ⇒ Object
96 97 98 99 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 96 def find_milestone(id) attributes = unfuddle.find_milestone(id) build_milestone(attributes) if attributes end |
#find_ticket_by_number(number) ⇒ Object
51 52 53 54 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 51 def find_ticket_by_number(number) attributes = unfuddle.find_ticket_by_number(number) unless number.blank? build_ticket(attributes) if attributes end |
#find_tickets!(*args) ⇒ Object
124 125 126 127 128 129 130 131 132 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 124 def find_tickets!(*args) query = find_in_cache_or_execute(query_key(args)) { construct_ticket_query(*args) } remote_tickets = unfuddle.find_tickets!(*query) remote_tickets.map { |attributes | build_ticket(attributes) } rescue Unfuddle::ConnectionError raise Houston::Adapters::TicketTracker::ConnectionError.new($!) rescue Unfuddle::Error raise Houston::Adapters::TicketTracker::Error.new($!) end |
#find_tickets_numbered(*numbers) ⇒ Object
56 57 58 59 60 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 56 def find_tickets_numbered(*numbers) numbers = numbers.flatten return [] if numbers.empty? find_tickets!(number: numbers) end |
#invalidate_cache!(*keys) ⇒ Object
171 172 173 174 175 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 171 def invalidate_cache!(*keys) keys.each do |key| Rails.cache.delete key end end |
#open_milestones ⇒ Object
90 91 92 93 94 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 90 def open_milestones unfuddle.milestones .reject { |m| m.completed || m.archived } .map { |attributes | build_milestone(attributes) } end |
#open_tickets ⇒ Object
68 69 70 71 72 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 68 def open_tickets Unfuddle.with_config(timeout: 300) do find_tickets!(status: neq(:closed), resolution: 0) end end |
#project_url ⇒ Object
74 75 76 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 74 def project_url @project_url ||= "https://#{Unfuddle.instance.subdomain}.unfuddle.com/a#/projects/#{project_id}" end |
#query_key(query) ⇒ Object
159 160 161 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 159 def query_key(query) "unfuddle/projects/#{project_id}/query/#{Digest::MD5::hexdigest(query.inspect)}" end |
#reporter_key(reporter_id) ⇒ Object
163 164 165 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 163 def reporter_key(reporter_id) "unfuddle/reporters/#{reporter_id}" end |
#ticket_url(ticket_number) ⇒ Object
78 79 80 |
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 78 def ticket_url(ticket_number) "#{project_url}/tickets/by_number/#{ticket_number}" end |