mirror of
				https://github.com/ilri/dspace-statistics-api.git
				synced 2025-10-29 11:51:16 +01:00 
			
		
		
		
	Compare commits
	
		
			41 Commits
		
	
	
		
			v1.4.0
			...
			f0c6c004db
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | |||
| 80a11ead97 | |||
| a282c95933 | |||
| fd7cc36306 | |||
| a20ff09570 | |||
| fdc0e73088 | |||
| b15afc9f39 | |||
| 2bc18ef719 | |||
| 49751b53f0 | |||
| d1c177e146 | 
							
								
								
									
										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 | ||||
| @@ -24,7 +24,7 @@ steps: | ||||
|   commands: | ||||
|   - id | ||||
|   - python -V | ||||
|   - apt update && apt install -y gcc | ||||
|   - apt update && apt install -y gcc git | ||||
|   - pip install -r requirements-dev.txt | ||||
|   - pytest | ||||
|  | ||||
| @@ -71,6 +71,7 @@ steps: | ||||
|   commands: | ||||
|   - id | ||||
|   - python -V | ||||
|   - apt update && apt install -y git | ||||
|   - pip install -r requirements-dev.txt | ||||
|   - pytest | ||||
|  | ||||
| @@ -109,6 +110,7 @@ steps: | ||||
|   commands: | ||||
|   - id | ||||
|   - python -V | ||||
|   - apt update && apt install -y git | ||||
|   - pip install -r requirements-dev.txt | ||||
|   - pytest | ||||
|  | ||||
| @@ -147,6 +149,7 @@ steps: | ||||
|   commands: | ||||
|   - id | ||||
|   - python -V | ||||
|   - apt update && apt install -y git | ||||
|   - pip install -r requirements-dev.txt | ||||
|   - pytest | ||||
|  | ||||
|   | ||||
							
								
								
									
										61
									
								
								.github/workflows/python-app.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								.github/workflows/python-app.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| # 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-latest | ||||
|  | ||||
|     services: | ||||
|       database: | ||||
|         image: postgres:10-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@v2 | ||||
|     - name: Set up Python 3.9 | ||||
|       uses: actions/setup-python@v2 | ||||
|       with: | ||||
|         python-version: 3.9 | ||||
|     - name: Install dependencies | ||||
|       run: | | ||||
|         python -m pip install --upgrade pip | ||||
|         pip install flake8 pytest | ||||
|         if [ -f requirements.txt ]; then pip install -r requirements.txt; fi | ||||
|         if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi | ||||
|     - name: Lint with flake8 | ||||
|       run: | | ||||
|         # stop the build if there are Python syntax errors or undefined names | ||||
|         flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics | ||||
|         # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide | ||||
|         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: | | ||||
|         pytest | ||||
|       env: | ||||
|         PGHOST: localhost | ||||
|         PGPASSWORD: dspacestatistics | ||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +1,3 @@ | ||||
| __pycache__ | ||||
| venv | ||||
| *.egg-info | ||||
|   | ||||
							
								
								
									
										23
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -4,6 +4,25 @@ 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/), | ||||
| and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). | ||||
|  | ||||
| ## 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 | ||||
| ### Changed | ||||
| - Limit Solr query to UUIDs to avoid errors with unmigrated legacy stats (https://github.com/ilri/dspace-statistics-api/issues/12) | ||||
|  | ||||
| ### Updated | ||||
| - Dev dependencies | ||||
|  | ||||
| ## [1.4.0] - 2020-12-27 | ||||
| ### Added | ||||
| - indexer.py now indexes views and downloads for communities and collections | ||||
| @@ -72,7 +91,7 @@ and gunicorn 20.0.4 | ||||
| - Minor syntax issues highlighted by flake8 | ||||
|  | ||||
| ## [1.1.0] - 2019-05-05 | ||||
| ## Updated | ||||
| ### Updated | ||||
| - Falcon 2.0.0 (@alanorth) | ||||
|  | ||||
| ## [1.0.0] - 2019-04-15 | ||||
| @@ -90,7 +109,7 @@ and gunicorn 20.0.4 | ||||
| ## [0.9.0] - 2019-01-22 | ||||
| ### Updated | ||||
| - pytest version 4.0.0 | ||||
| - Fix indexing of sharded statistics cores ([#10)) | ||||
| - Fix indexing of sharded statistics cores (#10) | ||||
| - Handle case of missing views/downloads gracefully | ||||
|  | ||||
| ## [0.8.1] - 2018-11-14 | ||||
|   | ||||
| @@ -1,8 +1,9 @@ | ||||
| # DSpace Statistics API [](https://ci.mjanja.ch/alanorth/dspace-statistics-api) [](https://builds.sr.ht/~alanorth/dspace-statistics-api?) | ||||
| # DSpace Statistics API [](https://ci.mjanja.ch/alanorth/dspace-statistics-api) [](https://github.com/ilri/dspace-statistics-api/actions/workflows/python-app.yml) | ||||
| 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 6+, use [dspace-statistics-api v1.2.0 or greater](https://github.com/ilri/dspace-statistics-api/releases/tag/v1.2.0) | ||||
|   - Please make sure your statistics have been migrated from integers to UUIDs with the [solr-upgrade-statistics-6x](https://wiki.lyrasis.org/display/DSDOC6x/SOLR+Statistics+Maintenance) command | ||||
|  | ||||
| This project contains an indexer and a [Falcon-based](https://falcon.readthedocs.io/) web application to make the item, community, and collection statistics available via a simple REST API. You can read more about the Solr queries used to gather the item view and download statistics on the [DSpace wiki](https://wiki.lyrasis.org/display/DSPACE/Solr). | ||||
|  | ||||
| @@ -119,7 +120,6 @@ The id is the *internal* UUID for an item, community, or collection. You can get | ||||
| - Use JSON in PostgreSQL | ||||
| - Add top items endpoint, perhaps `/top/items` or `/items/top`? | ||||
|   - 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 | ||||
| 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 math | ||||
|  | ||||
| @@ -29,7 +31,7 @@ class RootResource: | ||||
|             "</html" | ||||
|         ) | ||||
|  | ||||
|         resp.body = docs_html | ||||
|         resp.text = docs_html | ||||
|  | ||||
|  | ||||
| class StatusResource: | ||||
| @@ -61,7 +63,7 @@ class OpenAPIJSONResource: | ||||
|             # Set the version in the schema so Swagger UI can display it | ||||
|             data["info"]["version"] = VERSION | ||||
|  | ||||
|             resp.body = json.dumps(data) | ||||
|             resp.text = json.dumps(data) | ||||
|  | ||||
|  | ||||
| class AllStatisticsResource: | ||||
| @@ -213,24 +215,24 @@ class SingleStatisticsResource: | ||||
|                     resp.media = statistics | ||||
|  | ||||
|  | ||||
| api = application = falcon.API() | ||||
| api.add_route("/", RootResource()) | ||||
| api.add_route("/status", StatusResource()) | ||||
| app = application = falcon.App() | ||||
| app.add_route("/", RootResource()) | ||||
| app.add_route("/status", StatusResource()) | ||||
|  | ||||
| # Item routes | ||||
| api.add_route("/items", AllStatisticsResource()) | ||||
| api.add_route("/item/{id_:uuid}", SingleStatisticsResource()) | ||||
| app.add_route("/items", AllStatisticsResource()) | ||||
| app.add_route("/item/{id_:uuid}", SingleStatisticsResource()) | ||||
|  | ||||
| # Community routes | ||||
| api.add_route("/communities", AllStatisticsResource()) | ||||
| api.add_route("/community/{id_:uuid}", SingleStatisticsResource()) | ||||
| app.add_route("/communities", AllStatisticsResource()) | ||||
| app.add_route("/community/{id_:uuid}", SingleStatisticsResource()) | ||||
|  | ||||
| # Collection routes | ||||
| api.add_route("/collections", AllStatisticsResource()) | ||||
| api.add_route("/collection/{id_:uuid}", SingleStatisticsResource()) | ||||
| app.add_route("/collections", AllStatisticsResource()) | ||||
| app.add_route("/collection/{id_:uuid}", SingleStatisticsResource()) | ||||
|  | ||||
| # Route to the Swagger UI OpenAPI schema | ||||
| api.add_route("/docs/openapi.json", OpenAPIJSONResource()) | ||||
| # Route to the Swagger UI Openapp schema | ||||
| app.add_route("/docs/openapi.json", OpenAPIJSONResource()) | ||||
|  | ||||
| # 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 | ||||
| @@ -240,12 +242,12 @@ SWAGGERUI_PATH = "/swagger" | ||||
| # 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 | ||||
| # 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. | ||||
| SWAGGERUI_API_URL = f"{DSPACE_STATISTICS_API_URL}/docs/openapi.json" | ||||
|  | ||||
| register_swaggerui_app( | ||||
|     api, | ||||
|     app, | ||||
|     SWAGGERUI_PATH, | ||||
|     SWAGGERUI_API_URL, | ||||
|     config={ | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| # SPDX-License-Identifier: GPL-3.0-only | ||||
|  | ||||
| import os | ||||
|  | ||||
| # 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. | ||||
| DSPACE_STATISTICS_API_URL = os.environ.get("DSPACE_STATISTICS_API_URL", "") | ||||
|  | ||||
| VERSION = "1.4.0" | ||||
| VERSION = "1.4.3-dev" | ||||
|  | ||||
| # vim: set sw=4 ts=4 expandtab: | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| # SPDX-License-Identifier: GPL-3.0-only | ||||
|  | ||||
| import falcon | ||||
| import psycopg2 | ||||
| import psycopg2.extras | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| { | ||||
|   "openapi": "3.0.3", | ||||
|   "info": { | ||||
|     "version": "1.4.0", | ||||
|     "version": "1.4.3-dev", | ||||
|     "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).", | ||||
|     "license": { | ||||
| @@ -613,4 +613,4 @@ | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -1,23 +1,7 @@ | ||||
| # SPDX-License-Identifier: GPL-3.0-only | ||||
| # | ||||
| # 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 | ||||
| # communities, collections, and items into a PostgreSQL database. | ||||
| # | ||||
| @@ -47,7 +31,7 @@ def index_views(indexType: str, facetField: str): | ||||
|     # | ||||
|     # see: https://lucene.apache.org/solr/guide/6_6/the-stats-component.html | ||||
|     solr_query_params = { | ||||
|         "q": "type:2", | ||||
|         "q": f"type:2 AND {facetField}:/.{{36}}/", | ||||
|         "fq": "-isBot:true AND statistics_type:view", | ||||
|         "fl": facetField, | ||||
|         "facet": "true", | ||||
| @@ -94,7 +78,7 @@ def index_views(indexType: str, facetField: str): | ||||
|                 ) | ||||
|  | ||||
|                 solr_query_params = { | ||||
|                     "q": "type:2", | ||||
|                     "q": f"type:2 AND {facetField}:/.{{36}}/", | ||||
|                     "fq": "-isBot:true AND statistics_type:view", | ||||
|                     "fl": facetField, | ||||
|                     "facet": "true", | ||||
| @@ -130,7 +114,7 @@ def index_views(indexType: str, facetField: str): | ||||
| def index_downloads(indexType: str, facetField: str): | ||||
|     # get the total number of distinct facets for items with at least 1 download | ||||
|     solr_query_params = { | ||||
|         "q": "type:0", | ||||
|         "q": f"type:0 AND {facetField}:/.{{36}}/", | ||||
|         "fq": "-isBot:true AND statistics_type:view AND bundleName:ORIGINAL", | ||||
|         "fl": facetField, | ||||
|         "facet": "true", | ||||
| @@ -176,7 +160,7 @@ def index_downloads(indexType: str, facetField: str): | ||||
|                 ) | ||||
|  | ||||
|                 solr_query_params = { | ||||
|                     "q": "type:0", | ||||
|                     "q": f"type:0 AND {facetField}:/.{{36}}/", | ||||
|                     "fq": "-isBot:true AND statistics_type:view AND bundleName:ORIGINAL", | ||||
|                     "fl": facetField, | ||||
|                     "facet": "true", | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| # SPDX-License-Identifier: GPL-3.0-only | ||||
|  | ||||
| import requests | ||||
|  | ||||
| from .config import SOLR_SERVER | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| # SPDX-License-Identifier: GPL-3.0-only | ||||
|  | ||||
| import datetime | ||||
| import json | ||||
| import re | ||||
|   | ||||
							
								
								
									
										677
									
								
								poetry.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										677
									
								
								poetry.lock
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,6 +1,6 @@ | ||||
| [tool.poetry] | ||||
| name = "dspace-statistics-api" | ||||
| version = "1.4.0" | ||||
| version = "1.4.3-dev" | ||||
| 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>"] | ||||
| license = "GPL-3.0-only" | ||||
| @@ -8,17 +8,17 @@ license = "GPL-3.0-only" | ||||
| [tool.poetry.dependencies] | ||||
| python = "^3.6" | ||||
| gunicorn = "^20.0.4" | ||||
| falcon = "^2.0.0" | ||||
| psycopg2-binary = "^2.8.6" | ||||
| falcon = "3.0.0" | ||||
| psycopg2 = "^2.9.1" | ||||
| requests = "^2.24.0" | ||||
| 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="falcon-300b1"} | ||||
|  | ||||
| [tool.poetry.dev-dependencies] | ||||
| ipython = { version = "^7.18.1", python = "^3.7" } | ||||
| flake8 = "^3.8.4" | ||||
| pytest = "^6.1.1" | ||||
| isort = "^5.5.4" | ||||
| black = "^20.8b1" | ||||
| black = {version = "^21.6b0", python = ">=3.6.2"} | ||||
| isort = {version = "^5.9.1", python = ">=3.6.1"} | ||||
|  | ||||
| [build-system] | ||||
| requires = ["poetry>=0.12"] | ||||
|   | ||||
| @@ -1,51 +1,52 @@ | ||||
| appdirs==1.4.4 | ||||
| appdirs==1.4.4; python_full_version >= "3.6.2" and python_version >= "3.6.2" | ||||
| appnope==0.1.2; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin" | ||||
| atomicwrites==1.4.0; sys_platform == "win32" | ||||
| attrs==20.3.0 | ||||
| atomicwrites==1.4.0; python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.4.0" | ||||
| attrs==21.2.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" | ||||
| backcall==0.2.0; python_version >= "3.7" and python_version < "4.0" | ||||
| black==20.8b1 | ||||
| certifi==2020.12.5 | ||||
| chardet==4.0.0 | ||||
| click==7.1.2 | ||||
| colorama==0.4.4; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" or sys_platform == "win32" | ||||
| dataclasses==0.6; python_version < "3.7" | ||||
| decorator==4.4.2; python_version >= "3.7" and python_version < "4.0" | ||||
| falcon==2.0.0 | ||||
| -e git+https://github.com/alanorth/falcon-swagger-ui.git@a44244c85dceccfcd249b62fea4ee82a8221e3d2#egg=falcon-swagger-ui | ||||
| flake8==3.8.4 | ||||
| gunicorn==20.0.4 | ||||
| idna==2.10 | ||||
| importlib-metadata==3.3.0; python_version < "3.8" | ||||
| iniconfig==1.1.1 | ||||
| ipython==7.19.0; python_version >= "3.7" and python_version < "4.0" | ||||
| black==21.6b0; python_version >= "3.6.2" | ||||
| certifi==2021.5.30; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" | ||||
| chardet==4.0.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" | ||||
| click==8.0.1; python_full_version >= "3.6.2" and python_version >= "3.6.2" | ||||
| colorama==0.4.4; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" and python_full_version >= "3.6.2" and platform_system == "Windows" | ||||
| dataclasses==0.8; python_version >= "3.6.2" and python_version < "3.7" and python_full_version >= "3.6.2" | ||||
| decorator==5.0.9; python_version >= "3.7" and python_version < "4.0" | ||||
| falcon-swagger-ui @ git+https://github.com/alanorth/falcon-swagger-ui.git@falcon-300b1 | ||||
| falcon==3.0.0; python_version >= "3.5" | ||||
| flake8==3.9.2; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") | ||||
| gunicorn==20.1.0; python_version >= "3.5" | ||||
| idna==2.10; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" | ||||
| importlib-metadata==4.6.1; python_full_version >= "3.6.2" and python_version < "3.8" and python_version >= "3.6.2" | ||||
| iniconfig==1.1.1; python_version >= "3.6" | ||||
| ipython-genutils==0.2.0; python_version >= "3.7" and python_version < "4.0" | ||||
| isort==5.6.4 | ||||
| jedi==0.17.2; python_version >= "3.7" and python_version < "4.0" | ||||
| jinja2==2.11.2 | ||||
| markupsafe==1.1.1 | ||||
| mccabe==0.6.1 | ||||
| mypy-extensions==0.4.3 | ||||
| packaging==20.8 | ||||
| parso==0.7.1; python_version >= "3.7" and python_version < "4.0" | ||||
| pathspec==0.8.1 | ||||
| ipython==7.25.0; python_version >= "3.7" and python_version < "4.0" | ||||
| isort==5.9.1; python_version >= "3.6.1" | ||||
| jedi==0.18.0; python_version >= "3.7" and python_version < "4.0" | ||||
| jinja2==3.0.1; python_version >= "3.6" | ||||
| markupsafe==2.0.1; python_version >= "3.6" | ||||
| matplotlib-inline==0.1.2; python_version >= "3.7" and python_version < "4.0" | ||||
| mccabe==0.6.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" | ||||
| mypy-extensions==0.4.3; python_full_version >= "3.6.2" and python_version >= "3.6.2" | ||||
| packaging==21.0; python_version >= "3.6" | ||||
| parso==0.8.2; python_version >= "3.7" and python_version < "4.0" | ||||
| pathspec==0.8.1; python_full_version >= "3.6.2" and python_version >= "3.6.2" | ||||
| 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.8; python_version >= "3.7" and python_version < "4.0" | ||||
| psycopg2-binary==2.8.6 | ||||
| ptyprocess==0.6.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.3; 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 | ||||
| pluggy==0.13.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" | ||||
| prompt-toolkit==3.0.19; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.6.1" | ||||
| psycopg2==2.9.1; python_version >= "3.6" | ||||
| ptyprocess==0.7.0; python_version >= "3.7" and python_version < "4.0" and sys_platform != "win32" | ||||
| py==1.10.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" | ||||
| pycodestyle==2.7.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" | ||||
| pyflakes==2.3.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" | ||||
| pygments==2.9.0; python_version >= "3.7" and python_version < "4.0" | ||||
| pyparsing==2.4.7; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" | ||||
| pytest==6.2.4; python_version >= "3.6" | ||||
| regex==2021.7.6; python_full_version >= "3.6.2" and python_version >= "3.6.2" | ||||
| requests==2.25.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") | ||||
| toml==0.10.2; python_full_version >= "3.6.2" and python_version >= "3.6.2" | ||||
| traitlets==5.0.5; python_version >= "3.7" and python_version < "4.0" | ||||
| typed-ast==1.4.1 | ||||
| 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" | ||||
| typed-ast==1.4.3; python_full_version >= "3.6.2" and python_version >= "3.6.2" and python_version < "3.8" | ||||
| typing-extensions==3.10.0.0; python_full_version >= "3.6.2" and python_version >= "3.6.2" and python_version < "3.8" and (python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.5.0" and python_version < "3.8" and python_version >= "3.6") | ||||
| urllib3==1.26.6; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" | ||||
| wcwidth==0.2.5; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.6.1" | ||||
| zipp==3.5.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.5.0" and python_version < "3.8" and python_version >= "3.6" | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| certifi==2020.12.5 | ||||
| chardet==4.0.0 | ||||
| falcon==2.0.0 | ||||
| -e git+https://github.com/alanorth/falcon-swagger-ui.git@a44244c85dceccfcd249b62fea4ee82a8221e3d2#egg=falcon-swagger-ui | ||||
| gunicorn==20.0.4 | ||||
| idna==2.10 | ||||
| jinja2==2.11.2 | ||||
| markupsafe==1.1.1 | ||||
| psycopg2-binary==2.8.6 | ||||
| requests==2.25.1 | ||||
| urllib3==1.26.2 | ||||
| certifi==2021.5.30; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" | ||||
| chardet==4.0.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" | ||||
| falcon-swagger-ui @ git+https://github.com/alanorth/falcon-swagger-ui.git@falcon-300b1 | ||||
| falcon==3.0.0; python_version >= "3.5" | ||||
| gunicorn==20.1.0; python_version >= "3.5" | ||||
| idna==2.10; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" | ||||
| jinja2==3.0.1; python_version >= "3.6" | ||||
| markupsafe==2.0.1; python_version >= "3.6" | ||||
| psycopg2==2.9.1; python_version >= "3.6" | ||||
| requests==2.25.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") | ||||
| urllib3==1.26.6; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" | ||||
|   | ||||
| @@ -1,14 +1,17 @@ | ||||
| from falcon import testing | ||||
| # SPDX-License-Identifier: GPL-3.0-only | ||||
|  | ||||
| import json | ||||
| import pytest | ||||
| from unittest.mock import patch | ||||
|  | ||||
| from dspace_statistics_api.app import api | ||||
| import pytest | ||||
| from falcon import testing | ||||
|  | ||||
| from dspace_statistics_api.app import app | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def client(): | ||||
|     return testing.TestClient(api) | ||||
|     return testing.TestClient(app) | ||||
|  | ||||
|  | ||||
| def test_get_collection(client): | ||||
| @@ -309,7 +312,7 @@ def test_post_collections_valid_page(client): | ||||
|     assert response.status_code == 200 | ||||
|     assert response.json["limit"] == 100 | ||||
|     assert response.json["currentPage"] == 0 | ||||
|     assert response.json["totalPages"] == 0 | ||||
|     assert response.json["totalPages"] == 1 | ||||
|     assert len(response.json["statistics"]) == 2 | ||||
|     assert isinstance(response.json["statistics"][0]["views"], int) | ||||
|     assert isinstance(response.json["statistics"][0]["downloads"], int) | ||||
|   | ||||
| @@ -1,14 +1,17 @@ | ||||
| from falcon import testing | ||||
| # SPDX-License-Identifier: GPL-3.0-only | ||||
|  | ||||
| import json | ||||
| import pytest | ||||
| from unittest.mock import patch | ||||
|  | ||||
| from dspace_statistics_api.app import api | ||||
| import pytest | ||||
| from falcon import testing | ||||
|  | ||||
| from dspace_statistics_api.app import app | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def client(): | ||||
|     return testing.TestClient(api) | ||||
|     return testing.TestClient(app) | ||||
|  | ||||
|  | ||||
| def test_get_community(client): | ||||
| @@ -309,7 +312,7 @@ def test_post_communities_valid_page(client): | ||||
|     assert response.status_code == 200 | ||||
|     assert response.json["limit"] == 100 | ||||
|     assert response.json["currentPage"] == 0 | ||||
|     assert response.json["totalPages"] == 0 | ||||
|     assert response.json["totalPages"] == 1 | ||||
|     assert len(response.json["statistics"]) == 2 | ||||
|     assert isinstance(response.json["statistics"][0]["views"], int) | ||||
|     assert isinstance(response.json["statistics"][0]["downloads"], int) | ||||
|   | ||||
| @@ -1,12 +1,14 @@ | ||||
| from falcon import testing | ||||
| import pytest | ||||
| # SPDX-License-Identifier: GPL-3.0-only | ||||
|  | ||||
| from dspace_statistics_api.app import api | ||||
| import pytest | ||||
| from falcon import testing | ||||
|  | ||||
| from dspace_statistics_api.app import app | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def client(): | ||||
|     return testing.TestClient(api) | ||||
|     return testing.TestClient(app) | ||||
|  | ||||
|  | ||||
| def test_get_docs(client): | ||||
|   | ||||
| @@ -1,14 +1,17 @@ | ||||
| from falcon import testing | ||||
| # SPDX-License-Identifier: GPL-3.0-only | ||||
|  | ||||
| import json | ||||
| import pytest | ||||
| from unittest.mock import patch | ||||
|  | ||||
| from dspace_statistics_api.app import api | ||||
| import pytest | ||||
| from falcon import testing | ||||
|  | ||||
| from dspace_statistics_api.app import app | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def client(): | ||||
|     return testing.TestClient(api) | ||||
|     return testing.TestClient(app) | ||||
|  | ||||
|  | ||||
| def test_get_item(client): | ||||
| @@ -309,7 +312,7 @@ def test_post_items_valid_page(client): | ||||
|     assert response.status_code == 200 | ||||
|     assert response.json["limit"] == 100 | ||||
|     assert response.json["currentPage"] == 0 | ||||
|     assert response.json["totalPages"] == 0 | ||||
|     assert response.json["totalPages"] == 1 | ||||
|     assert len(response.json["statistics"]) == 2 | ||||
|     assert isinstance(response.json["statistics"][0]["views"], int) | ||||
|     assert isinstance(response.json["statistics"][0]["downloads"], int) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user