Class: Project

Inherits:
ActiveRecord::Base
  • Object
show all
Extended by:
ProjectAdapter
Includes:
FeatureState, Retirement
Defined in:
app/models/project.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ProjectAdapter

adapters, has_adapter

Methods included from FeatureState

#broken_features, #feature_broken!, #feature_state, #feature_states, #feature_working!, #set_feature_state!

Methods included from Retirement

#retire!, #retired?, #unretire!

Class Method Details

.[](slug) ⇒ Object



81
82
83
# File 'app/models/project.rb', line 81

def self.[](slug)
  find_by_slug(slug)
end

.with_feature(feature) ⇒ Object



85
86
87
# File 'app/models/project.rb', line 85

def self.with_feature(feature)
  where ["? = ANY(projects.selected_features)", feature]
end

Instance Method Details

#add_teammate(user_or_id, role = "Follower") ⇒ Object



116
117
118
119
120
# File 'app/models/project.rb', line 116

def add_teammate(user_or_id, role="Follower")
  attributes = {project: self, name: role}
  attributes[user_or_id.is_a?(User) ? :user : :user_id] = user_or_id
  roles.create!(attributes)
end

#all_milestonesObject



172
173
174
# File 'app/models/project.rb', line 172

def all_milestones
  milestones.fetch_all
end

#all_ticketsObject



158
159
160
# File 'app/models/project.rb', line 158

def all_tickets
  tickets.fetch_all
end

#ci_server_job_urlObject

Continuous Integration ————————————————————————- #



253
254
255
# File 'app/models/project.rb', line 253

def ci_server_job_url
  ci_server.job_url
end

#color_valueObject



49
50
51
# File 'app/models/project.rb', line 49

def color_value
  Houston.config.project_colors[color]
end

#create_milestone!(attributes) ⇒ Object



180
181
182
183
184
185
186
187
188
189
190
191
192
# File 'app/models/project.rb', line 180

def create_milestone!(attributes)
  milestone = milestones.build attributes
  if milestone.valid?
    if ticket_tracker.respond_to?(:create_milestone!)
      milestone = milestones.create(
        attributes.merge(
          ticket_tracker.create_milestone!(milestone).attributes))
    else
      milestone.save
    end
  end
  milestone
end

#create_ticket!(attributes) ⇒ Object



146
147
148
149
150
# File 'app/models/project.rb', line 146

def create_ticket!(attributes)
  ticket = tickets.build attributes.merge(number: 0)
  ticket = tickets.create_from_remote ticket_tracker.create_ticket!(ticket) if ticket.valid?
  ticket
end

#environment(environment_name) ⇒ Object



65
66
67
# File 'app/models/project.rb', line 65

def environment(environment_name)
  Environment.new(self, environment_name)
end

#environmentsObject



53
54
55
# File 'app/models/project.rb', line 53

def environments
  @environments ||= deploys.environments.map(&:downcase).uniq
end

#environments_with_release_notesObject



57
58
59
# File 'app/models/project.rb', line 57

def environments_with_release_notes
  environments.select(&method(:show_release_notes_for?))
end

#error_tracker_error_url(error_id) ⇒ Object



240
241
242
# File 'app/models/project.rb', line 240

def error_tracker_error_url(error_id)
  error_tracker.error_url(error_id)
end

#error_tracker_project_urlObject

Error Tracker ————————————————————————- #



236
237
238
# File 'app/models/project.rb', line 236

def error_tracker_project_url
  error_tracker.project_url
end

#extended_attributesObject



69
70
71
# File 'app/models/project.rb', line 69

def extended_attributes
  super || (self.extended_attributes = {})
end

#feature?(feature_slug) ⇒ Boolean

Returns:

  • (Boolean)


97
98
99
# File 'app/models/project.rb', line 97

def feature?(feature_slug)
  selected_features.member? feature_slug.to_sym
end

#featuresObject



89
90
91
# File 'app/models/project.rb', line 89

def features
  (Houston.config.project_features & selected_features) + [:settings]
end

#find_commit_by_sha(sha) ⇒ Object



215
216
217
# File 'app/models/project.rb', line 215

def find_commit_by_sha(sha)
  commits.find_or_create_by_sha(sha)
end

#find_or_create_tickets_by_number(*numbers) ⇒ Object



154
155
156
# File 'app/models/project.rb', line 154

def find_or_create_tickets_by_number(*numbers)
  tickets.numbered(*numbers, sync: true)
end

#find_tickets(*query) ⇒ Object



166
167
168
# File 'app/models/project.rb', line 166

def find_tickets(*query)
  tickets.fetch_with_query(*query)
end

#followersObject

<– redefine followers to be everyone who participates in or follows the project



112
113
114
# File 'app/models/project.rb', line 112

def followers # <-- redefine followers to be everyone who participates in or follows the project
  roles.to_users
end

#is_teammate?(user_or_id) ⇒ Boolean Also known as: teammate?

Returns:

  • (Boolean)


122
123
124
# File 'app/models/project.rb', line 122

def is_teammate?(user_or_id)
  roles.for_user(user_or_id).any?
end

#on_github?Boolean

Returns:

  • (Boolean)


223
224
225
# File 'app/models/project.rb', line 223

def on_github?
  repo.is_a? Houston::Adapters::VersionControl::GitAdapter::GithubRepo
end

#open_milestonesObject



176
177
178
# File 'app/models/project.rb', line 176

def open_milestones
  milestones.fetch_open
end

#open_ticketsObject



162
163
164
# File 'app/models/project.rb', line 162

def open_tickets
  tickets.fetch_open
end

#read_file(path, options = {}) ⇒ Object



219
220
221
# File 'app/models/project.rb', line 219

def read_file(path, options={})
  repo.read_file(path, options)
end

#selected_featuresObject



93
94
95
# File 'app/models/project.rb', line 93

def selected_features
  Array(super).map(&:to_sym)
end

#show_release_notes_for?(environment_name) ⇒ Boolean

Returns:

  • (Boolean)


61
62
63
# File 'app/models/project.rb', line 61

def show_release_notes_for?(environment_name)
  extended_attributes["releases.ignore.#{environment_name.downcase}"] != "1"
end

#teammatesObject

Teammates ————————————————————————- #



108
109
110
# File 'app/models/project.rb', line 108

def teammates
  roles.participants.to_users
end

#testersObject



77
78
79
# File 'app/models/project.rb', line 77

def testers
  @testers ||= User.testers
end

#ticket_tracker_project_urlObject

Ticket Tracking ————————————————————————- #



136
137
138
# File 'app/models/project.rb', line 136

def ticket_tracker_project_url
  ticket_tracker.project_url
end

#ticket_tracker_sync_in_progress?Boolean

Returns:

  • (Boolean)


196
197
198
# File 'app/models/project.rb', line 196

def ticket_tracker_sync_in_progress?
  ticket_tracker_sync_started_at.present? and ticket_tracker_sync_started_at > 5.minutes.ago
end

#ticket_tracker_ticket_url(ticket_number) ⇒ Object



140
141
142
# File 'app/models/project.rb', line 140

def ticket_tracker_ticket_url(ticket_number)
  ticket_tracker.ticket_url(ticket_number)
end

#to_paramObject



45
46
47
# File 'app/models/project.rb', line 45

def to_param
  slug
end

#version_control_temp_pathObject



211
212
213
# File 'app/models/project.rb', line 211

def version_control_temp_path
  Houston.root.join("tmp", "#{slug}.git").to_s # <-- the .git here is misleading; could be any kind of VCS
end

#view_optionsObject



73
74
75
# File 'app/models/project.rb', line 73

def view_options
  super || {}
end