mirror of
https://github.com/ilri/dspace-statistics-api.git
synced 2025-05-10 15:16:02 +02:00
Compare commits
131 Commits
80a11ead97
...
v1.4.4
Author | SHA1 | Date | |
---|---|---|---|
f3421e595c
|
|||
6cf8ca0245
|
|||
14c6e5f8dc
|
|||
4c32aeb915
|
|||
34a1a08893
|
|||
c47bb2aba7
|
|||
a7fd70bf10
|
|||
45dfe7851f | |||
c1cd0a0351 | |||
1912363899 | |||
cd3c024a77 | |||
e96c79bf2c | |||
d6330c7bd4 | |||
8c7a5c4047 | |||
a31c592fab | |||
c7b179f1b5 | |||
77c166c024 | |||
7680b0f440
|
|||
e70a7a9675
|
|||
24f90df13e
|
|||
780f2c1723
|
|||
53b58d4116 | |||
19a6d2cea6 | |||
6c2bcda16f | |||
e4d9545b02 | |||
1f507d3074 | |||
82771d7b0c | |||
5ff3323f88 | |||
c7a871c2f1 | |||
b948283d40 | |||
124a05dcaf | |||
a2daf96fec | |||
8634d53fa6 | |||
e2bfcef573 | |||
d64c4b8cbc | |||
3d91366412 | |||
c3a4e2260b | |||
10519997ac | |||
4d7e9e9401 | |||
fe9f98bcc0
|
|||
70f0d66c6e
|
|||
913596c61d
|
|||
7cd762a5a2 | |||
3811be18ef | |||
a52818271c | |||
b643f60dd7 | |||
7cec9a9545 | |||
a9302506b6 | |||
b980602a03
|
|||
a4b4843036
|
|||
7e334f6de8
|
|||
770f676fb5
|
|||
6d5e3c350d
|
|||
531136183b
|
|||
1a3d0350a5
|
|||
25c4f05f16
|
|||
9fba8d1b81
|
|||
568ced0f20
|
|||
9cd93c9034 | |||
83a2625987 | |||
f591ed7162 | |||
bb0f267941
|
|||
0720605b6a
|
|||
bcb97d025c
|
|||
0ff8490275
|
|||
0a8ac60ade
|
|||
37527c21be
|
|||
eb660f8085
|
|||
e7d780f511
|
|||
c3b9a541b7
|
|||
1a1a14a25f
|
|||
c09fc789e8
|
|||
134a4f1595
|
|||
12ebd1aed5
|
|||
e5f3201b65
|
|||
c1ce4fe233
|
|||
b2eb1878a5
|
|||
a0213c1c97
|
|||
cd03ca2b36
|
|||
c48e6a79c7
|
|||
a2e1695ecc
|
|||
b683bf211c
|
|||
3ab48743d6
|
|||
88173eaae9
|
|||
f557d33f36
|
|||
ffc4ff4a5c
|
|||
7551b34632
|
|||
5e71ec10eb
|
|||
f80d360cf9
|
|||
e70b59ecfe
|
|||
4d0828b6c0
|
|||
dabc4c0259
|
|||
4fd8af07c3
|
|||
4c5326a176
|
|||
3b1ccafab4
|
|||
58b5ae82d3
|
|||
562aaeef7d
|
|||
5cdba6acb1
|
|||
dd0937179c
|
|||
f0c6c004db
|
|||
6843f0a8ac
|
|||
f5fcfcc05a
|
|||
e8ac74b6d1
|
|||
14fc14daee
|
|||
871aae537a
|
|||
2fada6c6ff
|
|||
ef0991e352
|
|||
4502d6053c
|
|||
a524068cf6
|
|||
964d5dff06
|
|||
a9252d1771
|
|||
a63687d516
|
|||
73dc3a292e
|
|||
1e742bad41
|
|||
164008981e
|
|||
dd1769b954
|
|||
b009820fb4
|
|||
9830295978
|
|||
c93a4d7455
|
|||
2f8e4f8a0a | |||
0650c5985e
|
|||
d814f1c4f0
|
|||
00f30591c4
|
|||
acfe87b91a
|
|||
bc6d84dda2 | |||
889fb2f74a
|
|||
c42cd7a818
|
|||
f8bba59d66
|
|||
b8cb752a29
|
|||
09496aa2b5
|
|||
ff5dc7506d
|
21
.build.yml
21
.build.yml
@ -1,21 +0,0 @@
|
|||||||
image: archlinux
|
|
||||||
packages:
|
|
||||||
- python-poetry
|
|
||||||
- postgresql
|
|
||||||
sources:
|
|
||||||
- https://git.sr.ht/~alanorth/dspace-statistics-api
|
|
||||||
tasks:
|
|
||||||
- setup: |
|
|
||||||
id
|
|
||||||
psql --version
|
|
||||||
sudo su - postgres -c "initdb --locale en_US.UTF-8 -E UTF8 -D '/var/lib/postgres/data'"
|
|
||||||
sudo systemctl start postgresql
|
|
||||||
createuser -U postgres dspacestatistics
|
|
||||||
psql -U postgres -c "ALTER USER dspacestatistics WITH PASSWORD 'dspacestatistics'"
|
|
||||||
createdb -U postgres -O dspacestatistics --encoding=UNICODE dspacestatistics
|
|
||||||
cd dspace-statistics-api
|
|
||||||
psql -U postgres -d dspacestatistics < tests/dspacestatistics.sql
|
|
||||||
poetry install --no-root
|
|
||||||
- test: |
|
|
||||||
cd dspace-statistics-api
|
|
||||||
poetry run pytest
|
|
156
.drone.yml
156
.drone.yml
@ -1,156 +0,0 @@
|
|||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: python39
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: setup
|
|
||||||
image: postgres:10-alpine
|
|
||||||
environment:
|
|
||||||
PGPASSWORD: postgres
|
|
||||||
commands:
|
|
||||||
- id
|
|
||||||
- psql --version
|
|
||||||
- sleep 5
|
|
||||||
- pg_isready -h database -U postgres -d dspacestatistics
|
|
||||||
- createuser -h database -U postgres dspacestatistics
|
|
||||||
- psql -h database -U postgres -c "ALTER USER dspacestatistics WITH PASSWORD 'dspacestatistics'"
|
|
||||||
- psql -h database -U postgres -d dspacestatistics < tests/dspacestatistics.sql
|
|
||||||
|
|
||||||
- name: test
|
|
||||||
image: python:3.9-slim
|
|
||||||
environment:
|
|
||||||
PGPASSWORD: dspacestatistics
|
|
||||||
DATABASE_HOST: database
|
|
||||||
commands:
|
|
||||||
- id
|
|
||||||
- python -V
|
|
||||||
- apt update && apt install -y gcc git
|
|
||||||
- pip install -r requirements-dev.txt
|
|
||||||
- pytest
|
|
||||||
|
|
||||||
services:
|
|
||||||
- name: database
|
|
||||||
image: postgres:10-alpine
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_DB: dspacestatistics
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: python38
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: database
|
|
||||||
image: postgres:10-alpine
|
|
||||||
detach: true
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_DB: dspacestatistics
|
|
||||||
|
|
||||||
- name: setup
|
|
||||||
image: postgres:10-alpine
|
|
||||||
environment:
|
|
||||||
PGPASSWORD: postgres
|
|
||||||
commands:
|
|
||||||
- id
|
|
||||||
- psql --version
|
|
||||||
- sleep 5
|
|
||||||
- pg_isready -h database -U postgres -d dspacestatistics
|
|
||||||
- createuser -h database -U postgres dspacestatistics
|
|
||||||
- psql -h database -U postgres -c "ALTER USER dspacestatistics WITH PASSWORD 'dspacestatistics'"
|
|
||||||
- psql -h database -U postgres -d dspacestatistics < tests/dspacestatistics.sql
|
|
||||||
|
|
||||||
- name: test
|
|
||||||
image: python:3.8-slim
|
|
||||||
environment:
|
|
||||||
PGPASSWORD: dspacestatistics
|
|
||||||
DATABASE_HOST: database
|
|
||||||
commands:
|
|
||||||
- id
|
|
||||||
- python -V
|
|
||||||
- apt update && apt install -y git
|
|
||||||
- pip install -r requirements-dev.txt
|
|
||||||
- pytest
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: python37
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: database
|
|
||||||
image: postgres:10-alpine
|
|
||||||
detach: true
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_DB: dspacestatistics
|
|
||||||
|
|
||||||
- name: setup
|
|
||||||
image: postgres:10-alpine
|
|
||||||
environment:
|
|
||||||
PGPASSWORD: postgres
|
|
||||||
commands:
|
|
||||||
- id
|
|
||||||
- psql --version
|
|
||||||
- sleep 5
|
|
||||||
- pg_isready -h database -U postgres -d dspacestatistics
|
|
||||||
- createuser -h database -U postgres dspacestatistics
|
|
||||||
- psql -h database -U postgres -c "ALTER USER dspacestatistics WITH PASSWORD 'dspacestatistics'"
|
|
||||||
- psql -h database -U postgres -d dspacestatistics < tests/dspacestatistics.sql
|
|
||||||
|
|
||||||
- name: test
|
|
||||||
image: python:3.7-slim
|
|
||||||
environment:
|
|
||||||
PGPASSWORD: dspacestatistics
|
|
||||||
DATABASE_HOST: database
|
|
||||||
commands:
|
|
||||||
- id
|
|
||||||
- python -V
|
|
||||||
- apt update && apt install -y git
|
|
||||||
- pip install -r requirements-dev.txt
|
|
||||||
- pytest
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: python36
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: database
|
|
||||||
image: postgres:10-alpine
|
|
||||||
detach: true
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_DB: dspacestatistics
|
|
||||||
|
|
||||||
- name: setup
|
|
||||||
image: postgres:10-alpine
|
|
||||||
environment:
|
|
||||||
PGPASSWORD: postgres
|
|
||||||
commands:
|
|
||||||
- id
|
|
||||||
- psql --version
|
|
||||||
- sleep 5
|
|
||||||
- pg_isready -h database -U postgres -d dspacestatistics
|
|
||||||
- createuser -h database -U postgres dspacestatistics
|
|
||||||
- psql -h database -U postgres -c "ALTER USER dspacestatistics WITH PASSWORD 'dspacestatistics'"
|
|
||||||
- psql -h database -U postgres -d dspacestatistics < tests/dspacestatistics.sql
|
|
||||||
|
|
||||||
- name: test
|
|
||||||
image: python:3.6-slim
|
|
||||||
environment:
|
|
||||||
PGPASSWORD: dspacestatistics
|
|
||||||
DATABASE_HOST: database
|
|
||||||
commands:
|
|
||||||
- id
|
|
||||||
- python -V
|
|
||||||
- apt update && apt install -y git
|
|
||||||
- pip install -r requirements-dev.txt
|
|
||||||
- pytest
|
|
||||||
|
|
||||||
# vim: ts=2 sw=2 et
|
|
58
.github/workflows/python-app.yml
vendored
Normal file
58
.github/workflows/python-app.yml
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# This workflow will install Python dependencies, run tests and lint with a single version of Python
|
||||||
|
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
|
||||||
|
|
||||||
|
name: Build and Test
|
||||||
|
|
||||||
|
on: ['push', 'pull_request']
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
|
services:
|
||||||
|
database:
|
||||||
|
image: postgres:15-alpine
|
||||||
|
env:
|
||||||
|
# password for postgres user in the Docker container
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
# default database to create
|
||||||
|
POSTGRES_DB: dspacestatistics
|
||||||
|
options: >-
|
||||||
|
--health-cmd pg_isready
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
ports:
|
||||||
|
- 5432:5432
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install poetry
|
||||||
|
run: pipx install poetry
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.12'
|
||||||
|
cache: 'poetry'
|
||||||
|
- run: poetry install
|
||||||
|
- name: Lint with flake8
|
||||||
|
run: |
|
||||||
|
# stop the build if there are Python syntax errors or undefined names
|
||||||
|
poetry run flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
|
||||||
|
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
|
||||||
|
poetry run flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
|
||||||
|
- name: Set up PostgreSQL
|
||||||
|
run: |
|
||||||
|
pg_isready -U postgres -d dspacestatistics
|
||||||
|
createuser -U postgres dspacestatistics
|
||||||
|
psql -U postgres -c "ALTER USER dspacestatistics WITH PASSWORD 'dspacestatistics'"
|
||||||
|
psql -U postgres -d dspacestatistics < tests/dspacestatistics.sql
|
||||||
|
env:
|
||||||
|
PGHOST: localhost
|
||||||
|
PGPASSWORD: postgres
|
||||||
|
- name: Test with pytest
|
||||||
|
run: |
|
||||||
|
poetry run pytest
|
||||||
|
env:
|
||||||
|
PGHOST: localhost
|
||||||
|
PGPASSWORD: dspacestatistics
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
__pycache__
|
__pycache__
|
||||||
venv
|
venv
|
||||||
|
*.egg-info
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
flake8:
|
|
||||||
enabled: true
|
|
||||||
config_file: .flake8
|
|
||||||
fail_on_violations: true
|
|
33
CHANGELOG.md
33
CHANGELOG.md
@ -4,6 +4,37 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## 1.4.4 - 2024-09-11
|
||||||
|
### Changed
|
||||||
|
- Update recommended Python version to 3.8+
|
||||||
|
- Use PostgreSQL 15 in CI
|
||||||
|
- Use Python 3.12 in CI
|
||||||
|
|
||||||
|
### Updated
|
||||||
|
- Falcon 3.1.3, a minor change for us, but good to be using a current upstream
|
||||||
|
version
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- Drone CI
|
||||||
|
|
||||||
|
## 1.4.3 - 2022-03-26
|
||||||
|
### Updated
|
||||||
|
- Update dependencies with `poetry update`
|
||||||
|
- Falcon 3.1.0, a minor change for us, but good to be using a current upstream
|
||||||
|
version
|
||||||
|
|
||||||
|
## 1.4.2 - 2021-04-14
|
||||||
|
### Updated
|
||||||
|
- Update dependencies with `poetry update`
|
||||||
|
- Falcon 3.0.0, a minor change for us, but good to be using a current upstream
|
||||||
|
version
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Bug in several of the "valid page" tests
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- GitHub Actions workflow to build and test the API
|
||||||
|
|
||||||
## [1.4.1] - 2021-01-14
|
## [1.4.1] - 2021-01-14
|
||||||
### Changed
|
### Changed
|
||||||
- Limit Solr query to UUIDs to avoid errors with unmigrated legacy stats (https://github.com/ilri/dspace-statistics-api/issues/12)
|
- Limit Solr query to UUIDs to avoid errors with unmigrated legacy stats (https://github.com/ilri/dspace-statistics-api/issues/12)
|
||||||
@ -79,7 +110,7 @@ and gunicorn 20.0.4
|
|||||||
- Minor syntax issues highlighted by flake8
|
- Minor syntax issues highlighted by flake8
|
||||||
|
|
||||||
## [1.1.0] - 2019-05-05
|
## [1.1.0] - 2019-05-05
|
||||||
## Updated
|
### Updated
|
||||||
- Falcon 2.0.0 (@alanorth)
|
- Falcon 2.0.0 (@alanorth)
|
||||||
|
|
||||||
## [1.0.0] - 2019-04-15
|
## [1.0.0] - 2019-04-15
|
||||||
|
11
README.md
11
README.md
@ -1,4 +1,10 @@
|
|||||||
# DSpace Statistics API [](https://ci.mjanja.ch/alanorth/dspace-statistics-api) [](https://builds.sr.ht/~alanorth/dspace-statistics-api?)
|
<h1 align="center">DSpace Statistics API</h1>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/ilri/dspace-statistics-api/actions"><img alt="Build and Test" src="https://github.com/ilri/dspace-statistics-api/actions/workflows/python-app.yml/badge.svg"></a>
|
||||||
|
<a href="https://github.com/psf/black"><img alt="Code style: black" src="https://img.shields.io/badge/code%20style-black-000000.svg"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
DSpace stores item view and download events in a Solr "statistics" core. This information is available for use in the various DSpace user interfaces, but is not exposed externally via any APIs. The DSpace 4/5/6 [REST API](https://wiki.lyrasis.org/display/DSDOC5x/REST+API), for example, only exposes _metadata_ about communities, collections, items, and bitstreams.
|
DSpace stores item view and download events in a Solr "statistics" core. This information is available for use in the various DSpace user interfaces, but is not exposed externally via any APIs. The DSpace 4/5/6 [REST API](https://wiki.lyrasis.org/display/DSDOC5x/REST+API), for example, only exposes _metadata_ about communities, collections, items, and bitstreams.
|
||||||
|
|
||||||
- If your DSpace is version 4 or 5, use [dspace-statistics-api v1.1.1](https://github.com/ilri/dspace-statistics-api/releases/tag/v1.1.1)
|
- If your DSpace is version 4 or 5, use [dspace-statistics-api v1.1.1](https://github.com/ilri/dspace-statistics-api/releases/tag/v1.1.1)
|
||||||
@ -13,7 +19,7 @@ If you use the DSpace Statistics API please cite:
|
|||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- Python 3.6+
|
- Python 3.8+
|
||||||
- PostgreSQL version 9.5+ (due to [`UPSERT` support](https://wiki.postgresql.org/wiki/UPSERT))
|
- PostgreSQL version 9.5+ (due to [`UPSERT` support](https://wiki.postgresql.org/wiki/UPSERT))
|
||||||
- DSpace with [Solr usage statistics enabled](https://wiki.lyrasis.org/display/DSDOC5x/SOLR+Statistics) (tested with 5.8+ and 6.3)
|
- DSpace with [Solr usage statistics enabled](https://wiki.lyrasis.org/display/DSDOC5x/SOLR+Statistics) (tested with 5.8+ and 6.3)
|
||||||
|
|
||||||
@ -120,7 +126,6 @@ The id is the *internal* UUID for an item, community, or collection. You can get
|
|||||||
- Use JSON in PostgreSQL
|
- Use JSON in PostgreSQL
|
||||||
- Add top items endpoint, perhaps `/top/items` or `/items/top`?
|
- Add top items endpoint, perhaps `/top/items` or `/items/top`?
|
||||||
- Actually we could add `/items?limit=10&sort=views`
|
- Actually we could add `/items?limit=10&sort=views`
|
||||||
- Add Swagger with OpenAPI 3.0.x with [falcon-swagger-ui](https://github.com/rdidyk/falcon-swagger-ui)
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
This work is licensed under the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html).
|
This work is licensed under the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html).
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import math
|
import math
|
||||||
|
|
||||||
@ -29,7 +31,7 @@ class RootResource:
|
|||||||
"</html"
|
"</html"
|
||||||
)
|
)
|
||||||
|
|
||||||
resp.body = docs_html
|
resp.text = docs_html
|
||||||
|
|
||||||
|
|
||||||
class StatusResource:
|
class StatusResource:
|
||||||
@ -61,7 +63,7 @@ class OpenAPIJSONResource:
|
|||||||
# Set the version in the schema so Swagger UI can display it
|
# Set the version in the schema so Swagger UI can display it
|
||||||
data["info"]["version"] = VERSION
|
data["info"]["version"] = VERSION
|
||||||
|
|
||||||
resp.body = json.dumps(data)
|
resp.text = json.dumps(data)
|
||||||
|
|
||||||
|
|
||||||
class AllStatisticsResource:
|
class AllStatisticsResource:
|
||||||
@ -88,7 +90,7 @@ class AllStatisticsResource:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# create a list to hold dicts of stats
|
# create a list to hold dicts of stats
|
||||||
statistics = list()
|
statistics = []
|
||||||
|
|
||||||
# iterate over results and build statistics object
|
# iterate over results and build statistics object
|
||||||
for result in cursor:
|
for result in cursor:
|
||||||
@ -160,7 +162,7 @@ class AllStatisticsResource:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# create a list to hold dicts of stats
|
# create a list to hold dicts of stats
|
||||||
statistics = list()
|
statistics = []
|
||||||
|
|
||||||
# iterate over views dict to extract views and use the element id as an
|
# iterate over views dict to extract views and use the element id as an
|
||||||
# index to the downloads dict to extract downloads.
|
# index to the downloads dict to extract downloads.
|
||||||
@ -213,24 +215,24 @@ class SingleStatisticsResource:
|
|||||||
resp.media = statistics
|
resp.media = statistics
|
||||||
|
|
||||||
|
|
||||||
api = application = falcon.API()
|
app = application = falcon.App()
|
||||||
api.add_route("/", RootResource())
|
app.add_route("/", RootResource())
|
||||||
api.add_route("/status", StatusResource())
|
app.add_route("/status", StatusResource())
|
||||||
|
|
||||||
# Item routes
|
# Item routes
|
||||||
api.add_route("/items", AllStatisticsResource())
|
app.add_route("/items", AllStatisticsResource())
|
||||||
api.add_route("/item/{id_:uuid}", SingleStatisticsResource())
|
app.add_route("/item/{id_:uuid}", SingleStatisticsResource())
|
||||||
|
|
||||||
# Community routes
|
# Community routes
|
||||||
api.add_route("/communities", AllStatisticsResource())
|
app.add_route("/communities", AllStatisticsResource())
|
||||||
api.add_route("/community/{id_:uuid}", SingleStatisticsResource())
|
app.add_route("/community/{id_:uuid}", SingleStatisticsResource())
|
||||||
|
|
||||||
# Collection routes
|
# Collection routes
|
||||||
api.add_route("/collections", AllStatisticsResource())
|
app.add_route("/collections", AllStatisticsResource())
|
||||||
api.add_route("/collection/{id_:uuid}", SingleStatisticsResource())
|
app.add_route("/collection/{id_:uuid}", SingleStatisticsResource())
|
||||||
|
|
||||||
# Route to the Swagger UI OpenAPI schema
|
# Route to the Swagger UI Openapp schema
|
||||||
api.add_route("/docs/openapi.json", OpenAPIJSONResource())
|
app.add_route("/docs/openapi.json", OpenAPIJSONResource())
|
||||||
|
|
||||||
# Path to host the Swagger UI. Keep in mind that Falcon will add a route for
|
# Path to host the Swagger UI. Keep in mind that Falcon will add a route for
|
||||||
# this automatically when we register Swagger and the path will be relative
|
# this automatically when we register Swagger and the path will be relative
|
||||||
@ -240,12 +242,12 @@ SWAGGERUI_PATH = "/swagger"
|
|||||||
# The *absolute* path to the OpenJSON schema. This must be absolute because
|
# The *absolute* path to the OpenJSON schema. This must be absolute because
|
||||||
# it will be requested by the client and must resolve absolutely. Note: the
|
# it will be requested by the client and must resolve absolutely. Note: the
|
||||||
# name of this variable is misleading because it is actually the schema URL
|
# name of this variable is misleading because it is actually the schema URL
|
||||||
# but we pass it into the register_swaggerui_app() function as the api_url
|
# but we pass it into the register_swaggerui_app() function as the app_url
|
||||||
# parameter.
|
# parameter.
|
||||||
SWAGGERUI_API_URL = f"{DSPACE_STATISTICS_API_URL}/docs/openapi.json"
|
SWAGGERUI_API_URL = f"{DSPACE_STATISTICS_API_URL}/docs/openapi.json"
|
||||||
|
|
||||||
register_swaggerui_app(
|
register_swaggerui_app(
|
||||||
api,
|
app,
|
||||||
SWAGGERUI_PATH,
|
SWAGGERUI_PATH,
|
||||||
SWAGGERUI_API_URL,
|
SWAGGERUI_API_URL,
|
||||||
config={
|
config={
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
# Check if Solr connection information was provided in the environment
|
# Check if Solr connection information was provided in the environment
|
||||||
@ -16,6 +18,6 @@ DATABASE_PORT = os.environ.get("DATABASE_PORT", "5432")
|
|||||||
# the vanilla DSpace REST API.
|
# the vanilla DSpace REST API.
|
||||||
DSPACE_STATISTICS_API_URL = os.environ.get("DSPACE_STATISTICS_API_URL", "")
|
DSPACE_STATISTICS_API_URL = os.environ.get("DSPACE_STATISTICS_API_URL", "")
|
||||||
|
|
||||||
VERSION = "1.4.1"
|
VERSION = "1.4.4"
|
||||||
|
|
||||||
# vim: set sw=4 ts=4 expandtab:
|
# vim: set sw=4 ts=4 expandtab:
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
import falcon
|
import falcon
|
||||||
import psycopg2
|
import psycopg2
|
||||||
import psycopg2.extras
|
import psycopg2.extras
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"openapi": "3.0.3",
|
"openapi": "3.0.3",
|
||||||
"info": {
|
"info": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.4",
|
||||||
"title": "DSpace Statistics API",
|
"title": "DSpace Statistics API",
|
||||||
"description": "A [Falcon-based](https://falcon.readthedocs.io/) web application to make DSpace's item, community, and collection statistics available via a simple REST API. This Swagger interface is powered by [falcon-swagger-ui](https://github.com/rdidyk/falcon-swagger-ui).",
|
"description": "A [Falcon-based](https://falcon.readthedocs.io/) web application to make DSpace's item, community, and collection statistics available via a simple REST API. This Swagger interface is powered by [falcon-swagger-ui](https://github.com/rdidyk/falcon-swagger-ui).",
|
||||||
"license": {
|
"license": {
|
||||||
|
@ -1,23 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
#
|
#
|
||||||
# indexer.py
|
# indexer.py
|
||||||
#
|
#
|
||||||
# Copyright 2018 Alan Orth.
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# ---
|
|
||||||
#
|
|
||||||
# Connects to a DSpace Solr statistics core and ingests views and downloads for
|
# Connects to a DSpace Solr statistics core and ingests views and downloads for
|
||||||
# communities, collections, and items into a PostgreSQL database.
|
# communities, collections, and items into a PostgreSQL database.
|
||||||
#
|
#
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from .config import SOLR_SERVER
|
from .config import SOLR_SERVER
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
@ -60,7 +62,6 @@ def get_statistics_shards():
|
|||||||
|
|
||||||
|
|
||||||
def is_valid_date(date):
|
def is_valid_date(date):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Solr date format is: 2020-01-01T00:00:00Z
|
# Solr date format is: 2020-01-01T00:00:00Z
|
||||||
# See: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
|
# See: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
|
||||||
@ -139,7 +140,7 @@ def validate_post_parameters(req, resp, resource, params):
|
|||||||
description=f'The "{req.context.statistics_scope}" parameter is invalid. The value must be a comma-separated list of UUIDs.',
|
description=f'The "{req.context.statistics_scope}" parameter is invalid. The value must be a comma-separated list of UUIDs.',
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
req.context.elements = list()
|
req.context.elements = []
|
||||||
|
|
||||||
|
|
||||||
def set_statistics_scope(req, resp, resource, params):
|
def set_statistics_scope(req, resp, resource, params):
|
||||||
|
1217
poetry.lock
generated
1217
poetry.lock
generated
File diff suppressed because it is too large
Load Diff
@ -1,25 +1,28 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "dspace-statistics-api"
|
name = "dspace-statistics-api"
|
||||||
version = "1.4.1"
|
version = "1.4.4"
|
||||||
description = "A simple REST API to expose Solr view and download statistics for items, communities, and collections in a DSpace repository."
|
description = "A simple REST API to expose Solr view and download statistics for items, communities, and collections in a DSpace repository."
|
||||||
authors = ["Alan Orth <aorth@mjanja.ch>"]
|
authors = ["Alan Orth <aorth@mjanja.ch>"]
|
||||||
license = "GPL-3.0-only"
|
license = "GPL-3.0-only"
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.6"
|
python = "^3.8.1"
|
||||||
gunicorn = "^20.0.4"
|
gunicorn = "^23.0.0"
|
||||||
falcon = "^2.0.0"
|
falcon = "^3.1.3"
|
||||||
psycopg2-binary = "^2.8.6"
|
psycopg2 = "^2.9.9"
|
||||||
requests = "^2.24.0"
|
requests = "^2.32.3"
|
||||||
falcon-swagger-ui = {git = "https://github.com/alanorth/falcon-swagger-ui.git"}
|
falcon-swagger-ui = {git = "https://github.com/alanorth/falcon-swagger-ui.git", rev="falcon3-update-swagger-ui"}
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.group.dev.dependencies]
|
||||||
ipython = { version = "^7.18.1", python = "^3.7" }
|
black = "^24.0.0"
|
||||||
flake8 = "^3.8.4"
|
flake8 = "^7.1.1"
|
||||||
pytest = "^6.1.1"
|
isort = "^5.13.2"
|
||||||
isort = "^5.5.4"
|
pytest = "^8.3.3"
|
||||||
black = "^20.8b1"
|
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry>=0.12"]
|
requires = ["poetry>=0.12"]
|
||||||
build-backend = "poetry.masonry.api"
|
build-backend = "poetry.masonry.api"
|
||||||
|
|
||||||
|
[tool.isort]
|
||||||
|
profile = "black"
|
||||||
|
line_length=88
|
||||||
|
9
renovate.json
Normal file
9
renovate.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
"extends": [
|
||||||
|
"config:base"
|
||||||
|
],
|
||||||
|
"pip_requirements": {
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
}
|
@ -1,51 +1,29 @@
|
|||||||
appdirs==1.4.4
|
black==24.8.0 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
appnope==0.1.2; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin"
|
certifi==2024.8.30 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
atomicwrites==1.4.0; sys_platform == "win32"
|
charset-normalizer==3.3.2 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
attrs==20.3.0
|
click==8.1.7 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
backcall==0.2.0; python_version >= "3.7" and python_version < "4.0"
|
colorama==0.4.6 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0" and (sys_platform == "win32" or platform_system == "Windows")
|
||||||
black==20.8b1
|
exceptiongroup==1.2.2 ; python_full_version >= "3.8.1" and python_version < "3.11"
|
||||||
certifi==2020.12.5
|
falcon-swagger-ui @ git+https://github.com/alanorth/falcon-swagger-ui.git@c019c270b479c03d9276e20fd95488495b0943f6 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
chardet==4.0.0
|
falcon==3.1.3 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
click==7.1.2
|
flake8==7.1.1 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
colorama==0.4.4; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" or sys_platform == "win32"
|
gunicorn==23.0.0 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
dataclasses==0.6; python_version < "3.7"
|
idna==3.8 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
decorator==4.4.2; python_version >= "3.7" and python_version < "4.0"
|
iniconfig==2.0.0 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
falcon==2.0.0
|
isort==5.13.2 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
-e git+https://github.com/alanorth/falcon-swagger-ui.git@a44244c85dceccfcd249b62fea4ee82a8221e3d2#egg=falcon-swagger-ui
|
jinja2==3.1.4 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
flake8==3.8.4
|
markupsafe==2.1.5 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
gunicorn==20.0.4
|
mccabe==0.7.0 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
idna==2.10
|
mypy-extensions==1.0.0 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
importlib-metadata==3.4.0; python_version < "3.8"
|
packaging==24.1 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
iniconfig==1.1.1
|
pathspec==0.12.1 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
ipython==7.19.0; python_version >= "3.7" and python_version < "4.0"
|
platformdirs==4.3.2 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
ipython-genutils==0.2.0; python_version >= "3.7" and python_version < "4.0"
|
pluggy==1.5.0 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
isort==5.7.0
|
psycopg2==2.9.9 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
jedi==0.18.0; python_version >= "3.7" and python_version < "4.0"
|
pycodestyle==2.12.1 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
jinja2==2.11.2
|
pyflakes==3.2.0 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
markupsafe==1.1.1
|
pytest==8.3.3 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
mccabe==0.6.1
|
requests==2.32.3 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
mypy-extensions==0.4.3
|
tomli==2.0.1 ; python_full_version >= "3.8.1" and python_version < "3.11"
|
||||||
packaging==20.8
|
typing-extensions==4.12.2 ; python_full_version >= "3.8.1" and python_version < "3.11"
|
||||||
parso==0.8.1; python_version >= "3.7" and python_version < "4.0"
|
urllib3==2.2.2 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
pathspec==0.8.1
|
|
||||||
pexpect==4.8.0; python_version >= "3.7" and python_version < "4.0" and sys_platform != "win32"
|
|
||||||
pickleshare==0.7.5; python_version >= "3.7" and python_version < "4.0"
|
|
||||||
pluggy==0.13.1
|
|
||||||
prompt-toolkit==3.0.10; python_version >= "3.7" and python_version < "4.0"
|
|
||||||
psycopg2-binary==2.8.6
|
|
||||||
ptyprocess==0.7.0; python_version >= "3.7" and python_version < "4.0" and sys_platform != "win32"
|
|
||||||
py==1.10.0
|
|
||||||
pycodestyle==2.6.0
|
|
||||||
pyflakes==2.2.0
|
|
||||||
pygments==2.7.4; python_version >= "3.7" and python_version < "4.0"
|
|
||||||
pyparsing==2.4.7
|
|
||||||
pytest==6.2.1
|
|
||||||
regex==2020.11.13
|
|
||||||
requests==2.25.1
|
|
||||||
toml==0.10.2
|
|
||||||
traitlets==5.0.5; python_version >= "3.7" and python_version < "4.0"
|
|
||||||
typed-ast==1.4.2
|
|
||||||
typing-extensions==3.7.4.3
|
|
||||||
urllib3==1.26.2
|
|
||||||
wcwidth==0.2.5; python_version >= "3.7" and python_version < "4.0"
|
|
||||||
zipp==3.4.0; python_version < "3.8"
|
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
certifi==2020.12.5
|
certifi==2024.8.30 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
chardet==4.0.0
|
charset-normalizer==3.3.2 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
falcon==2.0.0
|
falcon-swagger-ui @ git+https://github.com/alanorth/falcon-swagger-ui.git@c019c270b479c03d9276e20fd95488495b0943f6 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
-e git+https://github.com/alanorth/falcon-swagger-ui.git@a44244c85dceccfcd249b62fea4ee82a8221e3d2#egg=falcon-swagger-ui
|
falcon==3.1.3 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
gunicorn==20.0.4
|
gunicorn==23.0.0 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
idna==2.10
|
idna==3.8 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
jinja2==2.11.2
|
jinja2==3.1.4 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
markupsafe==1.1.1
|
markupsafe==2.1.5 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
psycopg2-binary==2.8.6
|
packaging==24.1 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
requests==2.25.1
|
psycopg2==2.9.9 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
urllib3==1.26.2
|
requests==2.32.3 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
|
urllib3==2.2.2 ; python_full_version >= "3.8.1" and python_full_version < "4.0.0"
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
[isort]
|
|
||||||
multi_line_output=3
|
|
||||||
include_trailing_comma=True
|
|
||||||
force_grid_wrap=0
|
|
||||||
use_parentheses=True
|
|
||||||
line_length=88
|
|
@ -1,15 +1,17 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
import json
|
import json
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from falcon import testing
|
from falcon import testing
|
||||||
|
|
||||||
from dspace_statistics_api.app import api
|
from dspace_statistics_api.app import app
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def client():
|
def client():
|
||||||
return testing.TestClient(api)
|
return testing.TestClient(app)
|
||||||
|
|
||||||
|
|
||||||
def test_get_collection(client):
|
def test_get_collection(client):
|
||||||
@ -310,7 +312,7 @@ def test_post_collections_valid_page(client):
|
|||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert response.json["limit"] == 100
|
assert response.json["limit"] == 100
|
||||||
assert response.json["currentPage"] == 0
|
assert response.json["currentPage"] == 0
|
||||||
assert response.json["totalPages"] == 0
|
assert response.json["totalPages"] == 1
|
||||||
assert len(response.json["statistics"]) == 2
|
assert len(response.json["statistics"]) == 2
|
||||||
assert isinstance(response.json["statistics"][0]["views"], int)
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
||||||
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
import json
|
import json
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from falcon import testing
|
from falcon import testing
|
||||||
|
|
||||||
from dspace_statistics_api.app import api
|
from dspace_statistics_api.app import app
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def client():
|
def client():
|
||||||
return testing.TestClient(api)
|
return testing.TestClient(app)
|
||||||
|
|
||||||
|
|
||||||
def test_get_community(client):
|
def test_get_community(client):
|
||||||
@ -310,7 +312,7 @@ def test_post_communities_valid_page(client):
|
|||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert response.json["limit"] == 100
|
assert response.json["limit"] == 100
|
||||||
assert response.json["currentPage"] == 0
|
assert response.json["currentPage"] == 0
|
||||||
assert response.json["totalPages"] == 0
|
assert response.json["totalPages"] == 1
|
||||||
assert len(response.json["statistics"]) == 2
|
assert len(response.json["statistics"]) == 2
|
||||||
assert isinstance(response.json["statistics"][0]["views"], int)
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
||||||
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from falcon import testing
|
from falcon import testing
|
||||||
|
|
||||||
from dspace_statistics_api.app import api
|
from dspace_statistics_api.app import app
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def client():
|
def client():
|
||||||
return testing.TestClient(api)
|
return testing.TestClient(app)
|
||||||
|
|
||||||
|
|
||||||
def test_get_docs(client):
|
def test_get_docs(client):
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
import json
|
import json
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from falcon import testing
|
from falcon import testing
|
||||||
|
|
||||||
from dspace_statistics_api.app import api
|
from dspace_statistics_api.app import app
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def client():
|
def client():
|
||||||
return testing.TestClient(api)
|
return testing.TestClient(app)
|
||||||
|
|
||||||
|
|
||||||
def test_get_item(client):
|
def test_get_item(client):
|
||||||
@ -310,7 +312,7 @@ def test_post_items_valid_page(client):
|
|||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert response.json["limit"] == 100
|
assert response.json["limit"] == 100
|
||||||
assert response.json["currentPage"] == 0
|
assert response.json["currentPage"] == 0
|
||||||
assert response.json["totalPages"] == 0
|
assert response.json["totalPages"] == 1
|
||||||
assert len(response.json["statistics"]) == 2
|
assert len(response.json["statistics"]) == 2
|
||||||
assert isinstance(response.json["statistics"][0]["views"], int)
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
||||||
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
||||||
|
Reference in New Issue
Block a user