akido_lib 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/README.md +135 -0
 - data/Rakefile +17 -0
 - data/lib/akido_lib.rb +21 -0
 - data/lib/akido_lib/version.rb +3 -0
 - data/lib/bundle.rb +9 -0
 - data/lib/caching.rb +42 -0
 - data/lib/ext/rest_client.rb +45 -0
 - data/lib/generators/akido/setup_generator.rb +12 -0
 - data/lib/generators/akido/templates/initializer.rb +19 -0
 - data/lib/query.rb +86 -0
 - data/lib/rest_client_config.rb +45 -0
 - data/lib/tasks/akido_lib_tasks.rake +4 -0
 - metadata +97 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 3b8e6fcf27fb482c5a7a11574807f9b845b779115ee88b8c4df9942e5494fe82
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 8328a4d17ac37d9514bf2326b4934d189b95e1b50494efbc83cae0883a5c55ca
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 3ef0033896b726ebe9d6d404c9034758fe08b3276f917d94adcdb9de2def7e83b62ab9c7ec55dfc0c8a6b24f8f87eaa64bea72af6f1741c9b3df68c604b5ae4e
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: fcc636945b3a9bebb88c32bc1f8d5c2258f316d87609b8ed48b682eca02c3a15983170352125bc80d1554b34bc2b0f956f6072ec09923d1e9551fcc37ec63da1
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,135 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # AkidoLib
         
     | 
| 
      
 2 
     | 
    
         
            +
            Short description and motivation.
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            ## Usage
         
     | 
| 
      
 5 
     | 
    
         
            +
            How to use my plugin.
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ## Installation
         
     | 
| 
      
 8 
     | 
    
         
            +
            Add this line to your application's Gemfile:
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 11 
     | 
    
         
            +
            gem 'akido_lib'
         
     | 
| 
      
 12 
     | 
    
         
            +
            ```
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            And then execute:
         
     | 
| 
      
 15 
     | 
    
         
            +
            ```bash
         
     | 
| 
      
 16 
     | 
    
         
            +
            $ bundle
         
     | 
| 
      
 17 
     | 
    
         
            +
            ```
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            Or install it yourself as:
         
     | 
| 
      
 20 
     | 
    
         
            +
            ```bash
         
     | 
| 
      
 21 
     | 
    
         
            +
            $ gem install akido_lib
         
     | 
| 
      
 22 
     | 
    
         
            +
            ```
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            ## Extra Classes/Methods
         
     | 
| 
      
 25 
     | 
    
         
            +
            ### `AkidoLib::Bundle`
         
     | 
| 
      
 26 
     | 
    
         
            +
            We're liable to add some utility methods to `AkidoLib::Bundle`, since it's the
         
     | 
| 
      
 27 
     | 
    
         
            +
            main entry point into what comes back from the server.
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            #### Methods
         
     | 
| 
      
 30 
     | 
    
         
            +
            * `#to_a`
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              `Bundle#to_a` works exactly as you'd expect: the full bundle is read from the 
         
     | 
| 
      
 33 
     | 
    
         
            +
              server, and then turned into an array. Useful for when you want to call `#map` 
         
     | 
| 
      
 34 
     | 
    
         
            +
              or `#select` on what gets returned in a bundle.
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            ### `AkidoLib::Query`
         
     | 
| 
      
 39 
     | 
    
         
            +
            `Query` exists to bridge the gap between `FHIR::Client` and ActiveRecord-y
         
     | 
| 
      
 40 
     | 
    
         
            +
            syntax, which most Rails developers seem to think in. Its syntax should be 
         
     | 
| 
      
 41 
     | 
    
         
            +
            familiar to those familiar with `ActiveRecord::Relation`, specifically `#all` 
         
     | 
| 
      
 42 
     | 
    
         
            +
            and `#where`. 
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            #### Methods
         
     | 
| 
      
 45 
     | 
    
         
            +
            ##### Class Methods
         
     | 
| 
      
 46 
     | 
    
         
            +
            * `.set_base_url!(base_url)`
         
     | 
| 
      
 47 
     | 
    
         
            +
              
         
     | 
| 
      
 48 
     | 
    
         
            +
              Ordinarily, new Queries reach back to `FHIR::Model.client` to get their base 
         
     | 
| 
      
 49 
     | 
    
         
            +
              URL, but if it isn't set, or if you just want to overwrite it, you can do so.
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            * `.new(resource, base_url)`
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
              You probably won't call this method — most Queries will be created using
         
     | 
| 
      
 54 
     | 
    
         
            +
              methods on `FHIR::Model`. 
         
     | 
| 
      
 55 
     | 
    
         
            +
              
         
     | 
| 
      
 56 
     | 
    
         
            +
              When a Query is created, it needs two things to be meaningful: a base URL to 
         
     | 
| 
      
 57 
     | 
    
         
            +
              hit, and the name of a FHIR resource. This method takes both as arguments. The 
         
     | 
| 
      
 58 
     | 
    
         
            +
              resource name is required, but `base_url` is optional — if `base_url` is set 
         
     | 
| 
      
 59 
     | 
    
         
            +
              on `AkidoLib::Query`, that will be used, otherwise  it will default to the base 
         
     | 
| 
      
 60 
     | 
    
         
            +
              URL set on `AkidoLib::Model.client`. 
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            ##### Instance Methods
         
     | 
| 
      
 63 
     | 
    
         
            +
            * `#where(conditions)`
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
              The `where` method is the main entry point for adding constraints to the
         
     | 
| 
      
 66 
     | 
    
         
            +
              query. It accepts all of the
         
     | 
| 
      
 67 
     | 
    
         
            +
              [parameters](https://www.hl7.org/fhir/search.html#all) for FHIR searching,
         
     | 
| 
      
 68 
     | 
    
         
            +
              with the caveat that parameter names should be written as Ruby-style symbols, without the
         
     | 
| 
      
 69 
     | 
    
         
            +
              leading underscore and in `snake_case` instead of `camelCase` — e.g.
         
     | 
| 
      
 70 
     | 
    
         
            +
              `_lastUpdated` becomes `:last_updated`. 
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            * `#last_updated(date)`
         
     | 
| 
      
 74 
     | 
    
         
            +
              
         
     | 
| 
      
 75 
     | 
    
         
            +
              `#where` has the advantage of being able to set more than one property at a
         
     | 
| 
      
 76 
     | 
    
         
            +
              time, but the disadvantage that it doesn't cast any of the values to be more
         
     | 
| 
      
 77 
     | 
    
         
            +
              palatable to the server. Because of how precise FHIR servers can be about
         
     | 
| 
      
 78 
     | 
    
         
            +
              their date requirements, `#last_updated` is a convenience method that lets you
         
     | 
| 
      
 79 
     | 
    
         
            +
              pass a date, then sets `_lastUpdated` to the XML-encoded version of that date.
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            * `#include(relation)`
         
     | 
| 
      
 82 
     | 
    
         
            +
              
         
     | 
| 
      
 83 
     | 
    
         
            +
              Shorthand for adding `_include=[Relation]` to your query. Takes a sting, e.g.
         
     | 
| 
      
 84 
     | 
    
         
            +
              `'Encounter:Patient'`. Can take option after the name of the relation to
         
     | 
| 
      
 85 
     | 
    
         
            +
              include. There is currenlty one option implemented: passing `:rev => true`
         
     | 
| 
      
 86 
     | 
    
         
            +
              will insert the relation as a `_revinclude` instead of an `_include`.
         
     | 
| 
      
 87 
     | 
    
         
            +
              ```
         
     | 
| 
      
 88 
     | 
    
         
            +
              AkidoLib::Encounter.where(:last_updated =>2.weeks.ago).include("Encounter:Patient")
         
     | 
| 
      
 89 
     | 
    
         
            +
              ```
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
            * `#custom(key, value)`
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
              `#where` is prescriptive — it has opinions about how query keys should looks
         
     | 
| 
      
 94 
     | 
    
         
            +
              (i.e. they should be preceded with an underscore, they should be camelCase,
         
     | 
| 
      
 95 
     | 
    
         
            +
              etc.). `#custom` has no such prescriptions: whatever you pass in will be
         
     | 
| 
      
 96 
     | 
    
         
            +
              assigned to the query as a key and a value.
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
            * `#fetch!`
         
     | 
| 
      
 100 
     | 
    
         
            +
              
         
     | 
| 
      
 101 
     | 
    
         
            +
              Intended to be the last method called on a chain of queries. Will execute the
         
     | 
| 
      
 102 
     | 
    
         
            +
              query to which it is attached, and return the `AkidoLib::Bundle` that comes
         
     | 
| 
      
 103 
     | 
    
         
            +
              back from the server. 
         
     | 
| 
      
 104 
     | 
    
         
            +
              
         
     | 
| 
      
 105 
     | 
    
         
            +
              _Note: one of two `Query` methods that doesn't itself return a `Query`
         
     | 
| 
      
 106 
     | 
    
         
            +
              (returns an `AkidoLab::Bundle`)._
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
            * `#url`
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
              Sometimes you just need to peer into the inner workings of `Query` and see
         
     | 
| 
      
 111 
     | 
    
         
            +
              what it's doing, maybe to paste a URL into Postman or `curl`. This is
         
     | 
| 
      
 112 
     | 
    
         
            +
              precisely that utility method. 
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
              _Note: the second of two `Query` methods that doesn't return a `Query`
         
     | 
| 
      
 115 
     | 
    
         
            +
              (returns a string)._ 
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
            ### `AkidoLib::Model`
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
            `AkidoLib::Model` is another one of those classes that we'll periodically open
         
     | 
| 
      
 120 
     | 
    
         
            +
            up to add new functionality. For now, the main thing is adding methods that
         
     | 
| 
      
 121 
     | 
    
         
            +
            return `AkidoLib::Query` objects. 
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
            #### Methods
         
     | 
| 
      
 124 
     | 
    
         
            +
            * `#all`
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
              When called on a FHIR model, `#all` will return an `AkidoLib::Query` object
         
     | 
| 
      
 127 
     | 
    
         
            +
              pointed at the base level of that resource — e.g. `FHIR::Encounter.all` will 
         
     | 
| 
      
 128 
     | 
    
         
            +
              return a `Query` with a URL of `<BaseURL>/Encounter`
         
     | 
| 
      
 129 
     | 
    
         
            +
              
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
            ## Contributing
         
     | 
| 
      
 132 
     | 
    
         
            +
            Contribution directions go here.
         
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
      
 134 
     | 
    
         
            +
            ## License
         
     | 
| 
      
 135 
     | 
    
         
            +
            The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
         
     | 
    
        data/Rakefile
    ADDED
    
    | 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            begin
         
     | 
| 
      
 2 
     | 
    
         
            +
              require 'bundler/setup'
         
     | 
| 
      
 3 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 4 
     | 
    
         
            +
              puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
         
     | 
| 
      
 5 
     | 
    
         
            +
            end
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            require 'rdoc/task'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            RDoc::Task.new(:rdoc) do |rdoc|
         
     | 
| 
      
 10 
     | 
    
         
            +
              rdoc.rdoc_dir = 'rdoc'
         
     | 
| 
      
 11 
     | 
    
         
            +
              rdoc.title    = 'AkidoLib'
         
     | 
| 
      
 12 
     | 
    
         
            +
              rdoc.options << '--line-numbers'
         
     | 
| 
      
 13 
     | 
    
         
            +
              rdoc.rdoc_files.include('README.md')
         
     | 
| 
      
 14 
     | 
    
         
            +
              rdoc.rdoc_files.include('lib/**/*.rb')
         
     | 
| 
      
 15 
     | 
    
         
            +
            end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            require 'bundler/gem_tasks'
         
     | 
    
        data/lib/akido_lib.rb
    ADDED
    
    | 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'fhir_client'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'redis-objects'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative 'akido_lib/version'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require_relative './ext/rest_client'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            require_relative './bundle'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require_relative './caching'
         
     | 
| 
      
 9 
     | 
    
         
            +
            require_relative './query'
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            module AkidoLib
         
     | 
| 
      
 12 
     | 
    
         
            +
              include FHIR
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              def self.setup(base_url, server_config = {})
         
     | 
| 
      
 15 
     | 
    
         
            +
                self::Model.client = AkidoLib::Client.new(base_url)
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                self::Model.client.default_format = FHIR::Formats::ResourceFormat::RESOURCE_XML_DSTU2
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                RestClient.set_config(server_config)
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/bundle.rb
    ADDED
    
    
    
        data/lib/caching.rb
    ADDED
    
    | 
         @@ -0,0 +1,42 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module AkidoLib
         
     | 
| 
      
 2 
     | 
    
         
            +
              module ReferenceInstanceExtensions
         
     | 
| 
      
 3 
     | 
    
         
            +
                def read
         
     | 
| 
      
 4 
     | 
    
         
            +
                  model, id = reference.match(/(\D+)\/(\d+)/).captures
         
     | 
| 
      
 5 
     | 
    
         
            +
                  cached_models = Redis::HashKey.new(model)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  if matching_cached_model = cached_models[id]
         
     | 
| 
      
 7 
     | 
    
         
            +
                    return "FHIR::#{model}".constantize.new(JSON.parse(matching_cached_model))
         
     | 
| 
      
 8 
     | 
    
         
            +
                  else
         
     | 
| 
      
 9 
     | 
    
         
            +
                    model = super
         
     | 
| 
      
 10 
     | 
    
         
            +
                    cached_models[model.id] = model.to_json
         
     | 
| 
      
 11 
     | 
    
         
            +
                    return model
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              module ModelClassExtensions
         
     | 
| 
      
 17 
     | 
    
         
            +
                def cache!
         
     | 
| 
      
 18 
     | 
    
         
            +
                  model = self.to_s.demodulize
         
     | 
| 
      
 19 
     | 
    
         
            +
                  cache = Redis::HashKey.new(model)
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  records = self.search.to_a
         
     | 
| 
      
 22 
     | 
    
         
            +
                  records.each do |record|
         
     | 
| 
      
 23 
     | 
    
         
            +
                    cache[record.id] = record.to_json
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                def cached
         
     | 
| 
      
 29 
     | 
    
         
            +
                  model = self.class.to_s.demodulize
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                  Redis::HashKey.new(model).values.map do |record|
         
     | 
| 
      
 32 
     | 
    
         
            +
                    self.new(JSON.parse(record))
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
            end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            class FHIR::Reference
         
     | 
| 
      
 39 
     | 
    
         
            +
              prepend AkidoLib::ReferenceInstanceExtensions
         
     | 
| 
      
 40 
     | 
    
         
            +
            end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            FHIR::Model.singleton_class.prepend AkidoLib::ModelClassExtensions
         
     | 
| 
         @@ -0,0 +1,45 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module RestClient
         
     | 
| 
      
 2 
     | 
    
         
            +
              @@config = {}
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              def self.get_config
         
     | 
| 
      
 5 
     | 
    
         
            +
                @@config
         
     | 
| 
      
 6 
     | 
    
         
            +
              end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def self.set_config(**config)
         
     | 
| 
      
 9 
     | 
    
         
            +
                config.each do |key, value|
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @@config[key] = value unless key == :url || key == :method
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              def self.clear_config
         
     | 
| 
      
 15 
     | 
    
         
            +
                @@config = {}
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              def self.get(url, headers={}, &block)
         
     | 
| 
      
 19 
     | 
    
         
            +
                Request.execute(:method => :get, :url => url, :headers => headers, **@@config, &block)
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              def self.post(url, payload, headers={}, &block)
         
     | 
| 
      
 23 
     | 
    
         
            +
                Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers, **@@config, &block)
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              def self.patch(url, payload, headers={}, &block)
         
     | 
| 
      
 27 
     | 
    
         
            +
                Request.execute(:method => :patch, :url => url, :payload => payload, :headers => headers, **@@config, &block)
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              def self.put(url, payload, headers={}, &block)
         
     | 
| 
      
 31 
     | 
    
         
            +
                Request.execute(:method => :put, :url => url, :payload => payload, :headers => headers, **@@config, &block)
         
     | 
| 
      
 32 
     | 
    
         
            +
              end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              def self.delete(url, headers={}, &block)
         
     | 
| 
      
 35 
     | 
    
         
            +
                Request.execute(:method => :delete, :url => url, :headers => headers, **@@config, &block)
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              def self.head(url, headers={}, &block)
         
     | 
| 
      
 39 
     | 
    
         
            +
                Request.execute(:method => :head, :url => url, :headers => headers, **@@config, &block)
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              def self.options(url, headers={}, &block)
         
     | 
| 
      
 43 
     | 
    
         
            +
                Request.execute(:method => :options, :url => url, :headers => headers, **@@config, &block)
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            config = {
         
     | 
| 
      
 2 
     | 
    
         
            +
              :ssl_ca_file => "#{Rails.root}/config/ssl/ca.cert.pem"
         
     | 
| 
      
 3 
     | 
    
         
            +
            }
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            if (cert_path = ENV["SSL_CERT_PATH"]) && 
         
     | 
| 
      
 6 
     | 
    
         
            +
                File.exist?("#{Rails.root}/#{cert_path}")
         
     | 
| 
      
 7 
     | 
    
         
            +
              raw_cert = File.read("#{Rails.root}/#{cert_path}")
         
     | 
| 
      
 8 
     | 
    
         
            +
              cert = OpenSSL::X509::Certificate.new(raw_cert)
         
     | 
| 
      
 9 
     | 
    
         
            +
              config[:ssl_client_cert] = cert
         
     | 
| 
      
 10 
     | 
    
         
            +
            end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            if (key_path = ENV['SSL_KEY_PATH']) &&
         
     | 
| 
      
 13 
     | 
    
         
            +
                File.exist?("#{Rails.root}/#{key_path}")
         
     | 
| 
      
 14 
     | 
    
         
            +
              raw_key = File.read("#{Rails.root}/#{key_path}")
         
     | 
| 
      
 15 
     | 
    
         
            +
              key = OpenSSL::PKey::RSA.new(raw_key, ENV['SSL_KEY_PASSPHRASE'])
         
     | 
| 
      
 16 
     | 
    
         
            +
              config[:ssl_client_key] = key
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            AkidoLib.setup(ENV['PLATFORM_URL'], config)
         
     | 
    
        data/lib/query.rb
    ADDED
    
    | 
         @@ -0,0 +1,86 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module AkidoLib
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Query
         
     | 
| 
      
 3 
     | 
    
         
            +
                FILTERS = [
         
     | 
| 
      
 4 
     | 
    
         
            +
                  :content, 
         
     | 
| 
      
 5 
     | 
    
         
            +
                  :id, 
         
     | 
| 
      
 6 
     | 
    
         
            +
                  :last_updated, 
         
     | 
| 
      
 7 
     | 
    
         
            +
                  :profile, 
         
     | 
| 
      
 8 
     | 
    
         
            +
                  :query, 
         
     | 
| 
      
 9 
     | 
    
         
            +
                  :security, 
         
     | 
| 
      
 10 
     | 
    
         
            +
                  :tag,
         
     | 
| 
      
 11 
     | 
    
         
            +
                  :text,
         
     | 
| 
      
 12 
     | 
    
         
            +
                  :filter
         
     | 
| 
      
 13 
     | 
    
         
            +
                ]
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def initialize(resource, base_url)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @base_url = if base_url
         
     | 
| 
      
 17 
     | 
    
         
            +
                                base_url
         
     | 
| 
      
 18 
     | 
    
         
            +
                              elsif @@base_url
         
     | 
| 
      
 19 
     | 
    
         
            +
                                @@base_url
         
     | 
| 
      
 20 
     | 
    
         
            +
                              else
         
     | 
| 
      
 21 
     | 
    
         
            +
                                AkidoLib::Model
         
     | 
| 
      
 22 
     | 
    
         
            +
                                  .client
         
     | 
| 
      
 23 
     | 
    
         
            +
                                  .full_resource_url(:resource => @model)
         
     | 
| 
      
 24 
     | 
    
         
            +
                              end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  @resource = resource
         
     | 
| 
      
 27 
     | 
    
         
            +
                  @query = []
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                def where(filters)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  filters.each do |filter, value|
         
     | 
| 
      
 32 
     | 
    
         
            +
                    if FILTERS.include?(filter.to_s.underscore.downcase.to_sym)
         
     | 
| 
      
 33 
     | 
    
         
            +
                      @query.push({ "_#{filter.to_s.camelize(:lower)}".to_sym => value })
         
     | 
| 
      
 34 
     | 
    
         
            +
                    end
         
     | 
| 
      
 35 
     | 
    
         
            +
                  end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                  return self
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                def include(relation, options)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  key = if options[:rev]
         
     | 
| 
      
 42 
     | 
    
         
            +
                          :_revinclude
         
     | 
| 
      
 43 
     | 
    
         
            +
                        else
         
     | 
| 
      
 44 
     | 
    
         
            +
                          :_include
         
     | 
| 
      
 45 
     | 
    
         
            +
                        end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                  @query.push({key => relation})
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                def last_updated(date)
         
     | 
| 
      
 51 
     | 
    
         
            +
                  @query.push({:_lastUpdated => date.xmlschema})
         
     | 
| 
      
 52 
     | 
    
         
            +
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                def custom(key, value)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  @query.push({key => value})
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                def unset(key)
         
     | 
| 
      
 59 
     | 
    
         
            +
                  key = "_#{key.to_s.camelize(:lower)}".to_sym
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                  @query.reject! do |param| 
         
     | 
| 
      
 62 
     | 
    
         
            +
                    param.keys.include?(key)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
                end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                def url
         
     | 
| 
      
 67 
     | 
    
         
            +
                  "#{@base_url}/#{resource_name}?#{query_string}"
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                def fetch!
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
                
         
     | 
| 
      
 73 
     | 
    
         
            +
                def self.set_base_url!(base_url)
         
     | 
| 
      
 74 
     | 
    
         
            +
                  @@base_url = base_url
         
     | 
| 
      
 75 
     | 
    
         
            +
                end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                private
         
     | 
| 
      
 78 
     | 
    
         
            +
                def resource_name
         
     | 
| 
      
 79 
     | 
    
         
            +
                  @resource.to_s.demodulize
         
     | 
| 
      
 80 
     | 
    
         
            +
                end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                def query_string
         
     | 
| 
      
 83 
     | 
    
         
            +
                  @query.map(&:to_query).join("&")
         
     | 
| 
      
 84 
     | 
    
         
            +
                end
         
     | 
| 
      
 85 
     | 
    
         
            +
              end
         
     | 
| 
      
 86 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,45 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module RestClient
         
     | 
| 
      
 2 
     | 
    
         
            +
              @@config = {}
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              def self.get_config
         
     | 
| 
      
 5 
     | 
    
         
            +
                @@config
         
     | 
| 
      
 6 
     | 
    
         
            +
              end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def self.set_config(**config)
         
     | 
| 
      
 9 
     | 
    
         
            +
                config.each do |key, value|
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @@config[key] = value unless key == :url || key == :method
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              def self.clear_config
         
     | 
| 
      
 15 
     | 
    
         
            +
                @@config = {}
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              def self.get(url, headers={}, &block)
         
     | 
| 
      
 19 
     | 
    
         
            +
                Request.execute(:method => :get, :url => url, :headers => headers, **@@config, &block)
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              def self.post(url, payload, headers={}, &block)
         
     | 
| 
      
 23 
     | 
    
         
            +
                Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers, **@@config, &block)
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              def self.patch(url, payload, headers={}, &block)
         
     | 
| 
      
 27 
     | 
    
         
            +
                Request.execute(:method => :patch, :url => url, :payload => payload, :headers => headers, **@@config, &block)
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              def self.put(url, payload, headers={}, &block)
         
     | 
| 
      
 31 
     | 
    
         
            +
                Request.execute(:method => :put, :url => url, :payload => payload, :headers => headers, **@@config, &block)
         
     | 
| 
      
 32 
     | 
    
         
            +
              end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              def self.delete(url, headers={}, &block)
         
     | 
| 
      
 35 
     | 
    
         
            +
                Request.execute(:method => :delete, :url => url, :headers => headers, **@@config, &block)
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              def self.head(url, headers={}, &block)
         
     | 
| 
      
 39 
     | 
    
         
            +
                Request.execute(:method => :head, :url => url, :headers => headers, **@@config, &block)
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              def self.options(url, headers={}, &block)
         
     | 
| 
      
 43 
     | 
    
         
            +
                Request.execute(:method => :options, :url => url, :headers => headers, **@@config, &block)
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    ADDED
    
    | 
         @@ -0,0 +1,97 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification
         
     | 
| 
      
 2 
     | 
    
         
            +
            name: akido_lib
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.0
         
     | 
| 
      
 5 
     | 
    
         
            +
            platform: ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors:
         
     | 
| 
      
 7 
     | 
    
         
            +
            - Dean Tambling
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire: 
         
     | 
| 
      
 9 
     | 
    
         
            +
            bindir: bin
         
     | 
| 
      
 10 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2021-05-19 00:00:00.000000000 Z
         
     | 
| 
      
 12 
     | 
    
         
            +
            dependencies:
         
     | 
| 
      
 13 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 14 
     | 
    
         
            +
              name: rails
         
     | 
| 
      
 15 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 16 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 17 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 18 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 19 
     | 
    
         
            +
                    version: 5.1.6
         
     | 
| 
      
 20 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 21 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 22 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 23 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 24 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 25 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 26 
     | 
    
         
            +
                    version: 5.1.6
         
     | 
| 
      
 27 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 28 
     | 
    
         
            +
              name: fhir_client
         
     | 
| 
      
 29 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 30 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 31 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 33 
     | 
    
         
            +
                    version: 1.8.0
         
     | 
| 
      
 34 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 35 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 36 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 37 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 38 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 39 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 40 
     | 
    
         
            +
                    version: 1.8.0
         
     | 
| 
      
 41 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 42 
     | 
    
         
            +
              name: redis-objects
         
     | 
| 
      
 43 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 44 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 45 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 46 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 47 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 48 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 49 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 50 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 51 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 52 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 53 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 54 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 55 
     | 
    
         
            +
            description: Description of AkidoLib.
         
     | 
| 
      
 56 
     | 
    
         
            +
            email:
         
     | 
| 
      
 57 
     | 
    
         
            +
            - dean.tambling@gmail.com
         
     | 
| 
      
 58 
     | 
    
         
            +
            executables: []
         
     | 
| 
      
 59 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 60 
     | 
    
         
            +
            extra_rdoc_files: []
         
     | 
| 
      
 61 
     | 
    
         
            +
            files:
         
     | 
| 
      
 62 
     | 
    
         
            +
            - README.md
         
     | 
| 
      
 63 
     | 
    
         
            +
            - Rakefile
         
     | 
| 
      
 64 
     | 
    
         
            +
            - lib/akido_lib.rb
         
     | 
| 
      
 65 
     | 
    
         
            +
            - lib/akido_lib/version.rb
         
     | 
| 
      
 66 
     | 
    
         
            +
            - lib/bundle.rb
         
     | 
| 
      
 67 
     | 
    
         
            +
            - lib/caching.rb
         
     | 
| 
      
 68 
     | 
    
         
            +
            - lib/ext/rest_client.rb
         
     | 
| 
      
 69 
     | 
    
         
            +
            - lib/generators/akido/setup_generator.rb
         
     | 
| 
      
 70 
     | 
    
         
            +
            - lib/generators/akido/templates/initializer.rb
         
     | 
| 
      
 71 
     | 
    
         
            +
            - lib/query.rb
         
     | 
| 
      
 72 
     | 
    
         
            +
            - lib/rest_client_config.rb
         
     | 
| 
      
 73 
     | 
    
         
            +
            - lib/tasks/akido_lib_tasks.rake
         
     | 
| 
      
 74 
     | 
    
         
            +
            homepage: http://akidolabs.com
         
     | 
| 
      
 75 
     | 
    
         
            +
            licenses:
         
     | 
| 
      
 76 
     | 
    
         
            +
            - MIT
         
     | 
| 
      
 77 
     | 
    
         
            +
            metadata: {}
         
     | 
| 
      
 78 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
      
 79 
     | 
    
         
            +
            rdoc_options: []
         
     | 
| 
      
 80 
     | 
    
         
            +
            require_paths:
         
     | 
| 
      
 81 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 82 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 83 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 84 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 85 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 86 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 87 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 88 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 89 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 90 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 91 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 92 
     | 
    
         
            +
            requirements: []
         
     | 
| 
      
 93 
     | 
    
         
            +
            rubygems_version: 3.0.3.1
         
     | 
| 
      
 94 
     | 
    
         
            +
            signing_key: 
         
     | 
| 
      
 95 
     | 
    
         
            +
            specification_version: 4
         
     | 
| 
      
 96 
     | 
    
         
            +
            summary: Summary of AkidoLib.
         
     | 
| 
      
 97 
     | 
    
         
            +
            test_files: []
         
     |