# Dhis2 Basic DHIS2 API client for Ruby. ## Installation Add this line to your application's Gemfile: ```ruby gem 'dhis2' # get it from RubyGems gem 'dhis2', github: 'BLSQ/dhis2' # OR get the bleeding edge version from github ``` And then execute: $ bundle Or install it yourself as: $ gem install dhis2 ## Usage ### Connection The functionalities are available as a module. First thing you need to do is to connect to the instance: * Global configuration (to call a single Dhis2 instance): ```ruby Dhis2.configure do |config| config.url = "https://play.dhis2.org/demo" config.user = "admin" config.password = "district" end Dhis2.client.data_elements.list # => Array[,..] # Or alternatively Dhis2.configure do |config| config.url = "https://admin:district@play.dhis2.org/demo" end Dhis2.client.data_elements.list # => Array[,..] ``` * Local configuration: (in case you need to access different Dhis2 instances inside a single project): ```ruby client = Dhis2::Client.new(url: "https://play.dhis2.org/demo", user: "admin", password: "district") client.data_elements.list # => Array[,..] # Or alternatively client = Dhis2::Client.new("https://admin:district@play.dhis2.org/demo") client.data_elements.list # => Array[,..] ``` Regarding SSL, there is an option to disregard SSL error messages (such as bad certificates). USE THIS AT YOUR OWN RISK - it may allow you to access a server that would return in error without it... but you cannot trust the response. ```ruby dangerous_client = Dhis2::Client.new(url: "https://play.dhis2.org/demo", user: "admin", password: "district", no_ssl_verification: true); ``` ### Search for meta elements All subsequent calls can be done on the objects themselves and are going to use the provided url and credentials org_unit_levels = Dhis2.client.organisation_unit_levels.list The various methods are taking an optional hash parameter to be used for ´filter´ and ´fields´ values: org_units = Dhis2.client.organisation_units.list(filter: "level:eq:2", fields: %w(id level displayName parent)) If you want all fields, simply specify `:all` org_units = Dhis2.client.organisation_units.list(filter: "level:eq:2", fields: :all) Notes that any field found in the resulting JSON will be accessible from the object. ### Pagination Following the DHIS2 API, all calls are paginated - you can access the page info using the `pager` property on the returned list: org_units = Dhis2.client.organisation_units.list(filter: "level:eq:2", fields: %w(id level displayName parent)) org_units.pager.page # current page org_units.pager.page_count # number of pages org_units.pager.total # number of records ### Retreive a single element You can also retreive a single element using its id with `find`(in this case, all fields are returned by default): ou = Dhis2.client.organisation_units.find(id) `find` also accepts multiple ids - query will not be paginated and will return all fields for the given objects: ous = Dhis2.client.organisation_units.find([id1, id2, id3]) If you have an equality condition or set of equality conditions that should return a single element, you can use `find_by` instead of the longer list option: # Instead of this: data_element = Dhis2.client.data_elements.list(filter: "code:eq:C27", fields: :all).first # Just do: data_element = Dhis2.client.data_elements.find_by(code: "C27") ### Values You can retreive data values this way: ds = Dhis2.client.data_sets.find_by(name: "Child Health") organisation_unit = Dhis2.client.organisation_units.find_by(name: "Baoma") period = "201512" value_sets = Dhis2.client.data_value_sets.list( data_sets: [ds.id], organisation_unit: organisation_unit.id, periods: [period] ) ## Supported features The API is currently limited to **read** actions on the following elements/classes: * `OrganisationUnit` * `OrganisationUnitGroup` * `OrganisationUnitLevels` * `DataElement` * `DataSet` * `DataValueSet` * `DataValue` * `Analytic` * `CategoryCombo` * `SystemInfos` * `Attribute` * `Indicator` * `DataElementGroup` A very basic **write** use case exists for `DataElement` and `DataSet`: elements = [ { name: "TesTesT1", short_name: "TTT1" }, { name: "TesTesT2", short_name: "TTT2" } ] status = Dhis2.client.data_elements.create(elements) status.success? # => true status.total_imported # => 2 DHIS2 API does not return the ids of the created elements, but you can retreive them with their (unique) name or code. elements = [ { name: "TesTesT2", short_name: "TTT2" } ] status = Dhis2.client.data_elements.create(elements) element = Dhis2.client.data_elements.find_by(name: "TesTesT2") ## Update ### Full update You can update a given item by retreiving it using it's id, making any modification on it then calling "update": org_unit = Dhis2.client.organisation_units.find(id) org_unit.short_name = "New Short Name" org_unit.update This uses DHIS2 "full update" ('PUT') and not the "partial update" feature (see below), so it requires a fully formed object to work (get it either with `find` which takes all the fields or with the `fields: :all´ option). ### Partial update You can update a single or more attributes via the "update_attributes" method: org_unit = Dhis2.client.organisation_units.list(fields: :all, filter: "name:eq:#{org_unit_name}").first new_attributes = { name: "New name" } org_unit.update_attributes(new_attributes) Note that partial updates will no work with custom attributes at this time (while the full update will) ## Development After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. Note that the tests are using the DHIS2 demo server, which is reset every day but can be updated by anyone - so if someone change the password of the default user, the tests are going to fail. You can also run `bin/console` for an interactive prompt that will allow you to experiment. To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). ## Contributing Bug reports and pull requests are welcome on GitHub at https://github.com/BLSQ/dhis2. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. ## License The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).