Page MenuHomeDevCentral

D274.diff
No OneTemporary

D274.diff

diff --git a/app/Analyzers/GitHub/Events/CommitCommentEvent.php b/app/Analyzers/GitHub/Events/CommitCommentEvent.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/CommitCommentEvent.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * CommitCommentEvent payload analyzer
+ *
+ * @link https://developer.github.com/v3/activity/events/types/#commitcommentevent
+ */
+class CommitCommentEvent extends Event {
+
+ /**
+ * Gets description for the payload
+ *
+ * @return string
+ */
+ public function getDescription () {
+ $comment = $this->payload->comment;
+
+ return trans(
+ 'GitHub.EventsDescriptions.CommitCommentEvent',
+ [
+ 'author' => $comment->user->login,
+ 'commit' => substr($comment->commit_id, 0, 8),
+ 'excerpt' => self::cut($comment->body),
+ ]
+ );
+ }
+
+ /**
+ * Gets link for the payload
+ *
+ * @return string
+ */
+ public function getLink () {
+ return $this->payload->comment->html_url;
+ }
+}
diff --git a/app/Analyzers/GitHub/Events/CreateEvent.php b/app/Analyzers/GitHub/Events/CreateEvent.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/CreateEvent.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * CreateEvent payload analyzer
+ *
+ * We don't support the repository ref type, as, according the documentation,
+ * "webhooks will not receive this event for created repositories".webhooks
+ *
+ * Another case when we won't receive the event is when at least four tags are
+ * pushed at once.
+ *
+ * @link https://developer.github.com/v3/activity/events/types/#createevent
+ */
+class CreateEvent extends Event {
+
+ use WithRef;
+
+ /**
+ * Gets description for the payload
+ *
+ * @return string
+ */
+ public function getDescription () {
+ $repository = $this->payload->repository->full_name;
+ $type = $this->payload->ref_type;
+ $ref = $this->payload->ref;
+
+ if (!self::isValidRefType($type)) {
+ return trans(
+ 'GitHub.EventsDescriptions.CreateEventUnknown',
+ [
+ 'type' => $type,
+ 'ref' => $ref,
+ ]
+ );
+ }
+
+ return trans(
+ 'GitHub.EventsDescriptions.CreateEvent',
+ [
+ 'type' => $type,
+ 'ref' => $ref,
+ 'repository' => $repository,
+ ]
+ );
+ }
+
+ /**
+ * Gets link segments for the type
+ *
+ * @return Array
+ * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+ */
+ private function getLinkRefSegments () {
+ return [
+ 'tag' => '/releases/tag/',
+ 'branch' => '/tree/',
+ ];
+ }
+
+ /**
+ * Gets link for the payload
+ *
+ * @return string
+ */
+ public function getLink () {
+ $type = $this->payload->ref_type;
+ $ref = $this->payload->ref;
+
+ $url = $this->payload->repository->html_url;
+ $url .= $this->getLinkRefSegment($type);
+ $url .= $ref;
+
+ return $url;
+ }
+}
diff --git a/app/Analyzers/GitHub/Events/DeleteEvent.php b/app/Analyzers/GitHub/Events/DeleteEvent.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/DeleteEvent.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * DeleteEvent payload analyzer
+ *
+ * Another case when we won't receive the event is when at least four tags are
+ * deleted at once.
+ *
+ * @link https://developer.github.com/v3/activity/events/types/#deleteevent
+ */
+class DeleteEvent extends Event {
+
+ use WithRef;
+
+ /**
+ * Gets description for the payload
+ *
+ * @return string
+ */
+ public function getDescription () {
+ $repository = $this->payload->repository->full_name;
+ $type = $this->payload->ref_type;
+ $ref = $this->payload->ref;
+
+ if (!self::isValidRefType($type)) {
+ return trans(
+ 'GitHub.EventsDescriptions.DeleteEventUnknown',
+ [
+ 'type' => $type,
+ 'ref' => $ref,
+ ]
+ );
+ }
+
+ return trans(
+ 'GitHub.EventsDescriptions.DeleteEvent',
+ [
+ 'type' => $type,
+ 'ref' => $ref,
+ 'repository' => $repository,
+ ]
+ );
+ }
+
+ /**
+ * Gets link segments for the type
+ *
+ * @return Array
+ * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+ */
+ private function getLinkRefSegments () {
+ return [
+ 'tag' => '/tags',
+ 'branch' => '/branches',
+ ];
+ }
+
+ /**
+ * Gets link for the payload
+ *
+ * @return string
+ */
+ public function getLink () {
+ $type = $this->payload->ref_type;
+
+ $url = $this->payload->repository->html_url;
+ $url .= $this->getLinkRefSegment($type);
+
+ return $url;
+ }
+}
diff --git a/app/Analyzers/GitHub/Events/Event.php b/app/Analyzers/GitHub/Events/Event.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/Event.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+class Event {
+
+ ///
+ /// Properties
+ ///
+
+ /**
+ * The payload
+ *
+ * @var stdClass
+ */
+ protected $payload;
+
+ ///
+ /// Constructor
+ ///
+
+ public function __construct ($payload) {
+ $this->payload = $payload;
+ }
+
+ ///
+ /// Gets or initialize relevant class
+ ///
+
+ /**
+ * Gets class name from the GitHub webhooks event name
+ *
+ * @param string $eventName The event name (e.g. commit_comment)
+ * @return string The event class name (e.g. CommitCommentEvent)
+ */
+ public static function getClass ($eventName) {
+ return __NAMESPACE__ . '\\' . studly_case($eventName) . 'Event';
+ }
+
+ /**
+ * Gets an instance of the event class, from the
+ *
+ * @param string $eventName The event name (e.g. commit_comment)
+ * @return Event
+ */
+ public static function forPayload ($eventName, $payload) {
+ $class = self::getClass($eventName);
+ if (!class_exists($class)) {
+ throw new \InvalidArgumentException("Class doesn't exist: $class (for $eventName)");
+ }
+ return new $class($payload);
+ }
+
+ ///
+ /// Helper methods
+ ///
+
+ /**
+ * Cuts a text
+ *
+ * @param string $text The text to cut
+ * @param int $strLen The amount of characters to allow [optional]
+ * @param string $symbol The symbol to append to a cut text [optional]
+ */
+ public static function cut ($text, $strLen = 114, $symbol = '…') {
+ $len = strlen($text);
+ if ($len <= $strLen) {
+ return $text;
+ }
+
+ if ($strLen < 1) {
+ return $symbol;
+ }
+
+ return substr($text, 0, $strLen - 1) . $symbol;
+ }
+
+}
diff --git a/app/Analyzers/GitHub/Events/PingEvent.php b/app/Analyzers/GitHub/Events/PingEvent.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/PingEvent.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * PingEvent payload analyzer
+ *
+ * @link https://developer.github.com/webhooks/#ping-event
+ */
+class PingEvent extends Event {
+
+ /**
+ * Gets description for the payload
+ *
+ * @return string
+ */
+ public function getDescription () {
+ return trans(
+ 'GitHub.EventsDescriptions.PingEvent',
+ [
+ 'zen' => $this->payload->zen,
+ 'hook_id' => $this->payload->hook_id,
+ ]
+ );
+ }
+
+ /**
+ * Gets link for the payload
+ *
+ * @return string
+ */
+ public function getLink () {
+ return '';
+ }
+}
diff --git a/app/Analyzers/GitHub/Events/PushEvent.php b/app/Analyzers/GitHub/Events/PushEvent.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/PushEvent.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * PushEvent payload analyzer
+ *
+ * @link https://developer.github.com/v3/activity/events/types/#pushevent
+ */
+class PushEvent extends Event {
+
+ use WithCommit;
+ use WithRepoAndBranch;
+
+ /**
+ * Gets the description message key according the amount of commits
+ *
+ * @param int $count The count of commits
+ * @return The l10n message key for description
+ */
+ private static function getDescriptionMessageKey ($count) {
+ $key = 'GitHub.EventsDescriptions.PushEvent';
+
+ if ($count === 0) {
+ return $key . '.0';
+ }
+
+ return $key . '.n';
+ }
+
+ /**
+ * Gets description for the payload
+ *
+ * @return string
+ */
+ public function getDescription () {
+ $n = count($this->payload->commits);
+
+ if ($n === 1) {
+ // If only one commit is pushed at the time,
+ // we want a description for this commit.
+ return $this->getHeadCommitDescription();
+ }
+
+ // Otherwise, we want a description for the push.
+ return trans(self::getDescriptionMessageKey($n), [
+ 'user' => $this->payload->pusher->name,
+ 'count' => $n,
+ 'repoAndBranch' => $this->getWhere(),
+ ]);
+ }
+
+ /**
+ * Gets link for the payload
+ *
+ * @return string
+ */
+ public function getLink () {
+ $n = count($this->payload->commits);
+
+ if ($n === 1) {
+ return $this->payload->head_commit->url;
+ }
+
+ return $this->payload->compare;
+ }
+}
diff --git a/app/Analyzers/GitHub/Events/RepositoryEvent.php b/app/Analyzers/GitHub/Events/RepositoryEvent.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/RepositoryEvent.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * RepositoryEvent payload analyzer
+ *
+ * @link https://developer.github.com/v3/activity/events/types/#repositoryevent
+ */
+class RepositoryEvent extends Event {
+
+ /**
+ * Gets description for the payload
+ *
+ * @return string
+ */
+ public function getDescription () {
+ $message = trans('GitHub.EventsDescriptions.RepositoryEvent', [
+ 'repository' => $this->payload->repository->full_name,
+ ]);
+
+ if ($this->payload->repository->fork) {
+ $message .= trans('GitHub.EventsDescriptions.RepositoryEventFork');
+ }
+
+ if ($description = $this->payload->repository->description) {
+ $message .= trans('GitHub.Separator');
+ $message .= $description;
+ }
+
+ return $message;
+ }
+
+ /**
+ * Gets link for the payload
+ *
+ * @return string
+ */
+ public function getLink () {
+ return $this->payload->repository->html_url;
+ }
+}
diff --git a/app/Analyzers/GitHub/Events/StatusEvent.php b/app/Analyzers/GitHub/Events/StatusEvent.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/StatusEvent.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * StatusEvent payload analyzer
+ *
+ * @link https://developer.github.com/v3/activity/events/types/#statusevent
+ */
+class StatusEvent extends Event {
+
+ /**
+ * Gets state localized message
+ *
+ * @return string
+ */
+ private function getState () {
+ $state = $this->payload->state; // pending, success, failure, or error
+ $key = 'GitHub.StatusEventState.' . $state;
+ return trans($key);
+ }
+
+ /**
+ * Gets status result
+ *
+ * @return string
+ */
+ private function getStatusResult () {
+ $glue = trans('GitHub.Separator');
+ $fragments = array_filter([
+ $this->payload->context,
+ $this->payload->description,
+ $this->getState(),
+ ]);
+
+ return implode($glue, $fragments);
+ }
+
+ /**
+ * Gets description for the payload
+ *
+ * @return string
+ */
+ public function getDescription () {
+ return trans('GitHub.EventsDescriptions.StatusEvent', [
+ 'commit' => substr($this->payload->sha, 0, 8),
+ 'status' => $this->getStatusResult(),
+ ]);
+ }
+
+ /**
+ * Gets link for the payload
+ *
+ * @return string
+ */
+ public function getLink () {
+ $url = $this->payload->target_url;
+
+ if ($url === null) {
+ return "";
+ }
+
+ return $url;
+ }
+}
diff --git a/app/Analyzers/GitHub/Events/UnknownEvent.php b/app/Analyzers/GitHub/Events/UnknownEvent.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/UnknownEvent.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * Unknown event payload analyzer
+ *
+ * This is a fallack when no specific class exists for this event type.
+ */
+class UnknownEvent extends Event {
+
+ /**
+ * @var string
+ */
+ private $eventType;
+
+ /**
+ * Initializes a new instance of the UnknownEvent class, an Event analyzer
+ * class to handle unknown events type.
+ *
+ * @param string $eventType The event type (e.g. push)
+ */
+ public function __construct ($eventType, $payload = null) {
+ $this->eventType = $eventType;
+ parent::__construct($payload);
+ }
+
+ /**
+ * Gets description for the payload
+ *
+ * @return string
+ */
+ public function getDescription () {
+ return "Some $this->eventType happened";
+ }
+
+ /**
+ * Gets link for the payload
+ *
+ * @return string
+ */
+ public function getLink () {
+ return "";
+ }
+}
diff --git a/app/Analyzers/GitHub/Events/WithCommit.php b/app/Analyzers/GitHub/Events/WithCommit.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/WithCommit.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * Helper methods for events with a need to specify commit information
+ * (e.g. push)
+ *
+ * @link https://developer.github.com/v3/activity/events/types/#pushevent
+ */
+trait WithCommit {
+
+ /**
+ * Gets the title of the head commit
+ *
+ * @return string
+ */
+ private function getHeadCommitTitle () {
+ return static::getCommitTitle($this->payload->head_commit->message);
+ }
+
+ /**
+ * Extracts the commit title from the whole commit message.
+ *
+ * @param string $message The commit message
+ * @return string The commit title
+ */
+ public static function getCommitTitle ($message) {
+ // Discards extra lines
+ $pos = strpos($message, "\n");
+ if ($pos > 0) {
+ $message = substr($message, 0, $pos);
+ }
+
+ // Short messages are returned as is
+ // Longer messages are truncated
+ return self::cut($message, 72);
+ }
+
+ /**
+ * Gets the description text for the head commit.
+ *
+ * @return string
+ */
+ private function getHeadCommitDescription () {
+ $commit = $this->payload->head_commit;
+ $committer = $commit->committer->username;
+ $author = $commit->author->username;
+
+ $message = trans('GitHub.Commits.Message', [
+ 'committer' => $committer,
+ 'title' => $this->getHeadCommitTitle(),
+ ]);
+
+ if ($committer !== $author) {
+ $message .= trans('GitHub.Commits.Authored', [
+ 'author' => $author,
+ ]);
+ }
+
+ return $message;
+ }
+
+}
diff --git a/app/Analyzers/GitHub/Events/WithRef.php b/app/Analyzers/GitHub/Events/WithRef.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/WithRef.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * References helper methods for events using ref and ref_type fields.
+ * (e.g. create and delete)
+ *
+ * @link https://developer.github.com/v3/activity/events/types/#createevent
+ * @link https://developer.github.com/v3/activity/events/types/#deleteevent
+ */
+trait WithRef {
+
+ /**
+ * Determines if the ref type is valid.
+ *
+ * The ref type 'repository' is deemed invalid, as we shouldn't receive it.
+ *
+ * @param string $type The ref type to check
+ * @return bool true if the ref type id valid; otheriwse, false
+ */
+ protected static function isValidRefType ($type) {
+ $types = ['branch', 'tag'];
+ return in_array($type, $types);
+ }
+
+ /**
+ * Gets link ref segment for the payload
+ *
+ * @param string $type The reference type
+ * @return string the part of the URL for this reference type (e.g. /tree/)
+ */
+ protected function getLinkRefSegment ($type) {
+ $segments = $this->getLinkRefSegments();
+
+ if (!array_key_exists($type, $segments)) {
+ throw new \InvalidArgumentException;
+ }
+
+ return $segments[$type];
+ }
+
+}
diff --git a/app/Analyzers/GitHub/Events/WithRepoAndBranch.php b/app/Analyzers/GitHub/Events/WithRepoAndBranch.php
new file mode 100644
--- /dev/null
+++ b/app/Analyzers/GitHub/Events/WithRepoAndBranch.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Nasqueron\Notifications\Analyzers\GitHub\Events;
+
+/**
+ * Helper methods for events with a need to specify the repo and the branch
+ * (e.g. push)
+ *
+ * @link https://developer.github.com/v3/activity/events/types/#pushevent
+ */
+trait WithRepoAndBranch {
+
+ /**
+ * Gets repository and branch information
+ *
+ * @return string
+ */
+ public function getWhere () {
+ $repo = $this->payload->repository->name;
+ $branch = $this->payload->ref;
+
+ return static::getRepositoryAndBranch($repo, $branch);
+ }
+
+ /**
+ * Gets a repository and branch information string
+ *
+ * @param string $repo The repository
+ * @param string $branch The branch
+ * @return string "<repo>" or "<repo> (branch <branch>)" when branch isn't master
+ */
+ public static function getRepositoryAndBranch ($repo = "", $branch = "") {
+ if ($repo === "") {
+ return "";
+ }
+
+ if (starts_with($branch, "refs/heads/")) {
+ $branch = substr($branch, 11);
+ }
+
+ if ($branch === "" || $branch === "master") {
+ return $repo;
+ }
+
+ return trans('GitHub.RepoAndBranch', [
+ 'repo' => $repo,
+ 'branch' => $branch,
+ ]);
+ }
+
+}
diff --git a/app/Analyzers/GitHub/GitHubPayloadAnalyzer.php b/app/Analyzers/GitHub/GitHubPayloadAnalyzer.php
--- a/app/Analyzers/GitHub/GitHubPayloadAnalyzer.php
+++ b/app/Analyzers/GitHub/GitHubPayloadAnalyzer.php
@@ -2,6 +2,9 @@
namespace Nasqueron\Notifications\Analyzers\GitHub;
+use Nasqueron\Notifications\Analyzers\GitHub\Events\Event;
+use Nasqueron\Notifications\Analyzers\GitHub\Events\UnknownEvent;
+
use Config;
use Storage;
@@ -28,13 +31,19 @@
*/
private $payload;
-
/**
* The configuration for the payload analyzer
- * @var GitHubPayloadAnalyzerConfiguration;
+ * @var Event;
*/
private $configuration;
+ /**
+ * The payload analyzer event
+ *
+ * @var Nasqueron\Notifications\Analyzers\GitHub\Events\Event;
+ */
+ private $analyzerEvent;
+
///
/// Constructor
///
@@ -56,6 +65,12 @@
$this->payload = $payload;
$this->loadConfiguration($project);
+
+ try {
+ $this->analyzerEvent = Event::forPayload($event, $payload);
+ } catch (\InvalidArgumentException $ex) {
+ $this->analyzerEvent = new UnknownEvent($event);
+ }
}
///
@@ -142,146 +157,12 @@
///
/**
- * Gets repository and branch information
- *
- * @return string
- */
- public function getWhere () {
- $repo = $this->payload->repository->name;
- $branch = $this->payload->ref;
- return static::getRepositoryAndBranch($repo, $branch);
- }
-
- /**
- * Gets a repository and branch information string
- *
- * @param string $repo The repository
- * @param string $branch The branch
- * @return string "<repo>" or "<repo> (branch <branch>)" when branch isn't master
- */
- public static function getRepositoryAndBranch ($repo = "", $branch = "") {
- if ($repo === "") {
- return "";
- }
-
- if (starts_with($branch, "refs/heads/")) {
- $branch = substr($branch, 11);
- }
-
- if ($branch === "" || $branch === "master") {
- return $repo;
- }
-
- return "$repo (branch $branch)";
- }
-
- /**
- * Gets the title of the head commit
- *
- * @return string
- */
- private function getHeadCommitTitle () {
- return static::getCommitTitle($this->payload->head_commit->message);
- }
-
- /**
- * Extracts the commit title from the whole commit message.
- *
- * @param string $message The commit message
- * @return string The commit title
- */
- public static function getCommitTitle ($message) {
- // Discards extra lines
- $pos = strpos($message, "\n");
- if ($pos > 0) {
- $message = substr($message, 0, $pos);
- }
-
- // Short messages are returned as is
- $len = strlen($message);
- if ($len <= 72) {
- return $message;
- }
-
- // Longer messages are truncated
- return substr($message, 0, 71) . '…';
- }
-
- /**
- * Gets the description text for the head commit.
- *
- * @return string
- */
- private function getHeadCommitDescription () {
- $commit = $this->payload->head_commit;
- $title = $this->getHeadCommitTitle();
- $committer = $commit->committer->username;
- $author = $commit->author->username;
-
- $message = "$committer committed $title";
- if ($committer !== $author) {
- $message .= " (authored by $author)";
- }
-
- return $message;
- }
-
- /**
* Gets a short textual description of the event
*
* @return string
*/
public function getDescription () {
- switch ($this->event) {
- case "create":
- $repository = $this->payload->repository->full_name;
- $type = $this->payload->ref_type;
- $ref = $this->payload->ref;
-
- if ($type === "tag" || $type === "branch") {
- return "New $type on $repository: $ref";
- }
-
- return "Unknown create: $type $ref";
-
- case "ping":
- $quote = $this->payload->zen;
- return "« $quote » — GitHub Webhooks ping zen aphorism.";
-
- case "push":
- $n = count($this->payload->commits);
- if ($n === 1) {
- return $this->getHeadCommitDescription();
- }
-
- $repoAndBranch = $this->getWhere();
- $user = $this->payload->pusher->name;
-
- if ($n === 0) {
- return "$user forcely updated $repoAndBranch";
- }
-
- return "$user pushed $n commits to $repoAndBranch";
-
- case "repository":
- $repository = $this->payload->repository->full_name;
- $message = "New repository $repository";
- if ($this->payload->repository->fork) {
- $message .= " (fork)";
- }
- if ($description = $this->payload->repository->description) {
- $message .= " — $description";
- }
- return $message;
-
- case "status":
- return $this->payload->description
- . " — "
- . $this->payload->context;
-
- default:
- return "Some $this->event happened";
- }
+ return $this->analyzerEvent->getDescription();
}
/**
@@ -290,35 +171,6 @@
* @return string The most relevant URL
*/
public function getLink () {
- switch ($this->event) {
- case "create":
- $type = $this->payload->ref_type;
- $ref = $this->payload->ref;
- $url = $this->payload->repository->html_url;
-
- if ($type === "tag") {
- $url .= "/releases/tag/" . $ref;
- } elseif ($type === "branch") {
- $url .= "/tree/" . $ref;
- }
-
- return $url;
-
- case "push":
- $n = count($this->payload->commits);
- if ($n === 1) {
- return $this->payload->head_commit->url;
- }
- return $this->payload->compare;
-
- case "repository":
- return $this->payload->repository->html_url;
-
- case "status":
- return $this->payload->target_url;
-
- default:
- return "";
- }
+ return $this->analyzerEvent->getLink();
}
}
diff --git a/resources/lang/en/GitHub.php b/resources/lang/en/GitHub.php
new file mode 100644
--- /dev/null
+++ b/resources/lang/en/GitHub.php
@@ -0,0 +1,53 @@
+<?php
+
+return [
+
+ /*
+ |--------------------------------------------------------------------------
+ | GitHub notifications messages
+ |--------------------------------------------------------------------------
+ |
+ | The following language lines are used to localize notifications for events
+ | fired by GitHub
+ |
+ */
+
+ 'Separator' => ' — ',
+
+ 'Commits' => [
+ 'Message' => ':committer committed :title',
+ 'Authored' => ' (authored by :author)', // appended to Message
+ ],
+
+ 'RepoAndBranch' => ':repo (branch :branch)',
+
+ 'EventsDescriptions' => [
+ 'CommitCommentEvent' => ':author added a comment to :commit: :excerpt',
+
+ 'CreateEvent' => 'New :type on :repository: :ref',
+ 'CreateEventUnknown' => 'Unknown create reference: :type :ref',
+
+ 'DeleteEvent' => 'Removed :type on :repository: :ref',
+ 'DeleteEventUnknown' => 'Unknown delete reference: :type :ref',
+
+ 'PingEvent' => '« :zen » — GitHub Webhooks ping zen aphorism.',
+
+ 'PushEvent' => [
+ '0' => ':user forcely updated :repoAndBranch',
+ 'n' => ':user pushed :count commits to :repoAndBranch', // n > 1
+ ],
+
+ 'RepositoryEvent' => 'New repository :repository',
+ 'RepositoryEventFork' => ' (fork)',
+
+ 'StatusEvent' => 'Status of :commit: :status',
+ ],
+
+ 'StatusEventState' => [
+ 'pending' => 'pending',
+ 'success' => 'success',
+ 'failure' => 'failure',
+ 'error' => 'error',
+ ],
+
+];
diff --git a/tests/Analyzers/GitHub/Events/CreateEventTest.php b/tests/Analyzers/GitHub/Events/CreateEventTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Analyzers/GitHub/Events/CreateEventTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Analyzers\GitHub\Events;
+
+use Nasqueron\Notifications\Analyzers\GitHub\Events\CreateEvent;
+use Nasqueron\Notifications\Tests\TestCase;
+
+class CreateEventTest extends TestCase {
+ /**
+ * @var CreateEvent
+ */
+ private $event;
+
+ public function setUp () {
+ $payload = new \stdClass;
+ $payload->repository = new \stdClass;
+ $payload->repository->full_name = 'baxterthehacker/public-repo';
+ $payload->repository->html_url = 'https://github.com/baxterthehacker/public-repo';
+ $payload->ref_type = 'bookmark';
+ $payload->ref = 'quux';
+
+ $this->event = new CreateEvent($payload);
+
+ parent::setUp();
+ }
+
+ public function testNonExistingRefType () {
+ $this->assertSame(
+ "Unknown create reference: bookmark quux",
+ $this->event->getDescription()
+ );
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testNonExistingRefTypeLinkException () {
+ $this->event->getLink();
+ }
+
+}
diff --git a/tests/Analyzers/GitHub/Events/DeleteEventTest.php b/tests/Analyzers/GitHub/Events/DeleteEventTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Analyzers/GitHub/Events/DeleteEventTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Analyzers\GitHub\Events;
+
+use Nasqueron\Notifications\Analyzers\GitHub\Events\DeleteEvent;
+use Nasqueron\Notifications\Tests\TestCase;
+
+class DeleteEventTest extends TestCase {
+ /**
+ * @var DeleteEvent
+ */
+ private $event;
+
+ public function setUp () {
+ $payload = new \stdClass;
+ $payload->repository = new \stdClass;
+ $payload->repository->full_name = 'baxterthehacker/public-repo';
+ $payload->repository->html_url = 'https://github.com/baxterthehacker/public-repo';
+ $payload->ref_type = 'bookmark';
+ $payload->ref = 'quux';
+
+ $this->event = new DeleteEvent($payload);
+
+ parent::setUp();
+ }
+
+ public function testNonExistingRefType () {
+ $this->assertSame(
+ "Unknown delete reference: bookmark quux",
+ $this->event->getDescription()
+ );
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testNonExistingRefTypeLinkException () {
+ $this->event->getLink();
+ }
+
+}
diff --git a/tests/Analyzers/GitHub/Events/EventTest.php b/tests/Analyzers/GitHub/Events/EventTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Analyzers/GitHub/Events/EventTest.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Analyzers\GitHub\Events;
+
+use Nasqueron\Notifications\Analyzers\GitHub\Events\Event;
+use Nasqueron\Notifications\Tests\TestCase;
+
+class EventTest extends TestCase {
+
+ public function testGetClass () {
+ $this->assertSame(
+ 'Nasqueron\Notifications\Analyzers\GitHub\Events\CommitCommentEvent',
+ Event::getClass('commit_comment')
+ );
+ }
+
+ public function testForPayload () {
+ $this->assertInstanceOf(
+ 'Nasqueron\Notifications\Analyzers\GitHub\Events\CommitCommentEvent',
+ Event::forPayload('commit_comment', new \stdClass)
+ );
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testForPayloadWithException () {
+ Event::forPayload('not_existing', new \stdClass);
+ }
+
+ public function testCut () {
+ $this->assertSame('', Event::cut(''));
+ $this->assertSame('', Event::cut('', 0));
+ $this->assertSame('…', Event::cut('Lorem ipsum dolor', 0));
+ $this->assertSame('Lorem…', Event::cut('Lorem ipsum dolor', 6));
+ $this->assertSame('Lorem ipsum dolor', Event::cut('Lorem ipsum dolor'));
+ }
+
+ /**
+ * @dataProvider payloadDescriptionProvider
+ */
+ public function testGetDescriptionAndLink ($eventName,
+ $expectedDescription,
+ $expectedLink) {
+ $filename = __DIR__ . "/../../../data/payloads/GitHubEvents/$eventName.json";
+ $payload = json_decode(file_get_contents($filename));
+ $event = Event::forPayload($eventName, $payload);
+
+ $this->assertSame($expectedDescription, $event->getDescription());
+ $this->assertSame($expectedLink, $event->getLink());
+ }
+
+ public function payloadDescriptionProvider () {
+ return [
+ 'CommitCommentEvent' => [
+ 'commit_comment',
+ 'baxterthehacker added a comment to 9049f126: This is a really good change! :+1:',
+ 'https://github.com/baxterthehacker/public-repo/commit/9049f1265b7d61be4a8904a9a27120d2064dab3b#commitcomment-11056394'
+ ],
+ 'CreateEvent' => [
+ 'create',
+ 'New tag on baxterthehacker/public-repo: 0.0.1',
+ 'https://github.com/baxterthehacker/public-repo/releases/tag/0.0.1'
+ ],
+ 'DeleteEvent' => [
+ 'delete',
+ 'Removed tag on baxterthehacker/public-repo: simple-tag',
+ 'https://github.com/baxterthehacker/public-repo/tags'
+ ],
+ 'PushEvent' => [
+ 'push',
+ 'baxterthehacker committed Update README.md',
+ 'https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c'
+ ],
+ 'RepositoryEvent' => [
+ 'repository',
+ 'New repository baxterandthehackers/new-repository',
+ 'https://github.com/baxterandthehackers/new-repository'
+ ],
+ 'StatusEvent' => [
+ 'status',
+ 'Status of 9049f126: default — success',
+ ''
+ ],
+ ];
+ }
+
+}
diff --git a/tests/Analyzers/GitHub/Events/PushEventTest.php b/tests/Analyzers/GitHub/Events/PushEventTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Analyzers/GitHub/Events/PushEventTest.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Analyzers\GitHub\Events;
+
+use Nasqueron\Notifications\Analyzers\GitHub\Events\PushEvent;
+use Nasqueron\Notifications\Tests\TestCase;
+
+class PushEventTest extends TestCase {
+
+ /**
+ * @var stdClass[]
+ */
+ private $payloads;
+
+ public function setUp () {
+ $payloadsToPrepare = [
+ '0' => 'GitHubPushForceZeroPayload.json',
+ '1' => 'GitHubEvents/push.json',
+ 'n' => 'GitHubPushSeveralCommitsPayload.json',
+ ];
+
+ foreach ($payloadsToPrepare as $key => $filename) {
+ $filename = __DIR__ . "/../../../data/payloads/" . $filename;
+ $this->payloads[$key] = json_decode(file_get_contents($filename));
+ }
+
+ parent::setUp();
+ }
+
+ ///
+ /// WithRepoAndBranch trait
+ ///
+
+
+ public function testGetRepositoryAndBranch () {
+ $this->assertEquals("", PushEvent::getRepositoryAndBranch("", "master"));
+ $this->assertEquals("", PushEvent::getRepositoryAndBranch("", "foo"));
+ $this->assertEquals("quux", PushEvent::getRepositoryAndBranch("quux", "master"));
+ $this->assertEquals("quux", PushEvent::getRepositoryAndBranch("quux", "refs/heads/master"));
+ $this->assertEquals("quux", PushEvent::getRepositoryAndBranch("quux", ""));
+ $this->assertEquals("quux (branch foo)", PushEvent::getRepositoryAndBranch("quux", "refs/heads/foo"));
+ $this->assertEquals("quux (branch feature/foo)", PushEvent::getRepositoryAndBranch("quux", "refs/heads/feature/foo"));
+ $this->assertEquals("quux (branch feature/foo)", PushEvent::getRepositoryAndBranch("quux", "feature/foo"));
+ $this->assertEquals("quux (branch foo)", PushEvent::getRepositoryAndBranch("quux", "foo"));
+ $this->assertEquals("quux (branch 0)", PushEvent::getRepositoryAndBranch("quux", "0"));
+ }
+
+ ///
+ /// WithCommit trait
+ ///
+
+ public function testGetCommitTitle () {
+ $this->assertEquals("", PushEvent::getCommitTitle(""));
+ $this->assertEquals("Lorem ipsum dolor", PushEvent::getCommitTitle("Lorem ipsum dolor"));
+
+ $longCommitMessages = [
+ "I was born in a water moon. Some people, especially its inhabitants, called it a planet, but as it was only a little over two hundred kilometres in diameter, 'moon' seems the more accurate term. The moon was made entirely of water, by which I mean it was a globe that not only had no land, but no rock either, a sphere with no solid core at all, just liquid water, all the way down to the very centre of the globe.",
+ "I was born in a water moon. Some people, especially its inhabitants, called it a planet, but as it was only a little over two hundred kilometres in diameter, 'moon' seems the more accurate term. The moon was made entirely of water, by which I mean it was a globe that not only had no land, but no rock either, a sphere with no solid core at all, just liquid water, all the way down to the very centre of the globe.\n\nIf it had been much bigger the moon would have had a core of ice, for water, though supposedly incompressible, is not entirely so, and will change under extremes of pressure to become ice. (If you are used to living on a planet where ice floats on the surface of water, this seems odd and even wrong, but nevertheless it is the case.) The moon was not quite of a size for an ice core to form, and therefore one could, if one was sufficiently hardy, and adequately proof against the water pressure, make one's way down, through the increasing weight of water above, to the very centre of the moon.",
+ ];
+ $shortCommitTitle = "I was born in a water moon. Some people, especially its inhabitants, ca…";
+ foreach ($longCommitMessages as $longCommitMessage) {
+ $this->assertEquals(
+ $shortCommitTitle,
+ PushEvent::getCommitTitle($longCommitMessage)
+ );
+ }
+ }
+
+ public function testWhenTheCommitterAndAuthorAreDifferent () {
+ $payload = clone $this->payloads['1'];
+ $payload->head_commit->author->username = "Skrunge";
+ $event = new PushEvent($payload);
+
+ $this->assertSame(
+ "baxterthehacker committed Update README.md (authored by Skrunge)",
+ $event->getDescription()
+ );
+ }
+
+ public function testOnGitPushForce () {
+ $event = new PushEvent($this->payloads['0']);
+
+ $this->assertSame(
+ "dereckson forcely updated docker-nginx-php-fpm (branch novolume)",
+ $event->getDescription()
+ );
+ $this->assertContains("compare", $event->getLink());
+ }
+
+ public function testOnGitPushWithSeveralCommits () {
+ $event = new PushEvent($this->payloads['n']);
+
+ $this->assertSame(
+ "dereckson pushed 2 commits to notifications",
+ $event->getDescription()
+ );
+ $this->assertContains("compare", $event->getLink());
+ }
+}
diff --git a/tests/Analyzers/GitHub/Events/RepositoryEventTest.php b/tests/Analyzers/GitHub/Events/RepositoryEventTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Analyzers/GitHub/Events/RepositoryEventTest.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Analyzers\GitHub\Events;
+
+use Nasqueron\Notifications\Analyzers\GitHub\Events\RepositoryEvent;
+use Nasqueron\Notifications\Tests\TestCase;
+
+class RepositoryEventTest extends TestCase {
+
+ /**
+ * @var stdClass
+ */
+ private $payload;
+
+ public function setUp () {
+ $filename = __DIR__ . "/../../../data/payloads/GitHubEvents/repository.json";
+ $this->payload = json_decode(file_get_contents($filename));
+
+ parent::setUp();
+ }
+
+ public function testWhenRepositoryIsForked () {
+ $payload = clone $this->payload;
+ $payload->repository->fork = true;
+ $event = new RepositoryEvent($payload);
+
+ $this->assertContains("fork", $event->getDescription());
+ }
+
+ public function testWhenRepositoryContainsDescription () {
+ $payload = clone $this->payload;
+ $payload->repository->description = "Lorem ipsum dolor";
+ $event = new RepositoryEvent($payload);
+
+ $this->assertContains("Lorem ipsum dolor", $event->getDescription());
+ }
+
+ public function testWhenRepositoryIsForkedAndContainsDescription () {
+ $payload = clone $this->payload;
+ $payload->repository->fork = true;
+ $payload->repository->description = "Lorem ipsum dolor";
+ $event = new RepositoryEvent($payload);
+
+ $this->assertContains("fork", $event->getDescription());
+ $this->assertContains("Lorem ipsum dolor", $event->getDescription());
+ }
+
+}
diff --git a/tests/Analyzers/GitHub/Events/StatusEventTest.php b/tests/Analyzers/GitHub/Events/StatusEventTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Analyzers/GitHub/Events/StatusEventTest.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Analyzers\GitHub\Events;
+
+use Nasqueron\Notifications\Analyzers\GitHub\Events\StatusEvent;
+use Nasqueron\Notifications\Tests\TestCase;
+
+class StatusEventTest extends TestCase {
+
+ /**
+ * @var stdClass
+ */
+ private $payload;
+
+ public function setUp () {
+ $filename = __DIR__ . "/../../../data/payloads/GitHubEvents/status.json";
+ $this->payload = json_decode(file_get_contents($filename));
+
+ parent::setUp();
+ }
+
+ public function testWhenStatusContainsUrl () {
+ $payload = clone $this->payload;
+ $payload->target_url = "http://www.perdu.com/";
+ $event = new StatusEvent($payload);
+
+ $this->assertSame(
+ "http://www.perdu.com/",
+ $event->getLink()
+ );
+ }
+
+}
diff --git a/tests/Analyzers/GitHub/Events/UnknownEventTest.php b/tests/Analyzers/GitHub/Events/UnknownEventTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Analyzers/GitHub/Events/UnknownEventTest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Analyzers\GitHub\Events;
+
+use Nasqueron\Notifications\Analyzers\GitHub\Events\UnknownEvent;
+use Nasqueron\Notifications\Tests\TestCase;
+
+class UnknownEventTest extends TestCase {
+
+ /**
+ * @var Nasqueron\Notifications\Analyzers\GitHub\Events\UnknownEvent
+ */
+ private $event;
+
+ public function setUp () {
+ $filename = __DIR__ . "/../../../data/payloads/GitHubEvents/push.json";
+ $payload = json_decode(file_get_contents($filename));
+ $this->event = new UnknownEvent("quux", $payload);
+
+ parent::setUp();
+ }
+
+ public function testUnknownEvent () {
+ $this->assertInstanceOf("Nasqueron\Notifications\Analyzers\GitHub\Events\UnknownEvent", $this->event);
+ $this->assertSame("Some quux happened", $this->event->getDescription());
+ $this->assertEmpty($this->event->getLink());
+ }
+}
diff --git a/tests/Analyzers/GitHub/GitHubPayloadAnalyzerConfigurationTest.php b/tests/Analyzers/GitHub/GitHubPayloadAnalyzerConfigurationTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Analyzers/GitHub/GitHubPayloadAnalyzerConfigurationTest.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Analyzers;
+
+use Illuminate\Foundation\Testing\WithoutMiddleware;
+
+use Nasqueron\Notifications\Analyzers\GitHub\GitHubPayloadAnalyzerConfiguration;
+use Nasqueron\Notifications\Tests\TestCase;
+
+class GitHubPayloadAnalyzerConfigurationTest extends TestCase {
+
+ /**
+ * Configuration
+ *
+ * @var Nasqueron\Notifications\Analyzers\GitHub\GitHubPayloadAnalyzerConfiguration
+ */
+ protected $configuration;
+
+ /**
+ * Prepares the test
+ */
+ public function setUp () {
+ $filename = __DIR__ . '/../../data/GitHubPayloadAnalyzer/Nasqueron.json';
+ $mapper = new \JsonMapper();
+ $this->configuration = $mapper->map(
+ json_decode(file_get_contents($filename)),
+ new GitHubPayloadAnalyzerConfiguration()
+ );
+
+ parent::setUp();
+ }
+
+ /**
+ * Determines the JSON object is well parsed
+ */
+ public function testProperties () {
+ $this->assertEquals("orgz", $this->configuration->administrativeGroup);
+ $this->assertEquals("nasqueron", $this->configuration->defaultGroup);
+
+ foreach ($this->configuration->repositoryMapping as $item) {
+ $this->assertInstanceOf(
+ 'Nasqueron\Notifications\Analyzers\GitHub\RepositoryGroupMapping',
+ $item
+ );
+ }
+ }
+}
diff --git a/tests/Analyzers/GitHub/GitHubPayloadAnalyzerTest.php b/tests/Analyzers/GitHub/GitHubPayloadAnalyzerTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Analyzers/GitHub/GitHubPayloadAnalyzerTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Analyzers;
+
+use Nasqueron\Notifications\Analyzers\GitHub\GitHubPayloadAnalyzer;
+use Nasqueron\Notifications\Tests\TestCase;
+
+class GitHubPayloadAnalyzerTest extends TestCase {
+
+ /**
+ * @var Nasqueron\Notifications\Analyzers\GitHub\GitHubPayloadAnalyzer
+ */
+ private $unknownEventAnalyzer;
+
+ /**
+ * Prepares the tests
+ */
+ public function setUp () {
+ parent::setUp();
+
+ $this->unknownEventAnalyzer = new GitHubPayloadAnalyzer(
+ "Acme",
+ "quux",
+ new \stdClass
+ );
+ }
+
+ ///
+ /// Test if our fallback is correct when the GitHub event type is unknown
+ ///
+
+ public function testDescriptionContainsTypeWhenEventTypeIsUnknown () {
+ $this->assertContains(
+ "quux",
+ $this->unknownEventAnalyzer->getDescription()
+ );
+ }
+
+}
diff --git a/tests/Analyzers/RepositoryGroupMappingTest.php b/tests/Analyzers/GitHub/RepositoryGroupMappingTest.php
rename from tests/Analyzers/RepositoryGroupMappingTest.php
rename to tests/Analyzers/GitHub/RepositoryGroupMappingTest.php
diff --git a/tests/Analyzers/GitHubPayloadAnalyzerTest.php b/tests/Analyzers/GitHubPayloadAnalyzerTest.php
deleted file mode 100644
--- a/tests/Analyzers/GitHubPayloadAnalyzerTest.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-namespace Nasqueron\Notifications\Tests\Analyzers;
-
-use Illuminate\Foundation\Testing\WithoutMiddleware;
-
-use Nasqueron\Notifications\Analyzers\GitHub\GitHubPayloadAnalyzer;
-use Nasqueron\Notifications\Analyzers\GitHub\GitHubPayloadAnalyzerConfiguration;
-use Nasqueron\Notifications\Tests\TestCase;
-
-class GitHubPayloadAnalyzerConfigurationTest extends TestCase {
-
- /**
- * Configuration
- *
- * @var Nasqueron\Notifications\Analyzers\GitHub\GitHubPayloadAnalyzerConfiguration
- */
- protected $configuration;
-
- /**
- * Prepares the test
- */
- public function setUp () {
- $filename = __DIR__ . '/../data/GitHubPayloadAnalyzer/Nasqueron.json';
- $mapper = new \JsonMapper();
- $this->configuration = $mapper->map(
- json_decode(file_get_contents($filename)),
- new GitHubPayloadAnalyzerConfiguration()
- );
- }
-
- /**
- * Determines the JSON object is well parsed
- */
- public function testProperties () {
- $this->assertEquals("orgz", $this->configuration->administrativeGroup);
- $this->assertEquals("nasqueron", $this->configuration->defaultGroup);
-
- foreach ($this->configuration->repositoryMapping as $item) {
- $this->assertInstanceOf(
- 'Nasqueron\Notifications\Analyzers\GitHub\RepositoryGroupMapping',
- $item
- );
- }
- }
-
- public function testGetCommitTitle () {
- $this->assertEquals("", GitHubPayloadAnalyzer::getCommitTitle(""));
- $this->assertEquals("Lorem ipsum dolor", GitHubPayloadAnalyzer::getCommitTitle("Lorem ipsum dolor"));
-
- $longCommitMessages = [
- "I was born in a water moon. Some people, especially its inhabitants, called it a planet, but as it was only a little over two hundred kilometres in diameter, 'moon' seems the more accurate term. The moon was made entirely of water, by which I mean it was a globe that not only had no land, but no rock either, a sphere with no solid core at all, just liquid water, all the way down to the very centre of the globe.",
- "I was born in a water moon. Some people, especially its inhabitants, called it a planet, but as it was only a little over two hundred kilometres in diameter, 'moon' seems the more accurate term. The moon was made entirely of water, by which I mean it was a globe that not only had no land, but no rock either, a sphere with no solid core at all, just liquid water, all the way down to the very centre of the globe.\n\nIf it had been much bigger the moon would have had a core of ice, for water, though supposedly incompressible, is not entirely so, and will change under extremes of pressure to become ice. (If you are used to living on a planet where ice floats on the surface of water, this seems odd and even wrong, but nevertheless it is the case.) The moon was not quite of a size for an ice core to form, and therefore one could, if one was sufficiently hardy, and adequately proof against the water pressure, make one's way down, through the increasing weight of water above, to the very centre of the moon.",
- ];
- $shortCommitTitle = "I was born in a water moon. Some people, especially its inhabitants, ca…";
- foreach ($longCommitMessages as $longCommitMessage) {
- $this->assertEquals(
- $shortCommitTitle,
- GitHubPayloadAnalyzer::getCommitTitle($longCommitMessage)
- );
- }
- }
-
- public function testGetRepositoryAndBranch () {
- $this->assertEquals("", GitHubPayloadAnalyzer::getRepositoryAndBranch("", "master"));
- $this->assertEquals("", GitHubPayloadAnalyzer::getRepositoryAndBranch("", "foo"));
- $this->assertEquals("quux", GitHubPayloadAnalyzer::getRepositoryAndBranch("quux", "master"));
- $this->assertEquals("quux", GitHubPayloadAnalyzer::getRepositoryAndBranch("quux", "refs/heads/master"));
- $this->assertEquals("quux", GitHubPayloadAnalyzer::getRepositoryAndBranch("quux", ""));
- $this->assertEquals("quux (branch foo)", GitHubPayloadAnalyzer::getRepositoryAndBranch("quux", "refs/heads/foo"));
- $this->assertEquals("quux (branch feature/foo)", GitHubPayloadAnalyzer::getRepositoryAndBranch("quux", "refs/heads/feature/foo"));
- $this->assertEquals("quux (branch feature/foo)", GitHubPayloadAnalyzer::getRepositoryAndBranch("quux", "feature/foo"));
- $this->assertEquals("quux (branch foo)", GitHubPayloadAnalyzer::getRepositoryAndBranch("quux", "foo"));
- $this->assertEquals("quux (branch 0)", GitHubPayloadAnalyzer::getRepositoryAndBranch("quux", "0"));
- }
-}
diff --git a/tests/data/payloads/GitHubEvents/commit_comment.json b/tests/data/payloads/GitHubEvents/commit_comment.json
new file mode 100644
--- /dev/null
+++ b/tests/data/payloads/GitHubEvents/commit_comment.json
@@ -0,0 +1,140 @@
+{
+ "action": "created",
+ "comment": {
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo/comments/11056394",
+ "html_url": "https://github.com/baxterthehacker/public-repo/commit/9049f1265b7d61be4a8904a9a27120d2064dab3b#commitcomment-11056394",
+ "id": 11056394,
+ "user": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "position": null,
+ "line": null,
+ "path": null,
+ "commit_id": "9049f1265b7d61be4a8904a9a27120d2064dab3b",
+ "created_at": "2015-05-05T23:40:29Z",
+ "updated_at": "2015-05-05T23:40:29Z",
+ "body": "This is a really good change! :+1:"
+ },
+ "repository": {
+ "id": 35129377,
+ "name": "public-repo",
+ "full_name": "baxterthehacker/public-repo",
+ "owner": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "private": false,
+ "html_url": "https://github.com/baxterthehacker/public-repo",
+ "description": "",
+ "fork": false,
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo",
+ "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks",
+ "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}",
+ "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}",
+ "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams",
+ "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks",
+ "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}",
+ "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events",
+ "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}",
+ "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}",
+ "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags",
+ "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}",
+ "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}",
+ "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}",
+ "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}",
+ "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages",
+ "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers",
+ "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors",
+ "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers",
+ "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription",
+ "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}",
+ "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}",
+ "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}",
+ "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}",
+ "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}",
+ "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}",
+ "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges",
+ "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}",
+ "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads",
+ "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}",
+ "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}",
+ "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}",
+ "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}",
+ "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}",
+ "created_at": "2015-05-05T23:40:12Z",
+ "updated_at": "2015-05-05T23:40:12Z",
+ "pushed_at": "2015-05-05T23:40:27Z",
+ "git_url": "git://github.com/baxterthehacker/public-repo.git",
+ "ssh_url": "git@github.com:baxterthehacker/public-repo.git",
+ "clone_url": "https://github.com/baxterthehacker/public-repo.git",
+ "svn_url": "https://github.com/baxterthehacker/public-repo",
+ "homepage": null,
+ "size": 0,
+ "stargazers_count": 0,
+ "watchers_count": 0,
+ "language": null,
+ "has_issues": true,
+ "has_downloads": true,
+ "has_wiki": true,
+ "has_pages": true,
+ "forks_count": 0,
+ "mirror_url": null,
+ "open_issues_count": 2,
+ "forks": 0,
+ "open_issues": 2,
+ "watchers": 0,
+ "default_branch": "master"
+ },
+ "sender": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+}
diff --git a/tests/data/payloads/GitHubEvents/create.json b/tests/data/payloads/GitHubEvents/create.json
new file mode 100644
--- /dev/null
+++ b/tests/data/payloads/GitHubEvents/create.json
@@ -0,0 +1,113 @@
+{
+ "ref": "0.0.1",
+ "ref_type": "tag",
+ "master_branch": "master",
+ "description": "",
+ "pusher_type": "user",
+ "repository": {
+ "id": 35129377,
+ "name": "public-repo",
+ "full_name": "baxterthehacker/public-repo",
+ "owner": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "private": false,
+ "html_url": "https://github.com/baxterthehacker/public-repo",
+ "description": "",
+ "fork": false,
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo",
+ "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks",
+ "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}",
+ "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}",
+ "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams",
+ "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks",
+ "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}",
+ "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events",
+ "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}",
+ "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}",
+ "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags",
+ "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}",
+ "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}",
+ "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}",
+ "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}",
+ "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages",
+ "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers",
+ "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors",
+ "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers",
+ "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription",
+ "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}",
+ "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}",
+ "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}",
+ "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}",
+ "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}",
+ "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}",
+ "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges",
+ "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}",
+ "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads",
+ "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}",
+ "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}",
+ "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}",
+ "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}",
+ "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}",
+ "created_at": "2015-05-05T23:40:12Z",
+ "updated_at": "2015-05-05T23:40:30Z",
+ "pushed_at": "2015-05-05T23:40:38Z",
+ "git_url": "git://github.com/baxterthehacker/public-repo.git",
+ "ssh_url": "git@github.com:baxterthehacker/public-repo.git",
+ "clone_url": "https://github.com/baxterthehacker/public-repo.git",
+ "svn_url": "https://github.com/baxterthehacker/public-repo",
+ "homepage": null,
+ "size": 0,
+ "stargazers_count": 0,
+ "watchers_count": 0,
+ "language": null,
+ "has_issues": true,
+ "has_downloads": true,
+ "has_wiki": true,
+ "has_pages": true,
+ "forks_count": 0,
+ "mirror_url": null,
+ "open_issues_count": 2,
+ "forks": 0,
+ "open_issues": 2,
+ "watchers": 0,
+ "default_branch": "master"
+ },
+ "sender": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+}
diff --git a/tests/data/payloads/GitHubEvents/delete.json b/tests/data/payloads/GitHubEvents/delete.json
new file mode 100644
--- /dev/null
+++ b/tests/data/payloads/GitHubEvents/delete.json
@@ -0,0 +1,111 @@
+{
+ "ref": "simple-tag",
+ "ref_type": "tag",
+ "pusher_type": "user",
+ "repository": {
+ "id": 35129377,
+ "name": "public-repo",
+ "full_name": "baxterthehacker/public-repo",
+ "owner": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "private": false,
+ "html_url": "https://github.com/baxterthehacker/public-repo",
+ "description": "",
+ "fork": false,
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo",
+ "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks",
+ "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}",
+ "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}",
+ "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams",
+ "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks",
+ "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}",
+ "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events",
+ "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}",
+ "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}",
+ "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags",
+ "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}",
+ "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}",
+ "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}",
+ "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}",
+ "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages",
+ "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers",
+ "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors",
+ "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers",
+ "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription",
+ "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}",
+ "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}",
+ "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}",
+ "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}",
+ "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}",
+ "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}",
+ "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges",
+ "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}",
+ "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads",
+ "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}",
+ "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}",
+ "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}",
+ "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}",
+ "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}",
+ "created_at": "2015-05-05T23:40:12Z",
+ "updated_at": "2015-05-05T23:40:30Z",
+ "pushed_at": "2015-05-05T23:40:40Z",
+ "git_url": "git://github.com/baxterthehacker/public-repo.git",
+ "ssh_url": "git@github.com:baxterthehacker/public-repo.git",
+ "clone_url": "https://github.com/baxterthehacker/public-repo.git",
+ "svn_url": "https://github.com/baxterthehacker/public-repo",
+ "homepage": null,
+ "size": 0,
+ "stargazers_count": 0,
+ "watchers_count": 0,
+ "language": null,
+ "has_issues": true,
+ "has_downloads": true,
+ "has_wiki": true,
+ "has_pages": true,
+ "forks_count": 0,
+ "mirror_url": null,
+ "open_issues_count": 2,
+ "forks": 0,
+ "open_issues": 2,
+ "watchers": 0,
+ "default_branch": "master"
+ },
+ "sender": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+}
diff --git a/tests/data/payloads/GitHubEvents/push.json b/tests/data/payloads/GitHubEvents/push.json
new file mode 100644
--- /dev/null
+++ b/tests/data/payloads/GitHubEvents/push.json
@@ -0,0 +1,161 @@
+{
+ "ref": "refs/heads/changes",
+ "before": "9049f1265b7d61be4a8904a9a27120d2064dab3b",
+ "after": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c",
+ "created": false,
+ "deleted": false,
+ "forced": false,
+ "base_ref": null,
+ "compare": "https://github.com/baxterthehacker/public-repo/compare/9049f1265b7d...0d1a26e67d8f",
+ "commits": [
+ {
+ "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c",
+ "distinct": true,
+ "message": "Update README.md",
+ "timestamp": "2015-05-05T19:40:15-04:00",
+ "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c",
+ "author": {
+ "name": "baxterthehacker",
+ "email": "baxterthehacker@users.noreply.github.com",
+ "username": "baxterthehacker"
+ },
+ "committer": {
+ "name": "baxterthehacker",
+ "email": "baxterthehacker@users.noreply.github.com",
+ "username": "baxterthehacker"
+ },
+ "added": [
+
+ ],
+ "removed": [
+
+ ],
+ "modified": [
+ "README.md"
+ ]
+ }
+ ],
+ "head_commit": {
+ "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c",
+ "distinct": true,
+ "message": "Update README.md",
+ "timestamp": "2015-05-05T19:40:15-04:00",
+ "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c",
+ "author": {
+ "name": "baxterthehacker",
+ "email": "baxterthehacker@users.noreply.github.com",
+ "username": "baxterthehacker"
+ },
+ "committer": {
+ "name": "baxterthehacker",
+ "email": "baxterthehacker@users.noreply.github.com",
+ "username": "baxterthehacker"
+ },
+ "added": [
+
+ ],
+ "removed": [
+
+ ],
+ "modified": [
+ "README.md"
+ ]
+ },
+ "repository": {
+ "id": 35129377,
+ "name": "public-repo",
+ "full_name": "baxterthehacker/public-repo",
+ "owner": {
+ "name": "baxterthehacker",
+ "email": "baxterthehacker@users.noreply.github.com"
+ },
+ "private": false,
+ "html_url": "https://github.com/baxterthehacker/public-repo",
+ "description": "",
+ "fork": false,
+ "url": "https://github.com/baxterthehacker/public-repo",
+ "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks",
+ "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}",
+ "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}",
+ "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams",
+ "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks",
+ "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}",
+ "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events",
+ "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}",
+ "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}",
+ "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags",
+ "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}",
+ "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}",
+ "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}",
+ "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}",
+ "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages",
+ "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers",
+ "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors",
+ "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers",
+ "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription",
+ "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}",
+ "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}",
+ "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}",
+ "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}",
+ "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}",
+ "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}",
+ "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges",
+ "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}",
+ "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads",
+ "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}",
+ "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}",
+ "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}",
+ "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}",
+ "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}",
+ "created_at": 1430869212,
+ "updated_at": "2015-05-05T23:40:12Z",
+ "pushed_at": 1430869217,
+ "git_url": "git://github.com/baxterthehacker/public-repo.git",
+ "ssh_url": "git@github.com:baxterthehacker/public-repo.git",
+ "clone_url": "https://github.com/baxterthehacker/public-repo.git",
+ "svn_url": "https://github.com/baxterthehacker/public-repo",
+ "homepage": null,
+ "size": 0,
+ "stargazers_count": 0,
+ "watchers_count": 0,
+ "language": null,
+ "has_issues": true,
+ "has_downloads": true,
+ "has_wiki": true,
+ "has_pages": true,
+ "forks_count": 0,
+ "mirror_url": null,
+ "open_issues_count": 0,
+ "forks": 0,
+ "open_issues": 0,
+ "watchers": 0,
+ "default_branch": "master",
+ "stargazers": 0,
+ "master_branch": "master"
+ },
+ "pusher": {
+ "name": "baxterthehacker",
+ "email": "baxterthehacker@users.noreply.github.com"
+ },
+ "sender": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+}
\ No newline at end of file
diff --git a/tests/data/payloads/GitHubEvents/repository.json b/tests/data/payloads/GitHubEvents/repository.json
new file mode 100644
--- /dev/null
+++ b/tests/data/payloads/GitHubEvents/repository.json
@@ -0,0 +1,119 @@
+{
+ "action": "created",
+ "repository": {
+ "id": 27496774,
+ "name": "new-repository",
+ "full_name": "baxterandthehackers/new-repository",
+ "owner": {
+ "login": "baxterandthehackers",
+ "id": 7649605,
+ "avatar_url": "https://avatars.githubusercontent.com/u/7649605?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterandthehackers",
+ "html_url": "https://github.com/baxterandthehackers",
+ "followers_url": "https://api.github.com/users/baxterandthehackers/followers",
+ "following_url": "https://api.github.com/users/baxterandthehackers/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterandthehackers/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterandthehackers/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterandthehackers/orgs",
+ "repos_url": "https://api.github.com/users/baxterandthehackers/repos",
+ "events_url": "https://api.github.com/users/baxterandthehackers/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterandthehackers/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "private": true,
+ "html_url": "https://github.com/baxterandthehackers/new-repository",
+ "description": "",
+ "fork": false,
+ "url": "https://api.github.com/repos/baxterandthehackers/new-repository",
+ "forks_url": "https://api.github.com/repos/baxterandthehackers/new-repository/forks",
+ "keys_url": "https://api.github.com/repos/baxterandthehackers/new-repository/keys{/key_id}",
+ "collaborators_url": "https://api.github.com/repos/baxterandthehackers/new-repository/collaborators{/collaborator}",
+ "teams_url": "https://api.github.com/repos/baxterandthehackers/new-repository/teams",
+ "hooks_url": "https://api.github.com/repos/baxterandthehackers/new-repository/hooks",
+ "issue_events_url": "https://api.github.com/repos/baxterandthehackers/new-repository/issues/events{/number}",
+ "events_url": "https://api.github.com/repos/baxterandthehackers/new-repository/events",
+ "assignees_url": "https://api.github.com/repos/baxterandthehackers/new-repository/assignees{/user}",
+ "branches_url": "https://api.github.com/repos/baxterandthehackers/new-repository/branches{/branch}",
+ "tags_url": "https://api.github.com/repos/baxterandthehackers/new-repository/tags",
+ "blobs_url": "https://api.github.com/repos/baxterandthehackers/new-repository/git/blobs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/baxterandthehackers/new-repository/git/tags{/sha}",
+ "git_refs_url": "https://api.github.com/repos/baxterandthehackers/new-repository/git/refs{/sha}",
+ "trees_url": "https://api.github.com/repos/baxterandthehackers/new-repository/git/trees{/sha}",
+ "statuses_url": "https://api.github.com/repos/baxterandthehackers/new-repository/statuses/{sha}",
+ "languages_url": "https://api.github.com/repos/baxterandthehackers/new-repository/languages",
+ "stargazers_url": "https://api.github.com/repos/baxterandthehackers/new-repository/stargazers",
+ "contributors_url": "https://api.github.com/repos/baxterandthehackers/new-repository/contributors",
+ "subscribers_url": "https://api.github.com/repos/baxterandthehackers/new-repository/subscribers",
+ "subscription_url": "https://api.github.com/repos/baxterandthehackers/new-repository/subscription",
+ "commits_url": "https://api.github.com/repos/baxterandthehackers/new-repository/commits{/sha}",
+ "git_commits_url": "https://api.github.com/repos/baxterandthehackers/new-repository/git/commits{/sha}",
+ "comments_url": "https://api.github.com/repos/baxterandthehackers/new-repository/comments{/number}",
+ "issue_comment_url": "https://api.github.com/repos/baxterandthehackers/new-repository/issues/comments/{number}",
+ "contents_url": "https://api.github.com/repos/baxterandthehackers/new-repository/contents/{+path}",
+ "compare_url": "https://api.github.com/repos/baxterandthehackers/new-repository/compare/{base}...{head}",
+ "merges_url": "https://api.github.com/repos/baxterandthehackers/new-repository/merges",
+ "archive_url": "https://api.github.com/repos/baxterandthehackers/new-repository/{archive_format}{/ref}",
+ "downloads_url": "https://api.github.com/repos/baxterandthehackers/new-repository/downloads",
+ "issues_url": "https://api.github.com/repos/baxterandthehackers/new-repository/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/baxterandthehackers/new-repository/pulls{/number}",
+ "milestones_url": "https://api.github.com/repos/baxterandthehackers/new-repository/milestones{/number}",
+ "notifications_url": "https://api.github.com/repos/baxterandthehackers/new-repository/notifications{?since,all,participating}",
+ "labels_url": "https://api.github.com/repos/baxterandthehackers/new-repository/labels{/name}",
+ "releases_url": "https://api.github.com/repos/baxterandthehackers/new-repository/releases{/id}",
+ "created_at": "2014-12-03T16:39:25Z",
+ "updated_at": "2014-12-03T16:39:25Z",
+ "pushed_at": "2014-12-03T16:39:25Z",
+ "git_url": "git://github.com/baxterandthehackers/new-repository.git",
+ "ssh_url": "git@github.com:baxterandthehackers/new-repository.git",
+ "clone_url": "https://github.com/baxterandthehackers/new-repository.git",
+ "svn_url": "https://github.com/baxterandthehackers/new-repository",
+ "homepage": null,
+ "size": 0,
+ "stargazers_count": 0,
+ "watchers_count": 0,
+ "language": null,
+ "has_issues": true,
+ "has_downloads": true,
+ "has_wiki": true,
+ "has_pages": false,
+ "forks_count": 0,
+ "mirror_url": null,
+ "open_issues_count": 0,
+ "forks": 0,
+ "open_issues": 0,
+ "watchers": 0,
+ "default_branch": "master"
+ },
+ "organization": {
+ "login": "baxterandthehackers",
+ "id": 7649605,
+ "url": "https://api.github.com/orgs/baxterandthehackers",
+ "repos_url": "https://api.github.com/orgs/baxterandthehackers/repos",
+ "events_url": "https://api.github.com/orgs/baxterandthehackers/events",
+ "members_url": "https://api.github.com/orgs/baxterandthehackers/members{/member}",
+ "public_members_url": "https://api.github.com/orgs/baxterandthehackers/public_members{/member}",
+ "avatar_url": "https://avatars.githubusercontent.com/u/7649605?v=2"
+ },
+ "sender": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=2",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+}
diff --git a/tests/data/payloads/GitHubEvents/status.json b/tests/data/payloads/GitHubEvents/status.json
new file mode 100644
--- /dev/null
+++ b/tests/data/payloads/GitHubEvents/status.json
@@ -0,0 +1,206 @@
+{
+ "id": 214015194,
+ "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b",
+ "name": "baxterthehacker/public-repo",
+ "target_url": null,
+ "context": "default",
+ "description": null,
+ "state": "success",
+ "commit": {
+ "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b",
+ "commit": {
+ "author": {
+ "name": "baxterthehacker",
+ "email": "baxterthehacker@users.noreply.github.com",
+ "date": "2015-05-05T23:40:12Z"
+ },
+ "committer": {
+ "name": "baxterthehacker",
+ "email": "baxterthehacker@users.noreply.github.com",
+ "date": "2015-05-05T23:40:12Z"
+ },
+ "message": "Initial commit",
+ "tree": {
+ "sha": "02b49ad0ba4f1acd9f06531b21e16a4ac5d341d0",
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees/02b49ad0ba4f1acd9f06531b21e16a4ac5d341d0"
+ },
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits/9049f1265b7d61be4a8904a9a27120d2064dab3b",
+ "comment_count": 1
+ },
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo/commits/9049f1265b7d61be4a8904a9a27120d2064dab3b",
+ "html_url": "https://github.com/baxterthehacker/public-repo/commit/9049f1265b7d61be4a8904a9a27120d2064dab3b",
+ "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits/9049f1265b7d61be4a8904a9a27120d2064dab3b/comments",
+ "author": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+
+ ]
+ },
+ "branches": [
+ {
+ "name": "master",
+ "commit": {
+ "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b",
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo/commits/9049f1265b7d61be4a8904a9a27120d2064dab3b"
+ }
+ },
+ {
+ "name": "changes",
+ "commit": {
+ "sha": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c",
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo/commits/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"
+ }
+ },
+ {
+ "name": "gh-pages",
+ "commit": {
+ "sha": "b11bb7545ac14abafc6191a0481b0d961e7793c6",
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo/commits/b11bb7545ac14abafc6191a0481b0d961e7793c6"
+ }
+ }
+ ],
+ "created_at": "2015-05-05T23:40:39Z",
+ "updated_at": "2015-05-05T23:40:39Z",
+ "repository": {
+ "id": 35129377,
+ "name": "public-repo",
+ "full_name": "baxterthehacker/public-repo",
+ "owner": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "private": false,
+ "html_url": "https://github.com/baxterthehacker/public-repo",
+ "description": "",
+ "fork": false,
+ "url": "https://api.github.com/repos/baxterthehacker/public-repo",
+ "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks",
+ "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}",
+ "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}",
+ "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams",
+ "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks",
+ "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}",
+ "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events",
+ "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}",
+ "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}",
+ "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags",
+ "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}",
+ "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}",
+ "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}",
+ "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}",
+ "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages",
+ "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers",
+ "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors",
+ "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers",
+ "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription",
+ "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}",
+ "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}",
+ "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}",
+ "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}",
+ "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}",
+ "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}",
+ "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges",
+ "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}",
+ "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads",
+ "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}",
+ "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}",
+ "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}",
+ "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}",
+ "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}",
+ "created_at": "2015-05-05T23:40:12Z",
+ "updated_at": "2015-05-05T23:40:30Z",
+ "pushed_at": "2015-05-05T23:40:39Z",
+ "git_url": "git://github.com/baxterthehacker/public-repo.git",
+ "ssh_url": "git@github.com:baxterthehacker/public-repo.git",
+ "clone_url": "https://github.com/baxterthehacker/public-repo.git",
+ "svn_url": "https://github.com/baxterthehacker/public-repo",
+ "homepage": null,
+ "size": 0,
+ "stargazers_count": 0,
+ "watchers_count": 0,
+ "language": null,
+ "has_issues": true,
+ "has_downloads": true,
+ "has_wiki": true,
+ "has_pages": true,
+ "forks_count": 0,
+ "mirror_url": null,
+ "open_issues_count": 2,
+ "forks": 0,
+ "open_issues": 2,
+ "watchers": 0,
+ "default_branch": "master"
+ },
+ "sender": {
+ "login": "baxterthehacker",
+ "id": 6752317,
+ "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/baxterthehacker",
+ "html_url": "https://github.com/baxterthehacker",
+ "followers_url": "https://api.github.com/users/baxterthehacker/followers",
+ "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}",
+ "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions",
+ "organizations_url": "https://api.github.com/users/baxterthehacker/orgs",
+ "repos_url": "https://api.github.com/users/baxterthehacker/repos",
+ "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/baxterthehacker/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+}
diff --git a/tests/data/payloads/GitHubPushForceZeroPayload.json b/tests/data/payloads/GitHubPushForceZeroPayload.json
new file mode 100644
--- /dev/null
+++ b/tests/data/payloads/GitHubPushForceZeroPayload.json
@@ -0,0 +1,151 @@
+{
+ "ref": "refs/heads/novolume",
+ "before": "49a7de26af94aa588b7e85725274557001de72bf",
+ "after": "0e511ea84cd54567f0434d5fa7e684b66fc95209",
+ "created": false,
+ "deleted": false,
+ "forced": true,
+ "base_ref": null,
+ "compare": "https://github.com/nasqueron/docker-nginx-php-fpm/compare/49a7de26af94...0e511ea84cd5",
+ "commits": [
+
+ ],
+ "head_commit": {
+ "id": "0e511ea84cd54567f0434d5fa7e684b66fc95209",
+ "distinct": true,
+ "message": "Upgrade PHP to 5.6.18\n\nSummary: PHP 5.6.18 contains security fixes.\n\nTest Plan: `docker build`\n\nReviewers: dereckson\n\nSubscribers: #nasqueron_docker_deployment_squad, Kaliiixx\n\nProjects: #docker_images\n\nDifferential Revision: http://devcentral.nasqueron.org/D270",
+ "timestamp": "2016-02-05T02:56:53Z",
+ "url": "https://github.com/nasqueron/docker-nginx-php-fpm/commit/0e511ea84cd54567f0434d5fa7e684b66fc95209",
+ "author": {
+ "name": "Sébastien Santoro",
+ "email": "dereckson@espace-win.org",
+ "username": "dereckson"
+ },
+ "committer": {
+ "name": "Sébastien Santoro",
+ "email": "dereckson@espace-win.org",
+ "username": "dereckson"
+ },
+ "added": [
+
+ ],
+ "removed": [
+
+ ],
+ "modified": [
+ "Dockerfile"
+ ]
+ },
+ "repository": {
+ "id": 34274010,
+ "name": "docker-nginx-php-fpm",
+ "full_name": "nasqueron/docker-nginx-php-fpm",
+ "owner": {
+ "name": "nasqueron",
+ "email": ""
+ },
+ "private": false,
+ "html_url": "https://github.com/nasqueron/docker-nginx-php-fpm",
+ "description": "Docker image with Debian Jessie, PHP, nginx, php-fpm and runit",
+ "fork": false,
+ "url": "https://github.com/nasqueron/docker-nginx-php-fpm",
+ "forks_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/forks",
+ "keys_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/keys{/key_id}",
+ "collaborators_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/collaborators{/collaborator}",
+ "teams_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/teams",
+ "hooks_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/hooks",
+ "issue_events_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/issues/events{/number}",
+ "events_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/events",
+ "assignees_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/assignees{/user}",
+ "branches_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/branches{/branch}",
+ "tags_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/tags",
+ "blobs_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/git/blobs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/git/tags{/sha}",
+ "git_refs_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/git/refs{/sha}",
+ "trees_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/git/trees{/sha}",
+ "statuses_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/statuses/{sha}",
+ "languages_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/languages",
+ "stargazers_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/stargazers",
+ "contributors_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/contributors",
+ "subscribers_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/subscribers",
+ "subscription_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/subscription",
+ "commits_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/commits{/sha}",
+ "git_commits_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/git/commits{/sha}",
+ "comments_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/comments{/number}",
+ "issue_comment_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/issues/comments{/number}",
+ "contents_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/contents/{+path}",
+ "compare_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/compare/{base}...{head}",
+ "merges_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/merges",
+ "archive_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/{archive_format}{/ref}",
+ "downloads_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/downloads",
+ "issues_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/pulls{/number}",
+ "milestones_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/milestones{/number}",
+ "notifications_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/notifications{?since,all,participating}",
+ "labels_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/labels{/name}",
+ "releases_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/releases{/id}",
+ "deployments_url": "https://api.github.com/repos/nasqueron/docker-nginx-php-fpm/deployments",
+ "created_at": 1429549282,
+ "updated_at": "2016-01-17T01:37:24Z",
+ "pushed_at": 1454641057,
+ "git_url": "git://github.com/nasqueron/docker-nginx-php-fpm.git",
+ "ssh_url": "git@github.com:nasqueron/docker-nginx-php-fpm.git",
+ "clone_url": "https://github.com/nasqueron/docker-nginx-php-fpm.git",
+ "svn_url": "https://github.com/nasqueron/docker-nginx-php-fpm",
+ "homepage": null,
+ "size": 30,
+ "stargazers_count": 2,
+ "watchers_count": 2,
+ "language": "PHP",
+ "has_issues": true,
+ "has_downloads": true,
+ "has_wiki": true,
+ "has_pages": false,
+ "forks_count": 1,
+ "mirror_url": null,
+ "open_issues_count": 0,
+ "forks": 1,
+ "open_issues": 0,
+ "watchers": 2,
+ "default_branch": "master",
+ "stargazers": 2,
+ "master_branch": "master",
+ "organization": "nasqueron"
+ },
+ "pusher": {
+ "name": "dereckson",
+ "email": "dereckson@espace-win.org"
+ },
+ "organization": {
+ "login": "nasqueron",
+ "id": 5605546,
+ "url": "https://api.github.com/orgs/nasqueron",
+ "repos_url": "https://api.github.com/orgs/nasqueron/repos",
+ "events_url": "https://api.github.com/orgs/nasqueron/events",
+ "hooks_url": "https://api.github.com/orgs/nasqueron/hooks",
+ "issues_url": "https://api.github.com/orgs/nasqueron/issues",
+ "members_url": "https://api.github.com/orgs/nasqueron/members{/member}",
+ "public_members_url": "https://api.github.com/orgs/nasqueron/public_members{/member}",
+ "avatar_url": "https://avatars.githubusercontent.com/u/5605546?v=3",
+ "description": "Central hub of a budding community of creative people, writers, developers and thinkers."
+ },
+ "sender": {
+ "login": "dereckson",
+ "id": 135563,
+ "avatar_url": "https://avatars.githubusercontent.com/u/135563?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/dereckson",
+ "html_url": "https://github.com/dereckson",
+ "followers_url": "https://api.github.com/users/dereckson/followers",
+ "following_url": "https://api.github.com/users/dereckson/following{/other_user}",
+ "gists_url": "https://api.github.com/users/dereckson/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/dereckson/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/dereckson/subscriptions",
+ "organizations_url": "https://api.github.com/users/dereckson/orgs",
+ "repos_url": "https://api.github.com/users/dereckson/repos",
+ "events_url": "https://api.github.com/users/dereckson/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/dereckson/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+}
diff --git a/tests/data/payloads/GitHubPushSeveralCommitsPayload.json b/tests/data/payloads/GitHubPushSeveralCommitsPayload.json
new file mode 100644
--- /dev/null
+++ b/tests/data/payloads/GitHubPushSeveralCommitsPayload.json
@@ -0,0 +1,200 @@
+{
+ "ref": "refs/heads/master",
+ "before": "aecf09db97cfc86cb2cb749ef2df35901162fe95",
+ "after": "a0b969672645a87e207fa25191732a42253a3603",
+ "created": false,
+ "deleted": false,
+ "forced": false,
+ "base_ref": null,
+ "compare": "https://github.com/nasqueron/notifications/compare/aecf09db97cf...a0b969672645",
+ "commits": [
+ {
+ "id": "de1c7bf32d714a94a1b4a351837a7817faace11d",
+ "distinct": true,
+ "message": "Tests for GitHubPayloadAnalyzerConfiguration",
+ "timestamp": "2015-12-07T15:45:27Z",
+ "url": "https://github.com/nasqueron/notifications/commit/de1c7bf32d714a94a1b4a351837a7817faace11d",
+ "author": {
+ "name": "Sébastien Santoro",
+ "email": "dereckson@espace-win.org",
+ "username": "dereckson"
+ },
+ "committer": {
+ "name": "Sébastien Santoro",
+ "email": "dereckson@espace-win.org",
+ "username": "dereckson"
+ },
+ "added": [
+ "tests/GitHubPayloadAnalyzerTest.php",
+ "tests/data/GitHubPayloadAnalyzer-Nasqueron.json"
+ ],
+ "removed": [
+
+ ],
+ "modified": [
+
+ ]
+ },
+ {
+ "id": "a0b969672645a87e207fa25191732a42253a3603",
+ "distinct": true,
+ "message": "Tidying and tests for RepositoryGroupMapping::doesRepositoryMatch\n\nLaravel provides a str_is helper function to check 'foo*' pattern,\nwe can so forget fnmatch (? is not really a wanted feature).\n\nAdded test, improved code comment.",
+ "timestamp": "2015-12-07T16:53:18Z",
+ "url": "https://github.com/nasqueron/notifications/commit/a0b969672645a87e207fa25191732a42253a3603",
+ "author": {
+ "name": "Sébastien Santoro",
+ "email": "dereckson@espace-win.org",
+ "username": "dereckson"
+ },
+ "committer": {
+ "name": "Sébastien Santoro",
+ "email": "dereckson@espace-win.org",
+ "username": "dereckson"
+ },
+ "added": [
+ "tests/RepositoryGroupMappingTest.php"
+ ],
+ "removed": [
+
+ ],
+ "modified": [
+ "app/Analyzers/RepositoryGroupMapping.php"
+ ]
+ }
+ ],
+ "head_commit": {
+ "id": "a0b969672645a87e207fa25191732a42253a3603",
+ "distinct": true,
+ "message": "Tidying and tests for RepositoryGroupMapping::doesRepositoryMatch\n\nLaravel provides a str_is helper function to check 'foo*' pattern,\nwe can so forget fnmatch (? is not really a wanted feature).\n\nAdded test, improved code comment.",
+ "timestamp": "2015-12-07T16:53:18Z",
+ "url": "https://github.com/nasqueron/notifications/commit/a0b969672645a87e207fa25191732a42253a3603",
+ "author": {
+ "name": "Sébastien Santoro",
+ "email": "dereckson@espace-win.org",
+ "username": "dereckson"
+ },
+ "committer": {
+ "name": "Sébastien Santoro",
+ "email": "dereckson@espace-win.org",
+ "username": "dereckson"
+ },
+ "added": [
+ "tests/RepositoryGroupMappingTest.php"
+ ],
+ "removed": [
+
+ ],
+ "modified": [
+ "app/Analyzers/RepositoryGroupMapping.php"
+ ]
+ },
+ "repository": {
+ "id": 46330783,
+ "name": "notifications",
+ "full_name": "nasqueron/notifications",
+ "owner": {
+ "name": "nasqueron",
+ "email": ""
+ },
+ "private": false,
+ "html_url": "https://github.com/nasqueron/notifications",
+ "description": "Notifications center",
+ "fork": false,
+ "url": "https://github.com/nasqueron/notifications",
+ "forks_url": "https://api.github.com/repos/nasqueron/notifications/forks",
+ "keys_url": "https://api.github.com/repos/nasqueron/notifications/keys{/key_id}",
+ "collaborators_url": "https://api.github.com/repos/nasqueron/notifications/collaborators{/collaborator}",
+ "teams_url": "https://api.github.com/repos/nasqueron/notifications/teams",
+ "hooks_url": "https://api.github.com/repos/nasqueron/notifications/hooks",
+ "issue_events_url": "https://api.github.com/repos/nasqueron/notifications/issues/events{/number}",
+ "events_url": "https://api.github.com/repos/nasqueron/notifications/events",
+ "assignees_url": "https://api.github.com/repos/nasqueron/notifications/assignees{/user}",
+ "branches_url": "https://api.github.com/repos/nasqueron/notifications/branches{/branch}",
+ "tags_url": "https://api.github.com/repos/nasqueron/notifications/tags",
+ "blobs_url": "https://api.github.com/repos/nasqueron/notifications/git/blobs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/nasqueron/notifications/git/tags{/sha}",
+ "git_refs_url": "https://api.github.com/repos/nasqueron/notifications/git/refs{/sha}",
+ "trees_url": "https://api.github.com/repos/nasqueron/notifications/git/trees{/sha}",
+ "statuses_url": "https://api.github.com/repos/nasqueron/notifications/statuses/{sha}",
+ "languages_url": "https://api.github.com/repos/nasqueron/notifications/languages",
+ "stargazers_url": "https://api.github.com/repos/nasqueron/notifications/stargazers",
+ "contributors_url": "https://api.github.com/repos/nasqueron/notifications/contributors",
+ "subscribers_url": "https://api.github.com/repos/nasqueron/notifications/subscribers",
+ "subscription_url": "https://api.github.com/repos/nasqueron/notifications/subscription",
+ "commits_url": "https://api.github.com/repos/nasqueron/notifications/commits{/sha}",
+ "git_commits_url": "https://api.github.com/repos/nasqueron/notifications/git/commits{/sha}",
+ "comments_url": "https://api.github.com/repos/nasqueron/notifications/comments{/number}",
+ "issue_comment_url": "https://api.github.com/repos/nasqueron/notifications/issues/comments{/number}",
+ "contents_url": "https://api.github.com/repos/nasqueron/notifications/contents/{+path}",
+ "compare_url": "https://api.github.com/repos/nasqueron/notifications/compare/{base}...{head}",
+ "merges_url": "https://api.github.com/repos/nasqueron/notifications/merges",
+ "archive_url": "https://api.github.com/repos/nasqueron/notifications/{archive_format}{/ref}",
+ "downloads_url": "https://api.github.com/repos/nasqueron/notifications/downloads",
+ "issues_url": "https://api.github.com/repos/nasqueron/notifications/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/nasqueron/notifications/pulls{/number}",
+ "milestones_url": "https://api.github.com/repos/nasqueron/notifications/milestones{/number}",
+ "notifications_url": "https://api.github.com/repos/nasqueron/notifications/notifications{?since,all,participating}",
+ "labels_url": "https://api.github.com/repos/nasqueron/notifications/labels{/name}",
+ "releases_url": "https://api.github.com/repos/nasqueron/notifications/releases{/id}",
+ "created_at": 1447745790,
+ "updated_at": "2015-12-03T12:46:43Z",
+ "pushed_at": 1449507450,
+ "git_url": "git://github.com/nasqueron/notifications.git",
+ "ssh_url": "git@github.com:nasqueron/notifications.git",
+ "clone_url": "https://github.com/nasqueron/notifications.git",
+ "svn_url": "https://github.com/nasqueron/notifications",
+ "homepage": "",
+ "size": 88,
+ "stargazers_count": 0,
+ "watchers_count": 0,
+ "language": "PHP",
+ "has_issues": true,
+ "has_downloads": true,
+ "has_wiki": false,
+ "has_pages": false,
+ "forks_count": 0,
+ "mirror_url": null,
+ "open_issues_count": 0,
+ "forks": 0,
+ "open_issues": 0,
+ "watchers": 0,
+ "default_branch": "master",
+ "stargazers": 0,
+ "master_branch": "master",
+ "organization": "nasqueron"
+ },
+ "pusher": {
+ "name": "dereckson",
+ "email": "dereckson@espace-win.org"
+ },
+ "organization": {
+ "login": "nasqueron",
+ "id": 5605546,
+ "url": "https://api.github.com/orgs/nasqueron",
+ "repos_url": "https://api.github.com/orgs/nasqueron/repos",
+ "events_url": "https://api.github.com/orgs/nasqueron/events",
+ "members_url": "https://api.github.com/orgs/nasqueron/members{/member}",
+ "public_members_url": "https://api.github.com/orgs/nasqueron/public_members{/member}",
+ "avatar_url": "https://avatars.githubusercontent.com/u/5605546?v=3",
+ "description": "Central hub of a budding community of creative people, writers, developers and thinkers."
+ },
+ "sender": {
+ "login": "dereckson",
+ "id": 135563,
+ "avatar_url": "https://avatars.githubusercontent.com/u/135563?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/dereckson",
+ "html_url": "https://github.com/dereckson",
+ "followers_url": "https://api.github.com/users/dereckson/followers",
+ "following_url": "https://api.github.com/users/dereckson/following{/other_user}",
+ "gists_url": "https://api.github.com/users/dereckson/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/dereckson/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/dereckson/subscriptions",
+ "organizations_url": "https://api.github.com/users/dereckson/orgs",
+ "repos_url": "https://api.github.com/users/dereckson/repos",
+ "events_url": "https://api.github.com/users/dereckson/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/dereckson/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+}

File Metadata

Mime Type
text/plain
Expires
Sat, Dec 21, 14:09 (18 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2309552
Default Alt Text
D274.diff (116 KB)

Event Timeline