From cdd2d9e722fe2e93d458bb647216b7871aeea0b6 Mon Sep 17 00:00:00 2001 From: Javier Goizueta Date: Tue, 8 Mar 2016 19:35:02 +0100 Subject: [PATCH] Directory reorganization and sketch of new versioning procedure --- Makefile | 4 +- README.md | 84 +++++++++- {pg/doc => doc}/02_moran.md | 0 {pg/doc => doc}/03_overlap_sum.md | 0 pg/.gitignore | 3 - pg/Makefile | 33 ---- pg/crankshaft--0.0.1.sql | 148 ------------------ pg/test/0.0.1/expected/01_install_test.out | 6 - python/Makefile | 11 -- src/pg/.gitignore | 6 + src/pg/Makefile | 41 +++++ {pg => src/pg}/README.md | 0 {pg => src/pg}/crankshaft.control | 0 {pg/sql/0.0.1 => src/pg/sql}/00_header.sql | 0 .../0.0.1 => src/pg/sql}/01_random_seeds.sql | 0 {pg/sql/0.0.1 => src/pg/sql}/02_moran.sql | 0 .../0.0.1 => src/pg/sql}/03_overlap_sum.sql | 0 .../0.0.1 => src/pg/sql}/04_dot_density.sql | 0 .../0.0.1 => src/pg/sql}/90_permissions.sql | 0 .../pg/test/expected}/01_install_test.out | 2 +- .../pg/test}/expected/02_moran_test.out | 0 .../pg/test}/expected/03_overlap_sum_test.out | 0 .../pg/test}/expected/04_dot_density_test.out | 0 {pg => src/pg}/test/fixtures/polyg_values.sql | 0 {pg => src/pg}/test/fixtures/ppoints.sql | 0 {pg => src/pg}/test/fixtures/ppoints2.sql | 0 .../pg/test}/sql/01_install_test.sql | 2 +- .../pg/test}/sql/02_moran_test.sql | 0 .../pg/test}/sql/03_overlap_sum_test.sql | 0 .../pg/test}/sql/04_dot_density_test.sql | 0 .../pg/test}/sql/90_permissions.sql | 0 {python => src/py}/.gitignore | 1 + src/py/Makefile | 9 ++ {python => src/py}/README.md | 0 .../py}/crankshaft/crankshaft/__init__.py | 0 .../crankshaft/clustering/__init__.py | 0 .../crankshaft/crankshaft/clustering/moran.py | 0 .../py}/crankshaft/crankshaft/random_seeds.py | 0 {python => src/py}/crankshaft/setup.py | 0 .../py}/crankshaft/test/fixtures/moran.json | 0 .../crankshaft/test/fixtures/neighbors.json | 0 {python => src/py}/crankshaft/test/helper.py | 0 .../py}/crankshaft/test/mock_plpy.py | 0 .../crankshaft/test/test_clustering_moran.py | 0 44 files changed, 142 insertions(+), 208 deletions(-) rename {pg/doc => doc}/02_moran.md (100%) rename {pg/doc => doc}/03_overlap_sum.md (100%) delete mode 100644 pg/.gitignore delete mode 100644 pg/Makefile delete mode 100644 pg/crankshaft--0.0.1.sql delete mode 100644 pg/test/0.0.1/expected/01_install_test.out delete mode 100644 python/Makefile create mode 100644 src/pg/.gitignore create mode 100644 src/pg/Makefile rename {pg => src/pg}/README.md (100%) rename {pg => src/pg}/crankshaft.control (100%) rename {pg/sql/0.0.1 => src/pg/sql}/00_header.sql (100%) rename {pg/sql/0.0.1 => src/pg/sql}/01_random_seeds.sql (100%) rename {pg/sql/0.0.1 => src/pg/sql}/02_moran.sql (100%) rename {pg/sql/0.0.1 => src/pg/sql}/03_overlap_sum.sql (100%) rename {pg/sql/0.0.1 => src/pg/sql}/04_dot_density.sql (100%) rename {pg/sql/0.0.1 => src/pg/sql}/90_permissions.sql (100%) rename {pg/test/0.0.1/results => src/pg/test/expected}/01_install_test.out (75%) rename {pg/test/0.0.1 => src/pg/test}/expected/02_moran_test.out (100%) rename {pg/test/0.0.1 => src/pg/test}/expected/03_overlap_sum_test.out (100%) rename {pg/test/0.0.1 => src/pg/test}/expected/04_dot_density_test.out (100%) rename {pg => src/pg}/test/fixtures/polyg_values.sql (100%) rename {pg => src/pg}/test/fixtures/ppoints.sql (100%) rename {pg => src/pg}/test/fixtures/ppoints2.sql (100%) rename {pg/test/0.0.1 => src/pg/test}/sql/01_install_test.sql (75%) rename {pg/test/0.0.1 => src/pg/test}/sql/02_moran_test.sql (100%) rename {pg/test/0.0.1 => src/pg/test}/sql/03_overlap_sum_test.sql (100%) rename {pg/test/0.0.1 => src/pg/test}/sql/04_dot_density_test.sql (100%) rename {pg/test/0.0.1 => src/pg/test}/sql/90_permissions.sql (100%) rename {python => src/py}/.gitignore (54%) create mode 100644 src/py/Makefile rename {python => src/py}/README.md (100%) rename {python => src/py}/crankshaft/crankshaft/__init__.py (100%) rename {python => src/py}/crankshaft/crankshaft/clustering/__init__.py (100%) rename {python => src/py}/crankshaft/crankshaft/clustering/moran.py (100%) rename {python => src/py}/crankshaft/crankshaft/random_seeds.py (100%) rename {python => src/py}/crankshaft/setup.py (100%) rename {python => src/py}/crankshaft/test/fixtures/moran.json (100%) rename {python => src/py}/crankshaft/test/fixtures/neighbors.json (100%) rename {python => src/py}/crankshaft/test/helper.py (100%) rename {python => src/py}/crankshaft/test/mock_plpy.py (100%) rename {python => src/py}/crankshaft/test/test_clustering_moran.py (100%) diff --git a/Makefile b/Makefile index d1d9734..5cae2cb 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -EXT_DIR = pg -PYP_DIR = python +EXT_DIR = src/pg +PYP_DIR = src/py .PHONY: install .PHONY: run_tests diff --git a/README.md b/README.md index 61e8738..5a12c2b 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,87 @@ CartoDB Spatial Analysis extension for PostgreSQL. ## Code organization -* *pg* contains the PostgreSQL extension source code -* *python* Python module +* *doc* documentation +* *src* source code +* - *src/pg* contains the PostgreSQL extension source code +* - *src/py* Python module source code +* *release* reselesed versions ## Requirements -* pip +* pip, virtualenv, PostgreSQL + +# Working Process + +## Development + +Work in `src/pg/sql`, `src/py/crankshaft`; +use topic branch. + +Update local installation with `sudo make install` +(this will update the 'dev' version of the extension in 'src/pg/') + +Run the tests with `PGUSER=postgres make test` + +Update extension in working database with + +* `ALTER EXTENSION crankshaft VERSION TO 'current';` + `ALTER EXTENSION crankshaft VERSION TO 'dev';` + +Note: we keep the current development version install as 'dev' always; +we update through the 'current' alias to allow changing the extension +contents but not the version identifier. This will fail if the +changes involve incompatible function changes such as a different +return type; in that case the offending function (or the whole extension) +should be dropped manually before the update. + +If the extension has not previously been installed in a database +we can: + +Add tests... + +* `CREATE EXTENSION crankshaft WITH VERSION 'dev';` + +Test + +Commit, push, create PR, wait for CI tests, CR, ... + +## Release + +To release current development version +(working directory should be clean in dev branch) + +(process to be gradually automated) + +For backwards compatible changes (no return value, num of arguments, etc. changes...) +new version number increasing either patch level (no new functionality) +or minor level (new functionality) => 'X.Y.Z'. +Update version in src/pg/crankshaft.control +Copy release/crankshaft--current.sql to release/crankshaft--X.Y.Z.sql +Prepare incremental downgrade, upgrade scripts.... + +Python: ... + +Install the new release + +`make install-release` + +Test the new release + +`make test-release` + +Push the release + +Wait for CI tests + +Merge into master + +Deploy: install extension and python to production hosts, +update extension in databases (limited to team users, data observatory, ...) + +Release manager role: ... + +.sql release scripts +commit +tests: staging.... +merge, tag, deploy... diff --git a/pg/doc/02_moran.md b/doc/02_moran.md similarity index 100% rename from pg/doc/02_moran.md rename to doc/02_moran.md diff --git a/pg/doc/03_overlap_sum.md b/doc/03_overlap_sum.md similarity index 100% rename from pg/doc/03_overlap_sum.md rename to doc/03_overlap_sum.md diff --git a/pg/.gitignore b/pg/.gitignore deleted file mode 100644 index 820df46..0000000 --- a/pg/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -regression.diffs -regression.out -results/ diff --git a/pg/Makefile b/pg/Makefile deleted file mode 100644 index 99605f5..0000000 --- a/pg/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -# Makefile to generate the extension out of separate sql source files. -# Once a version is released, it is not meant to be changed. E.g: once version 0.0.1 is out, it SHALL NOT be changed. - -EXTENSION = crankshaft -EXTVERSION = $(shell grep default_version $(EXTENSION).control | sed -e "s/default_version[[:space:]]*=[[:space:]]*'\([^']*\)'/\1/") - -# The new version to be generated from templates -NEW_EXTENSION_ARTIFACT = $(EXTENSION)--$(EXTVERSION).sql - -# DATA is a special variable used by postgres build infrastructure -# These are the files to be installed in the server shared dir, -# for installation from scratch, upgrades and downgrades. -# @see http://www.postgresql.org/docs/current/static/extend-pgxs.html -DATA = $(NEW_EXTENSION_ARTIFACT) - -SOURCES_DATA_DIR = sql/$(EXTVERSION) -SOURCES_DATA = $(wildcard sql/$(EXTVERSION)/*.sql) - -# The extension installation artifacts are stored in the base subdirectory -$(NEW_EXTENSION_ARTIFACT): $(SOURCES_DATA) - rm -f $@ - cat $(SOURCES_DATA_DIR)/*.sql >> $@ - -REGRESS = $(notdir $(basename $(wildcard test/$(EXTVERSION)/sql/*test.sql))) -TEST_DIR = test/$(EXTVERSION) -REGRESS_OPTS = --inputdir='$(TEST_DIR)' --outputdir='$(TEST_DIR)' - -PG_CONFIG = pg_config -PGXS := $(shell $(PG_CONFIG) --pgxs) -include $(PGXS) - -# This seems to be needed at least for PG 9.3.11 -all: $(DATA) diff --git a/pg/crankshaft--0.0.1.sql b/pg/crankshaft--0.0.1.sql deleted file mode 100644 index 436beea..0000000 --- a/pg/crankshaft--0.0.1.sql +++ /dev/null @@ -1,148 +0,0 @@ ---DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES --- Complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION crankshaft" to load this file. \quit --- Internal function. --- Set the seeds of the RNGs (Random Number Generators) --- used internally. -CREATE OR REPLACE FUNCTION -_cdb_random_seeds (seed_value INTEGER) RETURNS VOID -AS $$ - from crankshaft import random_seeds - random_seeds.set_random_seeds(seed_value) -$$ LANGUAGE plpythonu; --- Moran's I -CREATE OR REPLACE FUNCTION - cdb_moran_local ( - t TEXT, - attr TEXT, - significance float DEFAULT 0.05, - num_ngbrs INT DEFAULT 5, - permutations INT DEFAULT 99, - geom_column TEXT DEFAULT 'the_geom', - id_col TEXT DEFAULT 'cartodb_id', - w_type TEXT DEFAULT 'knn') -RETURNS TABLE (moran FLOAT, quads TEXT, significance FLOAT, ids INT) -AS $$ - from crankshaft.clustering import moran_local - # TODO: use named parameters or a dictionary - return moran_local(t, attr, significance, num_ngbrs, permutations, geom_column, id_col, w_type) -$$ LANGUAGE plpythonu; - --- Moran's I Local Rate -CREATE OR REPLACE FUNCTION - cdb_moran_local_rate(t TEXT, - numerator TEXT, - denominator TEXT, - significance FLOAT DEFAULT 0.05, - num_ngbrs INT DEFAULT 5, - permutations INT DEFAULT 99, - geom_column TEXT DEFAULT 'the_geom', - id_col TEXT DEFAULT 'cartodb_id', - w_type TEXT DEFAULT 'knn') -RETURNS TABLE(moran FLOAT, quads TEXT, significance FLOAT, ids INT, y numeric) -AS $$ - from crankshaft.clustering import moran_local_rate - # TODO: use named parameters or a dictionary - return moran_local_rate(t, numerator, denominator, significance, num_ngbrs, permutations, geom_column, id_col, w_type) -$$ LANGUAGE plpythonu; --- Function by Stuart Lynn for a simple interpolation of a value --- from a polygon table over an arbitrary polygon --- (weighted by the area proportion overlapped) --- Aereal weighting is a very simple form of aereal interpolation. --- --- Parameters: --- * geom a Polygon geometry which defines the area where a value will be --- estimated as the area-weighted sum of a given table/column --- * target_table_name table name of the table that provides the values --- * target_column column name of the column that provides the values --- * schema_name optional parameter to defina the schema the target table --- belongs to, which is necessary if its not in the search_path. --- Note that target_table_name should never include the schema in it. --- Return value: --- Aereal-weighted interpolation of the column values over the geometry -CREATE OR REPLACE -FUNCTION cdb_overlap_sum(geom geometry, target_table_name text, target_column text, schema_name text DEFAULT NULL) - RETURNS numeric AS -$$ -DECLARE - result numeric; - qualified_name text; -BEGIN - IF schema_name IS NULL THEN - qualified_name := Format('%I', target_table_name); - ELSE - qualified_name := Format('%I.%s', schema_name, target_table_name); - END IF; - EXECUTE Format(' - SELECT sum(%I*ST_Area(St_Intersection($1, a.the_geom))/ST_Area(a.the_geom)) - FROM %s AS a - WHERE $1 && a.the_geom - ', target_column, qualified_name) - USING geom - INTO result; - RETURN result; -END; -$$ LANGUAGE plpgsql; --- --- Creates N points randomly distributed arround the polygon --- --- @param g - the geometry to be turned in to points --- --- @param no_points - the number of points to generate --- --- @params max_iter_per_point - the function generates points in the polygon's bounding box --- and discards points which don't lie in the polygon. max_iter_per_point specifies how many --- misses per point the funciton accepts before giving up. --- --- Returns: Multipoint with the requested points -CREATE OR REPLACE FUNCTION cdb_dot_density(geom geometry , no_points Integer, max_iter_per_point Integer DEFAULT 1000) -RETURNS GEOMETRY AS $$ -DECLARE - extent GEOMETRY; - test_point Geometry; - width NUMERIC; - height NUMERIC; - x0 NUMERIC; - y0 NUMERIC; - xp NUMERIC; - yp NUMERIC; - no_left INTEGER; - remaining_iterations INTEGER; - points GEOMETRY[]; - bbox_line GEOMETRY; - intersection_line GEOMETRY; -BEGIN - extent := ST_Envelope(geom); - width := ST_XMax(extent) - ST_XMIN(extent); - height := ST_YMax(extent) - ST_YMIN(extent); - x0 := ST_XMin(extent); - y0 := ST_YMin(extent); - no_left := no_points; - - LOOP - if(no_left=0) THEN - EXIT; - END IF; - yp = y0 + height*random(); - bbox_line = ST_MakeLine( - ST_SetSRID(ST_MakePoint(yp, x0),4326), - ST_SetSRID(ST_MakePoint(yp, x0+width),4326) - ); - intersection_line = ST_Intersection(bbox_line,geom); - test_point = ST_LineInterpolatePoint(st_makeline(st_linemerge(intersection_line)),random()); - points := points || test_point; - no_left = no_left - 1 ; - END LOOP; - RETURN ST_Collect(points); -END; -$$ -LANGUAGE plpgsql VOLATILE; --- Make sure by default there are no permissions for publicuser --- NOTE: this happens at extension creation time, as part of an implicit transaction. --- REVOKE ALL PRIVILEGES ON SCHEMA cdb_crankshaft FROM PUBLIC, publicuser CASCADE; - --- Grant permissions on the schema to publicuser (but just the schema) -GRANT USAGE ON SCHEMA cdb_crankshaft TO publicuser; - --- Revoke execute permissions on all functions in the schema by default --- REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA cdb_crankshaft FROM PUBLIC, publicuser; diff --git a/pg/test/0.0.1/expected/01_install_test.out b/pg/test/0.0.1/expected/01_install_test.out deleted file mode 100644 index c14537c..0000000 --- a/pg/test/0.0.1/expected/01_install_test.out +++ /dev/null @@ -1,6 +0,0 @@ --- Install dependencies -CREATE EXTENSION plpythonu; -CREATE EXTENSION postgis; -CREATE EXTENSION cartodb; --- Install the extension -CREATE EXTENSION crankshaft; diff --git a/python/Makefile b/python/Makefile deleted file mode 100644 index 07b41dd..0000000 --- a/python/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# Install the package (needs root privileges) -install: - pip install ./crankshaft --upgrade - -# Test from source code -test: - (cd crankshaft && nosetests test/) - -# Test currently installed package -testinstalled: - nosetests crankshaft/test/ diff --git a/src/pg/.gitignore b/src/pg/.gitignore new file mode 100644 index 0000000..b58a014 --- /dev/null +++ b/src/pg/.gitignore @@ -0,0 +1,6 @@ +regression.diffs +regression.out +results/ +crankshaft--dev.sql +crankshaft--dev--current.sql +crankshaft--current--dev.sql diff --git a/src/pg/Makefile b/src/pg/Makefile new file mode 100644 index 0000000..4ff713d --- /dev/null +++ b/src/pg/Makefile @@ -0,0 +1,41 @@ +# Generation of a new development version 'dev' (with an alias 'current' for +# updating easily by upgrading to 'current', then 'dev') + +# sudo make install -- generate the 'dev' version from current source +# and make it available to PostgreSQL +# PGUSER=postgres make installcheck -- test the 'dev' extension + +EXTENSION = crankshaft + +DATA = $(EXTENSION)--dev.sql \ + $(EXTENSION)--current--dev.sql \ + $(EXTENSION)--dev--current.sql + +SOURCES_DATA_DIR = sql +SOURCES_DATA = $(wildcard $(SOURCES_DATA_DIR)/*.sql) + +$(DATA): $(SOURCES_DATA) + cat $(SOURCES_DATA_DIR)/*.sql > $@ + +TEST_DIR = test +REGRESS = $(notdir $(basename $(wildcard $(TEST_DIR)/sql/*test.sql))) +REGRESS_OPTS = --inputdir='$(TEST_DIR)' --outputdir='$(TEST_DIR)' + +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) + +# This seems to be needed at least for PG 9.3.11 +all: $(DATA) + +# WIP: goals for releasing the extension... + +EXTVERSION = $(shell grep default_version $(EXTENSION).control | sed -e "s/default_version[[:space:]]*=[[:space:]]*'\([^']*\)'/\1/") + +../release/$(EXTENSION).control: $(EXTENSION).control + cp $< $@ + +release: ../release/$(EXTENSION).control + cp $(EXTENSION)--dev.sql $(EXTENSION)--$(EXTVERSION).sql + # pending: create upgrade/downgrade scripts, + # commit, push, tag.... diff --git a/pg/README.md b/src/pg/README.md similarity index 100% rename from pg/README.md rename to src/pg/README.md diff --git a/pg/crankshaft.control b/src/pg/crankshaft.control similarity index 100% rename from pg/crankshaft.control rename to src/pg/crankshaft.control diff --git a/pg/sql/0.0.1/00_header.sql b/src/pg/sql/00_header.sql similarity index 100% rename from pg/sql/0.0.1/00_header.sql rename to src/pg/sql/00_header.sql diff --git a/pg/sql/0.0.1/01_random_seeds.sql b/src/pg/sql/01_random_seeds.sql similarity index 100% rename from pg/sql/0.0.1/01_random_seeds.sql rename to src/pg/sql/01_random_seeds.sql diff --git a/pg/sql/0.0.1/02_moran.sql b/src/pg/sql/02_moran.sql similarity index 100% rename from pg/sql/0.0.1/02_moran.sql rename to src/pg/sql/02_moran.sql diff --git a/pg/sql/0.0.1/03_overlap_sum.sql b/src/pg/sql/03_overlap_sum.sql similarity index 100% rename from pg/sql/0.0.1/03_overlap_sum.sql rename to src/pg/sql/03_overlap_sum.sql diff --git a/pg/sql/0.0.1/04_dot_density.sql b/src/pg/sql/04_dot_density.sql similarity index 100% rename from pg/sql/0.0.1/04_dot_density.sql rename to src/pg/sql/04_dot_density.sql diff --git a/pg/sql/0.0.1/90_permissions.sql b/src/pg/sql/90_permissions.sql similarity index 100% rename from pg/sql/0.0.1/90_permissions.sql rename to src/pg/sql/90_permissions.sql diff --git a/pg/test/0.0.1/results/01_install_test.out b/src/pg/test/expected/01_install_test.out similarity index 75% rename from pg/test/0.0.1/results/01_install_test.out rename to src/pg/test/expected/01_install_test.out index c14537c..e40d267 100644 --- a/pg/test/0.0.1/results/01_install_test.out +++ b/src/pg/test/expected/01_install_test.out @@ -3,4 +3,4 @@ CREATE EXTENSION plpythonu; CREATE EXTENSION postgis; CREATE EXTENSION cartodb; -- Install the extension -CREATE EXTENSION crankshaft; +CREATE EXTENSION crankshaft VERSION 'dev'; diff --git a/pg/test/0.0.1/expected/02_moran_test.out b/src/pg/test/expected/02_moran_test.out similarity index 100% rename from pg/test/0.0.1/expected/02_moran_test.out rename to src/pg/test/expected/02_moran_test.out diff --git a/pg/test/0.0.1/expected/03_overlap_sum_test.out b/src/pg/test/expected/03_overlap_sum_test.out similarity index 100% rename from pg/test/0.0.1/expected/03_overlap_sum_test.out rename to src/pg/test/expected/03_overlap_sum_test.out diff --git a/pg/test/0.0.1/expected/04_dot_density_test.out b/src/pg/test/expected/04_dot_density_test.out similarity index 100% rename from pg/test/0.0.1/expected/04_dot_density_test.out rename to src/pg/test/expected/04_dot_density_test.out diff --git a/pg/test/fixtures/polyg_values.sql b/src/pg/test/fixtures/polyg_values.sql similarity index 100% rename from pg/test/fixtures/polyg_values.sql rename to src/pg/test/fixtures/polyg_values.sql diff --git a/pg/test/fixtures/ppoints.sql b/src/pg/test/fixtures/ppoints.sql similarity index 100% rename from pg/test/fixtures/ppoints.sql rename to src/pg/test/fixtures/ppoints.sql diff --git a/pg/test/fixtures/ppoints2.sql b/src/pg/test/fixtures/ppoints2.sql similarity index 100% rename from pg/test/fixtures/ppoints2.sql rename to src/pg/test/fixtures/ppoints2.sql diff --git a/pg/test/0.0.1/sql/01_install_test.sql b/src/pg/test/sql/01_install_test.sql similarity index 75% rename from pg/test/0.0.1/sql/01_install_test.sql rename to src/pg/test/sql/01_install_test.sql index 54117e5..fc3ea80 100644 --- a/pg/test/0.0.1/sql/01_install_test.sql +++ b/src/pg/test/sql/01_install_test.sql @@ -4,4 +4,4 @@ CREATE EXTENSION postgis; CREATE EXTENSION cartodb; -- Install the extension -CREATE EXTENSION crankshaft; +CREATE EXTENSION crankshaft VERSION 'dev'; diff --git a/pg/test/0.0.1/sql/02_moran_test.sql b/src/pg/test/sql/02_moran_test.sql similarity index 100% rename from pg/test/0.0.1/sql/02_moran_test.sql rename to src/pg/test/sql/02_moran_test.sql diff --git a/pg/test/0.0.1/sql/03_overlap_sum_test.sql b/src/pg/test/sql/03_overlap_sum_test.sql similarity index 100% rename from pg/test/0.0.1/sql/03_overlap_sum_test.sql rename to src/pg/test/sql/03_overlap_sum_test.sql diff --git a/pg/test/0.0.1/sql/04_dot_density_test.sql b/src/pg/test/sql/04_dot_density_test.sql similarity index 100% rename from pg/test/0.0.1/sql/04_dot_density_test.sql rename to src/pg/test/sql/04_dot_density_test.sql diff --git a/pg/test/0.0.1/sql/90_permissions.sql b/src/pg/test/sql/90_permissions.sql similarity index 100% rename from pg/test/0.0.1/sql/90_permissions.sql rename to src/pg/test/sql/90_permissions.sql diff --git a/python/.gitignore b/src/py/.gitignore similarity index 54% rename from python/.gitignore rename to src/py/.gitignore index 0d20b64..fb50fe5 100644 --- a/python/.gitignore +++ b/src/py/.gitignore @@ -1 +1,2 @@ *.pyc +dev/ diff --git a/src/py/Makefile b/src/py/Makefile new file mode 100644 index 0000000..27d1446 --- /dev/null +++ b/src/py/Makefile @@ -0,0 +1,9 @@ +# Install the package locally for development +install: + virtualenv dev + ./dev/bin/pip install ./crankshaft --upgrade + ./dev/bin/pip install nose + +# Test develpment install +testinstalled: + ./dev/bin/nosetests crankshaft/test/ diff --git a/python/README.md b/src/py/README.md similarity index 100% rename from python/README.md rename to src/py/README.md diff --git a/python/crankshaft/crankshaft/__init__.py b/src/py/crankshaft/crankshaft/__init__.py similarity index 100% rename from python/crankshaft/crankshaft/__init__.py rename to src/py/crankshaft/crankshaft/__init__.py diff --git a/python/crankshaft/crankshaft/clustering/__init__.py b/src/py/crankshaft/crankshaft/clustering/__init__.py similarity index 100% rename from python/crankshaft/crankshaft/clustering/__init__.py rename to src/py/crankshaft/crankshaft/clustering/__init__.py diff --git a/python/crankshaft/crankshaft/clustering/moran.py b/src/py/crankshaft/crankshaft/clustering/moran.py similarity index 100% rename from python/crankshaft/crankshaft/clustering/moran.py rename to src/py/crankshaft/crankshaft/clustering/moran.py diff --git a/python/crankshaft/crankshaft/random_seeds.py b/src/py/crankshaft/crankshaft/random_seeds.py similarity index 100% rename from python/crankshaft/crankshaft/random_seeds.py rename to src/py/crankshaft/crankshaft/random_seeds.py diff --git a/python/crankshaft/setup.py b/src/py/crankshaft/setup.py similarity index 100% rename from python/crankshaft/setup.py rename to src/py/crankshaft/setup.py diff --git a/python/crankshaft/test/fixtures/moran.json b/src/py/crankshaft/test/fixtures/moran.json similarity index 100% rename from python/crankshaft/test/fixtures/moran.json rename to src/py/crankshaft/test/fixtures/moran.json diff --git a/python/crankshaft/test/fixtures/neighbors.json b/src/py/crankshaft/test/fixtures/neighbors.json similarity index 100% rename from python/crankshaft/test/fixtures/neighbors.json rename to src/py/crankshaft/test/fixtures/neighbors.json diff --git a/python/crankshaft/test/helper.py b/src/py/crankshaft/test/helper.py similarity index 100% rename from python/crankshaft/test/helper.py rename to src/py/crankshaft/test/helper.py diff --git a/python/crankshaft/test/mock_plpy.py b/src/py/crankshaft/test/mock_plpy.py similarity index 100% rename from python/crankshaft/test/mock_plpy.py rename to src/py/crankshaft/test/mock_plpy.py diff --git a/python/crankshaft/test/test_clustering_moran.py b/src/py/crankshaft/test/test_clustering_moran.py similarity index 100% rename from python/crankshaft/test/test_clustering_moran.py rename to src/py/crankshaft/test/test_clustering_moran.py