Code Monkey home page Code Monkey logo

chercheville's Introduction

ChercheVille

ChercheVille is an Elixir service allowing to search cities based on data from GeoNames.

Documentation: https://hexdocs.pm/chercheville/

Build Status Coverage Status

Running with Docker

We provide a Docker image and a docker-compose.yml file so you may quickly try this app by cloning the repository and typing:

$ docker-compose up

The service should be availble at http://localhost:5000/

Then to import data into the database you have to call a an Elixir function, providing it a list of country codes as argument.

For example, to import data for France, Belgium and Spain:

$ docker exec -ti chercheville_app_1 ./bin/chercheville rpc 'ChercheVille.SeedData.import_data(["FR", "BE", "ES"])'

Development installation

Preparing the database

ChercheVille requires PostgreSQL with the PostGIS extension installed.

Configure database access in config/config.exs:

config :chercheville, ChercheVille.Repo,
  adapter: Ecto.Adapters.Postgres,
  types: ChercheVille.PostgresTypes,
  database: "cities",
  username: "my_username",
  password: "my_password",
  hostname: "localhost"
config :chercheville, ecto_repos: [ChercheVille.Repo]

Update your database schema. This will add a table named cities:

$ mix ecto.migrate

A couple of mix tasks are available to populate the database. Each task takes a list of country codes as arguments.

Importing data

To import data from geonames.org into our database:

$ mix chercheville.import_data FR BE ES

Starting web service

Start the web server:

mix run --no-halt

Then visiting the http://localhost:4000 should show a list of available endpoints.

Calling Elixir functions directly

Two search functions are available. Textual search with ChercheVille.Search.text/1 and spatial search with ChercheVille.Search.coordinates/2.

Note that you can start the application with an interactive shell using:

iex -S mix run --no-halt

Textual search example

ChercheVille.Search.text("toulouse")

Spatial search example

ChercheVille.Search.coordinates(43.6, 1.44)

Running tests

In order to run tests you'll need to create the cities_test database with the same extensions as the dev database (see Preparing the database) and run the migrations in the test environment:

$ MIX_ENV=test mix ecto.migrate
$ mix test

Building the Docker image

You should be able to build the Docker image like this:

$ docker build -t chercheville .

Then you can tag it and push it to Dockerhub:

$ docker tag chercheville:latest weatherforce/chercheville
$ docker push weatherforce/chercheville

This Docker packaging has been largely inspired by these articles, which you may want to read for background info:

chercheville's People

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

chercheville's Issues

Fix import of localized admin2 names

The file admin2Codes doesn't contain localized names anymore. e.g. Haute-Garonne is now "Upper Garonne", Nord is now "North". Localized names are available in alternateNames.txt

Make data import faster

We do a bunch of INSERT statements, which takes time.

It might be faster to generate a CSV and use COPY.

Full text search

For now text search is a basic substring match on the name. We need some to make it easier to find city names containing spécial characters, hyphens, etc.

Add HTTP interface

Also get rid of this warning:

warning: :simple_one_for_one strategy is deprecated, please use DynamicSupervisor instead
  (elixir 1.10.1) lib/supervisor.ex:604: Supervisor.init/2
  (elixir 1.10.1) lib/supervisor.ex:556: Supervisor.start_link/2
  (stdlib 3.11.2) supervisor.erl:379: :supervisor.do_start_child_i/3
  (stdlib 3.11.2) supervisor.erl:365: :supervisor.do_start_child/2
  (stdlib 3.11.2) supervisor.erl:349: anonymous fn/3 in :supervisor.start_children/2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.