JILS-43: Provide JSON Representation of pages



Issue Information

Issue Type: New Feature
 
Priority: Major
Status: Closed

Reported By:
Ben Tasker
Assigned To:
Ben Tasker
Project: Jira Issue Listing Script (JILS)
Resolution: Done (2016-04-29 15:02:18)
Affects Version: 0.1,
Target version: 0.1,

Created: 2016-04-24 18:22:37
Time Spent Working
Estimated:
 
240 minutes
Remaining:
  
20 minutes
Logged:
  
220 minutes


Description
At some point in the near future, I'm intending to make changes to my search infrastructure.

One of the things I want to do, is to make the search bot a little smarter in terms of what's important within a page, and what isn't.

In order to aid with that, I want it to process microdata (being implemented in JILS-17), as well as pulling alternative representations where they are available.

Initially this will essentially be the sort of output you'd expect from a REST API. Once the framework to generate this is in place, it may later expand to add support for JSON-LD


Issue Links

Toggle State Changes

Activity


Although this issue probably provides a driving force for it, it cannot be implemented until the codebase is modularised (JILS-5).

Queries need to be separated from page rendering so that the data can be extracted from the database, and then returned in the appropriate format.
btasker added '0.1' to Fix Version
As this and JILS-5 involve some pretty major changes to the codebase, I've moved the project to using versions. Initial development of the changes will be in a dedicated branch, ultimately being merged back into master once tested/working

Repo: Jira-Issue-Listing
Commit: 054ffe885cbe9c007346bb435dbbf48ca3d68224
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 19:07:09 2016 +0100
Commit Message: PoC for JILS-43, generated JSON representation for project listing. Also started splitting structure (see JILS-5)



Added (+)
-------
queries/projects.php
templates/html/projects.php
templates/json/projects.php


Removed (-)
-------
projects.php


Modified (-)(+)
-------
index.php
utils.class.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit

Before moving onto creating a JSON representation for project listing pages, I'm going to tweak the basic structure of the json object first, so that multiple alternate formats can be specified (opening the door for introduction of JSON-LD or similar later).

Currently the structure is
$projresponse->Name = 'ProjectsList';
$projresponse->self = new stdClass();
$projresponse->self->url = 'index.json';
$projresponse->self->alturl = 'index.html';
$projresponse->items = array();


I'm going to start by tweaking to essentially be
$projresponse = new stdClass();
$projresponse->Name = 'ProjectsList';
$projresponse->self = new stdClass();
$projresponse->self->href = 'index.json';
$projresponse->self->alternate = array();
$projresponse->self->alternate[0] = new StdClass();
$projresponse->self->alternate[0]->type = 'text/html';
$projresponse->self->alternate[0]->href = 'index.html';
$projresponse->items = array();
Seems to work reasonably well
ben@milleniumfalcon:~$ curl -q -H "X-PROJECT-LIMIT: JILS,DNSCHAT" https://jiralistdev.bentasker.co.uk/index.json 2> /dev/null | python -m json.tool 
{
    "Name": "ProjectsList",
    "items": [
        {
            "Class": "Project",
            "Description": "<p>DNS Chat isn't intended to be a useful utility - it's an intellectual exercise to prove the concept</p>\r\n\r\n<p>The main point being that no matter how much interception the Government inflicts on it's populace, there will always be simple clandestine methods of communicating - it is in essence a response to claims such as those made by David Cameron following the Paris Attacks - <a href=\"http://www.bbc.co.uk/news/uk-politics-30778424\" target=_blank>(\"There should be no means of communication which we cannot read\")</a> - a massive invasion of privacy in order to achieve an unattainable goal</p>\r\n<p>Suggestions for features, comments on issue can be mailed in to <i>dnschat</i> <b>AT</b> <i>bentasker.co.uk</i> (to comment on an issue, include the issue reference in your subject line)</p>",
            "Key": "DNSCHAT",
            "Name": "DNS Chat",
            "alternate": [
                {
                    "href": "/browse/DNSCHAT.html",
                    "type": "text/html"
                }
            ],
            "url": "/browse/DNSCHAT.json"
        },
        {
            "Class": "Project",
            "Description": "A simple script to generate HTML pages containing JIRA Issues, although the main aim of the codebase has changed since the original implementation.\r\n<br /><br />\r\nDocumentation for the original Implementation can be found at <a href=\"http://www.bentasker.co.uk/documentation/development-programming/273-allowing-your-internal-search-engine-to-index-jira-issues\" target=_blank>http://www.bentasker.co.uk/documentation/development-programming/273-allowing-your-internal-search-engine-to-index-jira-issues</a>\r\n<br /><br />\r\n<b>Codebase:</b> Hosted on <a href=\"https://github.com/bentasker/Jira-Issue-Listing\" target=_blank>GitHub</a>\r\n<br /><br />\r\n<br /><br />\r\nIssues can be raised by emailing <i>jils <b>AT</b> bentasker.co.uk</i>. To comment on an existing issue, include it's issue key in the subject line.",
            "Key": "JILS",
            "Name": "Jira Issue Listing Script",
            "alternate": [
                {
                    "href": "/browse/JILS.html",
                    "type": "text/html"
                }
            ],
            "url": "/browse/JILS.json"
        }
    ],
    "self": {
        "alternate": [
            {
                "href": "/index.html",
                "type": "text/html"
            }
        ],
        "href": "/index.json",
        "type": "application/json"
    }
}


One thing that needs thinking about, is how the rewrites are going to work when using a mirror script. If that representation were dumped onto projects.bentasker.co.uk, the leading slash would lead to 404's (as the mirror lives in a subdirectory). So, we probably want to take X-SITEMAP-BASE into account
Commit 88a1b3d implements honouring of X-SITEMAP-BASE if present
ben@milleniumfalcon:~$ curl -q -H "X-SITEMAP-BASE: http://example.invalid/bar" -H "X-PROJECT-LIMIT: JILS,DNSCHAT" https://jiralistdev.bentasker.co.uk/index.json 2> /dev/null | python -m json.tool 
{
    "Name": "ProjectsList",
    "items": [
        {
            "Class": "Project",
            "Description": "<p>DNS Chat isn't intended to be a useful utility - it's an intellectual exercise to prove the concept</p>\r\n\r\n<p>The main point being that no matter how much interception the Government inflicts on it's populace, there will always be simple clandestine methods of communicating - it is in essence a response to claims such as those made by David Cameron following the Paris Attacks - <a href=\"http://www.bbc.co.uk/news/uk-politics-30778424\" target=_blank>(\"There should be no means of communication which we cannot read\")</a> - a massive invasion of privacy in order to achieve an unattainable goal</p>\r\n<p>Suggestions for features, comments on issue can be mailed in to <i>dnschat</i> <b>AT</b> <i>bentasker.co.uk</i> (to comment on an issue, include the issue reference in your subject line)</p>",
            "Key": "DNSCHAT",
            "Name": "DNS Chat",
            "alternate": [
                {
                    "href": "http://example.invalid/bar/browse/DNSCHAT.html",
                    "type": "text/html"
                }
            ],
            "url": "http://example.invalid/bar/browse/DNSCHAT.json"
        },
        {
            "Class": "Project",
            "Description": "A simple script to generate HTML pages containing JIRA Issues, although the main aim of the codebase has changed since the original implementation.\r\n<br /><br />\r\nDocumentation for the original Implementation can be found at <a href=\"http://www.bentasker.co.uk/documentation/development-programming/273-allowing-your-internal-search-engine-to-index-jira-issues\" target=_blank>http://www.bentasker.co.uk/documentation/development-programming/273-allowing-your-internal-search-engine-to-index-jira-issues</a>\r\n<br /><br />\r\n<b>Codebase:</b> Hosted on <a href=\"https://github.com/bentasker/Jira-Issue-Listing\" target=_blank>GitHub</a>\r\n<br /><br />\r\n<br /><br />\r\nIssues can be raised by emailing <i>jils <b>AT</b> bentasker.co.uk</i>. To comment on an existing issue, include it's issue key in the subject line.",
            "Key": "JILS",
            "Name": "Jira Issue Listing Script",
            "alternate": [
                {
                    "href": "http://example.invalid/bar/browse/JILS.html",
                    "type": "text/html"
                }
            ],
            "url": "http://example.invalid/bar/browse/JILS.json"
        }
    ],
    "self": {
        "alternate": [
            {
                "href": "http://example.invalid/bar/index.html",
                "type": "text/html"
            }
        ],
        "href": "http://example.invalid/bar/index.json",
        "type": "application/json"
    }
}

Repo: Jira-Issue-Listing
Commit: 46bf60cd3d6b61bd6a0e0c8b0275344b28a402f1
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 19:29:57 2016 +0100
Commit Message: Tweaking JSON layout. See JILS-43



Modified (-)(+)
-------
templates/json/projects.php
utils.class.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit


Repo: Jira-Issue-Listing
Commit: 88a1b3df3a634625889ab86ae70f7f6265c8d1ab
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 19:33:24 2016 +0100
Commit Message: X-SITEMAP-BASE is now honoured, if present. See JILS-43



Modified (-)(+)
-------
templates/json/projects.php
utils.class.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit


Repo: Jira-Issue-Listing
Commit: fe081fd1bcdebc605ace73e7d18643b412eb4438
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 19:35:13 2016 +0100
Commit Message: Adjusted property name for consistency. JILS-43



Modified (-)(+)
-------
templates/json/projects.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit

OK, I think structure wise, we're about ready to move onto creating a JSON representation of a project listing.

Repo: Jira-Issue-Listing
Commit: 5b3a7f845ef37b30463841fc638710c3c07a377f
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 19:59:24 2016 +0100
Commit Message: Started implementing JSON version for project indexes. See JILS-43



Added (+)
-------
queries/project-index.php
templates/html/project-index.php
templates/json/issues-table.php
templates/json/project-index.php


Removed (-)
-------
project-index.php


Modified (-)(+)
-------
index.php
utils.class.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit

Basic implementation is in place:
ben@milleniumfalcon:~$ curl -q -H "X-PROJECT-LIMIT: JILS,DNSCHAT" https://jiralistdev.bentasker.co.uk/browse/DNSCHAT.json 2> /dev/null | python -m json.tool 
{
    "Class": "Project",
    "Description": "<p>DNS Chat isn't intended to be a useful utility - it's an intellectual exercise to prove the concept</p>\r\n\r\n<p>The main point being that no matter how much interception the Government inflicts on it's populace, there will always be simple clandestine methods of communicating - it is in essence a response to claims such as those made by David Cameron following the Paris Attacks - <a href=\"http://www.bbc.co.uk/news/uk-politics-30778424\" target=_blank>(\"There should be no means of communication which we cannot read\")</a> - a massive invasion of privacy in order to achieve an unattainable goal</p>\r\n<p>Suggestions for features, comments on issue can be mailed in to <i>dnschat</i> <b>AT</b> <i>bentasker.co.uk</i> (to comment on an issue, include the issue reference in your subject line)</p>",
    "Key": "DNSCHAT",
    "Name": "DNS Chat",
    "components": [],
    "issues": [
        {
            "Class": "Issue",
            "Created": 1420789609,
            "IssueType": "Task",
            "Key": "DNSCHAT-1",
            "Name": "Write-up High Level Design",
            "Priority": "Major",
            "Resolution": "Done",
            "Status": "Closed",
            "alternate": [
                {
                    "href": "/browse/DNSCHAT-1.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "/browse/DNSCHAT-1.json",
            "type": "application/json"
        },
        {
            "Class": "Issue",
            "Created": 1421278096,
            "IssueType": "Task",
            "Key": "DNSCHAT-2",
            "Name": "Build Proof of Concept",
            "Priority": "Major",
            "Resolution": "Done",
            "Status": "Closed",
            "alternate": [
                {
                    "href": "/browse/DNSCHAT-2.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "/browse/DNSCHAT-2.json",
            "type": "application/json"
        },
        {
            "Class": "Issue",
            "Created": 1421343989,
            "IssueType": "Task",
            "Key": "DNSCHAT-3",
            "Name": "Code Tidy",
            "Priority": "Major",
            "Resolution": null,
            "Status": "Open",
            "alternate": [
                {
                    "href": "/browse/DNSCHAT-3.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "/browse/DNSCHAT-3.json",
            "type": "application/json"
        },
        {
            "Class": "Issue",
            "Created": 1421351098,
            "IssueType": "Task",
            "Key": "DNSCHAT-4",
            "Name": "List alternate transport mechanisms",
            "Priority": "Major",
            "Resolution": "Informational Only",
            "Status": "Closed",
            "alternate": [
                {
                    "href": "/browse/DNSCHAT-4.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "/browse/DNSCHAT-4.json",
            "type": "application/json"
        },
        {
            "Class": "Issue",
            "Created": 1426093865,
            "IssueType": "New Feature",
            "Key": "DNSCHAT-5",
            "Name": "Making query strings less identifiable",
            "Priority": "Major",
            "Resolution": null,
            "Status": "Open",
            "alternate": [
                {
                    "href": "/browse/DNSCHAT-5.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "/browse/DNSCHAT-5.json",
            "type": "application/json"
        },
        {
            "Class": "Issue",
            "Created": 1426095153,
            "IssueType": "New Feature",
            "Key": "DNSCHAT-6",
            "Name": "Perfect Forward Secrecy",
            "Priority": "Major",
            "Resolution": null,
            "Status": "Open",
            "alternate": [
                {
                    "href": "/browse/DNSCHAT-6.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "/browse/DNSCHAT-6.json",
            "type": "application/json"
        }
    ],
    "self": {
        "alternate": [
            {
                "href": "/browse/DNSCHAT.html",
                "type": "text/html"
            }
        ],
        "href": "/browse/DNSCHAT.json",
        "type": "application/json"
    }
}


Need to populate with versions/components
btasker changed timespent from '0 minutes' to '60 minutes'
btasker changed status from 'Open' to 'In Progress'
Just as a sanity check, I've run a wget mirror to see whether it follows and retrieves links anchored with rel="alternate". It does, so there should be no need to make any changes to the mirror script.

Repo: Jira-Issue-Listing
Commit: 88aa5cb6a05bbcc007b0977fe42b76fc86f61e03
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 20:30:06 2016 +0100
Commit Message: Added components and versions to project JSON. See JILS-43



Modified (-)(+)
-------
templates/json/project-index.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit


Repo: Jira-Issue-Listing
Commit: f1f18ade6f6f3bb4afab0166fa96202c663f78ec
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 21:00:53 2016 +0100
Commit Message: Implemented JSON for Version pages. See JILS-43



Added (+)
-------
queries/version-issues.php
templates/html/version-issues.php
templates/json/version-issues.php


Removed (-)
-------
version-issues.php


Modified (-)(+)
-------
index.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit

Have now implemented for Version pages
ben@milleniumfalcon:/tmp$ curl -q -H "X-SITEMAP-BASE: http://example.invalid/bar" -H "X-PROJECT-LIMIT: PAS,JILS,DNSCHAT" https://jiralistdev.bentasker.co.uk/browse/versions/PAS-11700.json 2> /dev/null | python -m json.tool

{
    "Archived": null,
    "Class": "ProjectVersion",
    "Description": "Initial proof of concept",
    "Key": "11700",
    "Knownissues": [
        {
            "Class": "Issue",
            "Created": 1448561526,
            "IssueType": "New Feature",
            "Key": "PAS-16",
            "Name": "Browser Fingerprinting",
            "Priority": "Major",
            "Resolution": null,
            "Status": "Open",
            "alternate": [
                {
                    "href": "http://example.invalid/bar/browse/PAS-16.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "http://example.invalid/bar/browse/PAS-16.json",
            "type": "application/json"
        },
        {
            "Class": "Issue",
            "Created": 1448630795,
            "IssueType": "New Feature",
            "Key": "PAS-21",
            "Name": "Correlate Encrypted Traffic against DNS to obtain hostname",
            "Priority": "Major",
            "Resolution": null,
            "Status": "Open",
            "alternate": [
                {
                    "href": "http://example.invalid/bar/browse/PAS-21.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "http://example.invalid/bar/browse/PAS-21.json",
            "type": "application/json"
        }
    ],
    "Name": "0.1",
    "ReleaseDate": false,
    "State": "Un-released",
    "TimeEstimate": "24.42 hours",
    "TimeLogged": "7 hours",
    "issues": [
        {
            "Class": "Issue",
            "Created": 1448183237,
            "IssueType": "Task",
            "Key": "PAS-1",
            "Name": "Create Repo",
            "Priority": "Major",
            "Resolution": "Done",
            "Status": "Closed",
            "alternate": [
                {
                    "href": "http://example.invalid/bar/browse/PAS-1.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "http://example.invalid/bar/browse/PAS-1.json",
            "type": "application/json"
        },
        {
            "Class": "Issue",
            "Created": 1448183425,
            "IssueType": "Bug",
            "Key": "PAS-2",
            "Name": "HTTPS paths are only extracted if a TLS handshake has been observed",
            "Priority": "Major",
            "Resolution": "Fixed",
            "Status": "Closed",
            "alternate": [
                {
                    "href": "http://example.invalid/bar/browse/PAS-2.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "http://example.invalid/bar/browse/PAS-2.json",
            "type": "application/json"
        },
    ],
    "parent": {
        "Class": "Project",
        "alternate": [
            {
                "href": "http://example.invalid/bar/browse/PAS.html",
                "type": "text/html"
            }
        ],
        "href": "http://example.invalid/bar/browse/PAS.json"
    },
    "self": {
        "alternate": [
            {
                "href": "http://example.invalid/bar/browse/versions/PAS-11700.html",
                "type": "text/html"
            }
        ],
        "href": "http://example.invalid/bar/browse/versions/PAS-11700.json",
        "type": "application/json"
    }
}
btasker changed status from 'In Progress' to 'Open'
btasker changed timespent from '60 minutes' to '100 minutes'
Commit a7fe583 implements a JSON representation for component pages

ben@milleniumfalcon:/tmp$ curl -q -H "X-SITEMAP-BASE: http://example.invalid/bar" -H "X-PROJECT-LIMIT: PAS,JILS,DNSCHAT" https://jiralistdev.bentasker.co.uk/browse/components/PAS-11610.json 2> /dev/null | python -m json.tool 
{
    "Class": "ProjectComponent",
    "Description": "DNS related",
    "Key": "11610",
    "Name": "DNS",
    "issues": [
        {
            "Class": "Issue",
            "Created": 1448498400,
            "IssueType": "New Feature",
            "Key": "PAS-13",
            "Name": "Extract DNS Traffic",
            "Priority": "Major",
            "Resolution": null,
            "Status": "Open",
            "alternate": [
                {
                    "href": "http://example.invalid/bar/browse/PAS-13.html",
                    "type": "text/html"
                }
            ],
            "assigneee": "btasker",
            "href": "http://example.invalid/bar/browse/PAS-13.json",
            "type": "application/json"
        }
    ],
    "lead": null,
    "parent": {
        "Class": "Project",
        "alternate": [
            {
                "href": "http://example.invalid/bar/browse/PAS.html",
                "type": "text/html"
            }
        ],
        "href": "http://example.invalid/bar/browse/PAS.json"
    },
    "self": {
        "alternate": [
            {
                "href": "http://example.invalid/bar/browse/components/PAS-11610.html",
                "type": "text/html"
            }
        ],
        "href": "http://example.invalid/bar/browse/components/PAS-11610.json",
        "type": "application/json"
    },
    "url": null
}

Repo: Jira-Issue-Listing
Commit: a7fe58322dc9bd26bde60dd6860cffef8f2c0a65
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 21:25:24 2016 +0100
Commit Message: Implemented JSON representation of Component page. See JILS-43



Added (+)
-------
queries/component-issues.php
templates/html/component-issues.php
templates/json/component-issues.php


Removed (-)
-------
component-issues.php


Modified (-)(+)
-------
index.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit

The next class of page needing a JSON representation then, is the big one - Issue pages.

Repo: Jira-Issue-Listing
Commit: 053a713802babb33cc190a2b7ed5601fb813c520
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 22:00:02 2016 +0100
Commit Message: Seperated Issue page template from queries. See JILS-43



Added (+)
-------
queries/issue_page.php
templates/html/issue_page.php


Removed (-)
-------
issue_page.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit


Repo: Jira-Issue-Listing
Commit: 5c88bf497b01173e91a460696ccfc249c7d06122
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 23:12:33 2016 +0100
Commit Message: Created JSON representation of issue listing. See JILS-43



Added (+)
-------
templates/json/issue_page.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit


Repo: Jira-Issue-Listing
Commit: d4e93ce4785bd73f7fd41b6cd84526dc004d9fd1
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 23:20:16 2016 +0100
Commit Message: Bugfixing alternate tags. See JILS-43



Modified (-)(+)
-------
templates/html/component-issues.php
templates/html/version-issues.php




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit

The implementation is pretty much entirely in place now.

Basic testing has been done, though need to look into creating a client script that attempts to walk the JSON to ensure that it's navigable.
I've added a new subdirectory - examples, containing examples of the schema created in this issue.

Other than that, I think we're done.

Repo: Jira-Issue-Listing
Commit: 1b2a8794e7ea15c6838c14d7347c4c3787e03529
Author: B Tasker <github@<Domain Hidden>>

Date: Sun Apr 24 23:34:22 2016 +0100
Commit Message: Added examples of JSON structure for JILS-43



Added (+)
-------
examples/JSON_Structure/component.json
examples/JSON_Structure/issue.json
examples/JSON_Structure/project.json
examples/JSON_Structure/projectlist.json
examples/JSON_Structure/version.json




Webhook User-Agent

GitHub-Hookshot/cd33156


View Commit

btasker changed timespent from '100 minutes' to '220 minutes'
btasker changed status from 'Open' to 'Resolved'
btasker added 'Done' to resolution
btasker changed status from 'Resolved' to 'Closed'
Re-opening to assign to a version
btasker removed 'Done' from resolution
btasker changed status from 'Closed' to 'Reopened'
Assigning to v0.01b
btasker added '0.01b' to Version
btasker added '0.01b' to Fix Version
btasker removed '0.1' from Fix Version
btasker added '0.1' to Version
btasker removed '0.01b' from Version
btasker added '0.1' to Fix Version
btasker removed '0.01b' from Fix Version
Re-Closing
btasker changed status from 'Reopened' to 'Resolved'
btasker added 'Done' to resolution
btasker changed status from 'Resolved' to 'Closed'

Work log


Ben Tasker
Permalink
2016-04-24 20:05:28

Time Spent: 60 minutes
Log Entry: Making a start on implementation

Ben Tasker
Permalink
2016-04-24 21:03:34

Time Spent: 40 minutes
Log Entry: Implementing support for versions

Ben Tasker
Permalink
2016-04-24 23:36:13

Time Spent: 120 minutes
Log Entry: Building and testing JSON representation of Issue pages