Skip to content

Commit

Permalink
Added readonly codetables
Browse files Browse the repository at this point in the history
  • Loading branch information
bdgregg committed May 26, 2021
1 parent 0cab0b1 commit 8831605
Show file tree
Hide file tree
Showing 8 changed files with 349 additions and 0 deletions.
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ If the package doesn't fit your needs, you might take a look at the alternative
* [Listing jobs](#listing-jobs)
* [Retrieving information about a specific job](#retrieving-information-about-a-specific-job)
* [Submitting a job](#submitting-a-job)
* [Code Tables](#code-tables)
* [Getting a single code table](#getting-a-codetable)
* [Automatic retries on errors](#automatic-retries-on-errors)
* [Laravel integration](#laravel-integration)
* [Customizing the HTTP client stack](#customizing-the-http-client-stack)
Expand Down Expand Up @@ -578,6 +580,20 @@ $job = $alma->jobs['M43'];
$instance = $alma->jobs['M43']->submit();
```

## Code Tables

### Getting a Code Table

To fetch a code table

```php
$ct = $alma->codetables->get('systemJobStatus');
echo "Rows for ".$ct->sub_system->value."'s ".$ct->name."\n";
foreach ($ct->row as $row) {
echo "code: ".$row->code.", description: ".$row->description."\n";
}
```

## Automatic retries on errors

If the client receives a 429 (rate limiting) response from Alma, it will sleep for a short time (0.5 seconds by default)
Expand Down
47 changes: 47 additions & 0 deletions spec/Conf/CodeTableSpec.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace spec\Scriptotek\Alma\CodeTable;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Scriptotek\Alma\Conf\CodeTable;
use Scriptotek\Alma\Conf\CodeTables;
use Scriptotek\Alma\Client as AlmaClient;
use Scriptotek\Alma\Exception\ResourceNotFound;
use spec\Scriptotek\Alma\SpecHelper;

class CodeTableSpec extends ObjectBehavior
{
public function let(AlmaClient $client)
{
$this->beConstructedWith($client, 'systemJobStatus');
}

protected function expectRequest($client)
{
$client->getXML('/conf/code-table/systemJobStatus')
->shouldBeCalled()
->willReturn(SpecHelper::getDummyData('codetable_response.json'));
}

public function it_is_lazy(AlmaClient $client)
{
SpecHelper::expectNoRequests($client);
$this->shouldHaveType(CodeTable::class);
}

public function it_fetches_record_data_when_needed(AlmaClient $client)
{
$this->expectRequest($client);

$this->name->('systemJobStatus');
$this->subSystem->value->shouldBe('INFRA');
}

public function it_can_exist(AlmaClient $client)
{
$this->expectRequest($client);

$this->exists()->shouldBe(true);
}
}
40 changes: 40 additions & 0 deletions spec/Conf/CodeTablesSpec.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace spec\Scriptotek\Alma\CodeTables;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Scriptotek\Alma\Conf\CodeTable;
use Scriptotek\Alma\Client as AlmaClient;
use spec\Scriptotek\Alma\SpecHelper;

class CodeTablesSpec extends ObjectBehavior
{
public function let(AlmaClient $client)
{
$this->beConstructedWith($client);
}

public function it_provides_a_lazy_interface_to_codetable_objects(AlmaClient $client)
{
SpecHelper::expectNoRequests($client);

$ctid = 'myCodeTable'; // str_random();
$bib = $this->get($ctid);

$bib->shouldHaveType(CodeTable::class);
$bib->code->shouldBe($ctid);
}

public function it_provides_a_lazy_array_interface_to_codetable_objects(AlmaClient $client)
{
SpecHelper::expectNoRequests($client);

$ctid = 'myCodeTable'; // str_random();
$ct = $this[$ctid];

$ct->shouldHaveType(CodeTable::class);
$ct->code->shouldBe($ctid);
}

}
109 changes: 109 additions & 0 deletions spec/data/codetable_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
{
"name": "systemJobStatus",
"description": "System Job Status",
"sub_system": {
"value": "INFRA",
"desc": "Infra"
},
"patron_facing": true,
"language": {
"value": "en",
"desc": "English"
},
"scope": {
"institution_id": {
"value": "01MY_INST",
"desc": "My Institution"
},
"library_id": {
"value": "",
"desc": ""
}
},
"row": [
{
"code": "QUEUED",
"description": "Queued",
"default": false,
"enabled": true
},
{
"code": "PENDING",
"description": "Pending",
"default": false,
"enabled": true
},
{
"code": "INITIALIZING",
"description": "Initializing",
"default": false,
"enabled": true
},
{
"code": "RUNNING",
"description": "Running",
"default": false,
"enabled": true
},
{
"code": "MANUAL_HANDLING_REQUIRED",
"description": "Manual Handling Required",
"default": false,
"enabled": true
},
{
"code": "FINALIZING",
"description": "Finalizing",
"default": false,
"enabled": true
},
{
"code": "COMPLETED_SUCCESS",
"description": "Completed Successfully",
"default": false,
"enabled": true
},
{
"code": "COMPLETED_NO_BULKS",
"description": "Completed with no Bulks",
"default": false,
"enabled": true
},
{
"code": "COMPLETED_FAILED",
"description": "Completed with Errors",
"default": false,
"enabled": true
},
{
"code": "FAILED",
"description": "Failed",
"default": false,
"enabled": true
},
{
"code": "COMPLETED_WARNING",
"description": "Completed with Warnings",
"default": false,
"enabled": true
},
{
"code": "USER_ABORTED",
"description": "Aborted by User",
"default": false,
"enabled": true
},
{
"code": "SYSTEM_ABORTED",
"description": "Aborted by System",
"default": false,
"enabled": true
},
{
"code": "SKIPPED",
"description": "Skipped",
"default": false,
"enabled": true
}
]
}
7 changes: 7 additions & 0 deletions src/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
use Scriptotek\Alma\Conf\Jobs;
use Scriptotek\Alma\Conf\Libraries;
use Scriptotek\Alma\Conf\Library;
use Scriptotek\Alma\Conf\CodeTables;
use Scriptotek\Alma\Exception\ClientException as AlmaClientException;
use Scriptotek\Alma\Exception\InvalidApiKey;
use Scriptotek\Alma\Exception\MaxNumberOfAttemptsExhausted;
Expand Down Expand Up @@ -103,6 +104,11 @@ class Client
*/
public $jobs;

/**
* @var CodeTables
*/
public $codetables;

/**
* @var TaskLists
*/
Expand Down Expand Up @@ -152,6 +158,7 @@ public function __construct(
$this->conf = new Conf($this);
$this->libraries = $this->conf->libraries; // shortcut
$this->jobs = $this->conf->jobs; // shortcut
$this->codetables = $this->conf->codetables; // shortcut

$this->taskLists = new TaskLists($this);

Expand Down
69 changes: 69 additions & 0 deletions src/Conf/CodeTable.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php

namespace Scriptotek\Alma\Conf;

use Scriptotek\Alma\Client;
use Scriptotek\Alma\Model\LazyResource;

/**
* A single CodeTable resource.
*/
class CodeTable extends LazyResource
{
/** @var string */
public $code;

/**
* CodeTable constructor.
*
* @param Client $client
* @param string $code
*/
public function __construct(Client $client, $code)
{
parent::__construct($client);
$this->code = $code;
}

/**
* Return a list of rows referring to the code of the rows in the table.
*
* @param string $code - The code of the row in the Table we want to pull.
*
* @return array $found - The rows in the code table that match the code passed in.
*/
public function getRowByCode($code)
{
$found = array();
$codeTable = json_decode($this->client->get($this->urlBase()));
foreach ($codeTable->row as $row) {
if ($row->code == $code) {
array_push($found,$row);
}
}
return($found);
}

/**
* Check if we have the full representation of our data object.
*
* @param \stdClass $data
*
* @return bool
*/
protected function isInitialized($data)
{
return isset($data->name);
}

/**
* Generate the base URL for this resource.
*
* @return string
*/
protected function urlBase()
{
return "/conf/code-tables/{$this->code}";
}

}
59 changes: 59 additions & 0 deletions src/Conf/CodeTables.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

namespace Scriptotek\Alma\Conf;

use Scriptotek\Alma\Client;
use Scriptotek\Alma\Model\ReadOnlyArrayAccess;

/**
* A non-iterable collection of CodeTable resources
*/
class CodeTables implements \ArrayAccess
{
use ReadOnlyArrayAccess;

protected $client;

/**
* CodeTables constructor.
*
* @param Client $client
*/
public function __construct(Client $client)
{
$this->client = $client;
}

/**
* Get a CodeTable by identifier
*
* @param $code The identifier of a CodeTable
*
* @return CodeTable
*/
public function get($code)
{
return CodeTable::make($this->client, $code);
}

/**
* Return a object containing a list of code tables.
*
* @return CodeTable ojbect list.
*/
public function getCodeTables()
{
return json_decode($this->client->get($this->urlBase()));
}

/**
* Generate the base URL for this resource.
*
* @return string
*/
protected function urlBase()
{
return '/conf/code-tables';
}

}
Loading

0 comments on commit 8831605

Please sign in to comment.