apidae 0.6.3 → 0.7.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 +4 -4
- data/app/controllers/apidae/dashboard_controller.rb +1 -0
- data/app/controllers/apidae/import_controller.rb +12 -17
- data/app/controllers/apidae/projects_controller.rb +35 -0
- data/app/models/apidae/file_import.rb +12 -11
- data/app/models/apidae/obj.rb +1 -1
- data/app/models/apidae/project.rb +5 -0
- data/app/models/apidae/selection.rb +5 -3
- data/app/views/apidae/dashboard/index.html.erb +1 -0
- data/app/views/apidae/projects/edit.html.erb +33 -0
- data/app/views/apidae/projects/index.html.erb +35 -0
- data/app/views/apidae/references/index.html.erb +2 -2
- data/config/routes.rb +1 -0
- data/db/migrate/20181024072424_add_project_id_to_selections.rb +5 -0
- data/db/migrate/20181024072843_create_apidae_projects.rb +10 -0
- data/lib/apidae/engine.rb +3 -0
- data/lib/apidae/version.rb +1 -1
- metadata +8 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 44825ff63506e2a48c0e3c3a9a283c804daae923
         | 
| 4 | 
            +
              data.tar.gz: 2cd5dc90fe25340322d26717f75c2ca5757da753
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ff6e9558ab78808534e1030184b40e1b3f4ca0cae89bc5692178726af3787592526b8991328e11c611b70d4818722fcaf57db5c6f410f9ce472496fbbf2c80aa
         | 
| 7 | 
            +
              data.tar.gz: ff6c592151798073270a602ac0a2b3907bb51dafac6f6c3b9d4452f70e505280729af898f58f43f8de0312d2d49918f4490320f07c67fb510b305d789dd00436
         | 
| @@ -16,25 +16,20 @@ module Apidae | |
| 16 16 | 
             
                # urlRecuperation : une chaine de caractères. L’URL de récupération du fichier d’export.
         | 
| 17 17 | 
             
                # urlConfirmation : une chaine de caractères. L’URL de confirmation.
         | 
| 18 18 | 
             
                def callback
         | 
| 19 | 
            -
                   | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
                       | 
| 26 | 
            -
             | 
| 27 | 
            -
                        req  | 
| 28 | 
            -
                        Net::HTTP.start(uri.hostname, uri.port) do |http|
         | 
| 29 | 
            -
                          http.request(req, params.to_unsafe_h.to_query)
         | 
| 30 | 
            -
                        end
         | 
| 19 | 
            +
                  export = Export.new(project_id: params[:projetId], remote_status: params[:statut], oneshot: params[:ponctuel] == 'true',
         | 
| 20 | 
            +
                                      reset: params[:reinitialisation] == 'true', file_url: params[:urlRecuperation],
         | 
| 21 | 
            +
                                      confirm_url: params[:urlConfirmation], status: Export::PENDING)
         | 
| 22 | 
            +
                  if export.save
         | 
| 23 | 
            +
                    if Rails.application.config.respond_to?(:apidae_propagate_callback)
         | 
| 24 | 
            +
                      uri = URI(Rails.application.config.apidae_propagate_callback)
         | 
| 25 | 
            +
                      req = Net::HTTP::Post.new(uri)
         | 
| 26 | 
            +
                      Net::HTTP.start(uri.hostname, uri.port, use_ssl: (uri.scheme == "https")) do |http|
         | 
| 27 | 
            +
                        http.request(req, params.to_unsafe_h.to_query)
         | 
| 31 28 | 
             
                      end
         | 
| 32 | 
            -
                      head :ok
         | 
| 33 | 
            -
                    else
         | 
| 34 | 
            -
                      head :internal_server_error
         | 
| 35 29 | 
             
                    end
         | 
| 30 | 
            +
                    head :ok
         | 
| 36 31 | 
             
                  else
         | 
| 37 | 
            -
                    head : | 
| 32 | 
            +
                    head :internal_server_error
         | 
| 38 33 | 
             
                  end
         | 
| 39 34 | 
             
                end
         | 
| 40 35 |  | 
| @@ -44,7 +39,7 @@ module Apidae | |
| 44 39 | 
             
                    begin
         | 
| 45 40 | 
             
                      open(e.file_url) do |f|
         | 
| 46 41 | 
             
                        begin
         | 
| 47 | 
            -
                          FileImport.import(f)
         | 
| 42 | 
            +
                          FileImport.import(f, e.project_id)
         | 
| 48 43 | 
             
                          uri = URI(e.confirm_url)
         | 
| 49 44 | 
             
                          req = Net::HTTP::Post.new(uri)
         | 
| 50 45 | 
             
                          Net::HTTP.start(uri.hostname, uri.port) do |http|
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            require_dependency "apidae/application_controller"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Apidae
         | 
| 4 | 
            +
              class ProjectsController < ApplicationController
         | 
| 5 | 
            +
                before_action :set_project, only: [:edit, :update]
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def index
         | 
| 8 | 
            +
                  @projects = Project.all
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def edit
         | 
| 12 | 
            +
                  session[:referrer] = request.referrer
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def update
         | 
| 16 | 
            +
                  if @project.update(project_params)
         | 
| 17 | 
            +
                    referrer = session.delete(:referrer)
         | 
| 18 | 
            +
                    redirect_to referrer, notice: 'Le projet a bien été mis à jour'
         | 
| 19 | 
            +
                  else
         | 
| 20 | 
            +
                    flash.now[:alert] = "Une erreur s'est produite lors la mise à jour du projet"
         | 
| 21 | 
            +
                    render :edit
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                private
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def set_project
         | 
| 28 | 
            +
                  @project = Project.find(params[:id])
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def project_params
         | 
| 32 | 
            +
                  params.require(:project).permit(:name, :api_key)
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -14,7 +14,7 @@ module Apidae | |
| 14 14 | 
             
                DELETED_FILE = 'objets_supprimes.json'
         | 
| 15 15 | 
             
                SELECTIONS_FILE = 'selections.json'
         | 
| 16 16 |  | 
| 17 | 
            -
                def self.import(zip_file)
         | 
| 17 | 
            +
                def self.import(zip_file, project_id)
         | 
| 18 18 | 
             
                  Zip::File.open(zip_file) do |zfile|
         | 
| 19 19 | 
             
                    result = {created: 0, updated: 0, deleted: 0, selections: []}
         | 
| 20 20 | 
             
                    Reference.import(zfile.read(REFERENCES_FILE))
         | 
| @@ -30,21 +30,21 @@ module Apidae | |
| 30 30 | 
             
                        elsif file.name.include?(DELETED_FILE)
         | 
| 31 31 | 
             
                          delete_objects(zfile.read(file.name), result)
         | 
| 32 32 | 
             
                        elsif file.name.include?(SELECTIONS_FILE)
         | 
| 33 | 
            -
                          add_or_update_selections(zfile.read(file.name), result)
         | 
| 33 | 
            +
                          add_or_update_selections(project_id, zfile.read(file.name), result)
         | 
| 34 34 | 
             
                        end
         | 
| 35 35 | 
             
                      end
         | 
| 36 36 | 
             
                    end
         | 
| 37 | 
            -
                    create(result.except(:selections).merge({remote_file: zip_file, status: STATUS_COMPLETE}))
         | 
| 37 | 
            +
                    create(result.except(:selections).merge({remote_file: (zip_file.is_a?(File) ? zip_file.path : zip_file), status: STATUS_COMPLETE}))
         | 
| 38 38 | 
             
                    logger.info "Import results : #{result}"
         | 
| 39 39 | 
             
                    result
         | 
| 40 40 | 
             
                  end
         | 
| 41 41 | 
             
                end
         | 
| 42 42 |  | 
| 43 | 
            -
                def self.import_dir(dir)
         | 
| 43 | 
            +
                def self.import_dir(project_id, dir)
         | 
| 44 44 | 
             
                  result = {created: 0, updated: 0, deleted: 0, selections: []}
         | 
| 45 45 | 
             
                  import_updates(File.join(dir, MODIFIED_DIR), result)
         | 
| 46 46 | 
             
                  import_deletions(File.join(dir, DELETED_FILE), result)
         | 
| 47 | 
            -
                  import_selections(File.join(dir,SELECTIONS_FILE), result)
         | 
| 47 | 
            +
                  import_selections(project_id, File.join(dir, SELECTIONS_FILE), result)
         | 
| 48 48 | 
             
                  logger.info "Import results : #{result}"
         | 
| 49 49 | 
             
                  result
         | 
| 50 50 | 
             
                end
         | 
| @@ -140,20 +140,21 @@ module Apidae | |
| 140 140 | 
             
                #   end
         | 
| 141 141 | 
             
                # end
         | 
| 142 142 |  | 
| 143 | 
            -
                def self.import_selections(json_file, result)
         | 
| 143 | 
            +
                def self.import_selections(project_id, json_file, result)
         | 
| 144 144 | 
             
                  selections_json = File.read(json_file)
         | 
| 145 | 
            -
                  add_or_update_selections(selections_json, result)
         | 
| 145 | 
            +
                  add_or_update_selections(project_id, selections_json, result)
         | 
| 146 146 | 
             
                end
         | 
| 147 147 |  | 
| 148 | 
            -
                def self.add_or_update_selections(selections_json, result)
         | 
| 148 | 
            +
                def self.add_or_update_selections(project_id, selections_json, result)
         | 
| 149 149 | 
             
                  selections_hashes = JSON.parse(selections_json, symbolize_names: true)
         | 
| 150 | 
            -
                   | 
| 150 | 
            +
                  project = Project.find_or_create_by(apidae_id: project_id)
         | 
| 151 | 
            +
                  deleted_ids = Selection.where(apidae_project_id: project.id).collect {|sel| sel.apidae_id}.uniq - selections_hashes.collect {|sel| sel[:id]}
         | 
| 151 152 | 
             
                  Selection.where(apidae_id: deleted_ids).delete_all
         | 
| 152 153 | 
             
                  selections_hashes.each do |selection_data|
         | 
| 153 154 | 
             
                    logger.info "Updating selection #{selection_data[:id]}"
         | 
| 154 | 
            -
                    Selection.add_or_update(selection_data)
         | 
| 155 | 
            +
                    Selection.add_or_update(selection_data, project.id)
         | 
| 155 156 | 
             
                  end
         | 
| 156 | 
            -
                  result[:selections] = Selection. | 
| 157 | 
            +
                  result[:selections] = Selection.where(apidae_project_id: project_id)
         | 
| 157 158 | 
             
                                            .collect {|sel| {apidae_id: sel.apidae_id, reference: sel.reference, objects: sel.objects.count}}
         | 
| 158 159 | 
             
                end
         | 
| 159 160 | 
             
              end
         | 
    
        data/app/models/apidae/obj.rb
    CHANGED
    
    | @@ -125,7 +125,7 @@ module Apidae | |
| 125 125 | 
             
                    {
         | 
| 126 126 | 
             
                        short_desc: node_value(data_hash, :descriptifCourt),
         | 
| 127 127 | 
             
                        long_desc: node_value(data_hash, :descriptifDetaille),
         | 
| 128 | 
            -
                        theme_desc: data_hash[:descriptifsThematises].blank? ?  | 
| 128 | 
            +
                        theme_desc: data_hash[:descriptifsThematises].blank? ? {} : Hash[data_hash[:descriptifsThematises].map {|th| [node_id(th, :theme), node_value(th, :description)]}],
         | 
| 129 129 | 
             
                        private_desc: private_data.blank? ? {} : Hash[private_data.map {|d| [d[:nomTechnique], node_value(d, :descriptif)]}]
         | 
| 130 130 | 
             
                    }
         | 
| 131 131 | 
             
                  end
         | 
| @@ -4,6 +4,7 @@ module Apidae | |
| 4 4 | 
             
              class Selection < ActiveRecord::Base
         | 
| 5 5 | 
             
                has_many :apidae_selection_objects, class_name: 'Apidae::SelectionObject', foreign_key: :apidae_selection_id
         | 
| 6 6 | 
             
                has_many :objects, class_name: 'Apidae::Obj', source: :apidae_object, through: :apidae_selection_objects
         | 
| 7 | 
            +
                belongs_to :apidae_project, optional: true, class_name: 'Apidae::Project', foreign_key: :apidae_project_id
         | 
| 7 8 |  | 
| 8 9 | 
             
                AGENDA_ENDPOINT = 'agenda/detaille/list-identifiants'
         | 
| 9 10 | 
             
                SELECTION_ENDPOINT = 'recherche/list-identifiants'
         | 
| @@ -13,9 +14,10 @@ module Apidae | |
| 13 14 | 
             
                validates_presence_of :apidae_id, :reference
         | 
| 14 15 | 
             
                before_validation :generate_reference, on: :create
         | 
| 15 16 |  | 
| 16 | 
            -
                def self.add_or_update(selection_data)
         | 
| 17 | 
            +
                def self.add_or_update(selection_data, apidae_proj_id)
         | 
| 17 18 | 
             
                  apidae_sel = Selection.where(apidae_id: selection_data[:id]).first_or_initialize
         | 
| 18 19 | 
             
                  apidae_sel.label = selection_data[:nom]
         | 
| 20 | 
            +
                  apidae_sel.apidae_project_id = apidae_proj_id
         | 
| 19 21 | 
             
                  apidae_sel.save!
         | 
| 20 22 |  | 
| 21 23 | 
             
                  # Note : should be done with basic collection assignment, but can't make it work...
         | 
| @@ -134,8 +136,8 @@ module Apidae | |
| 134 136 | 
             
                def build_args(endpoint, opts = {})
         | 
| 135 137 | 
             
                  {
         | 
| 136 138 | 
             
                      url: "#{Rails.application.config.apidae_api_url}/#{endpoint}",
         | 
| 137 | 
            -
                      apiKey:  | 
| 138 | 
            -
                      projetId:  | 
| 139 | 
            +
                      apiKey: apidae_project ? apidae_project.api_key : '',
         | 
| 140 | 
            +
                      projetId: apidae_project.apidae_id,
         | 
| 139 141 | 
             
                      first: opts[:first] || 0,
         | 
| 140 142 | 
             
                      count: opts[:count] || MAX_COUNT,
         | 
| 141 143 | 
             
                      selectionIds: opts[:selection_ids],
         | 
| @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            <%= render layout: "/layouts/#{Rails.application.config.apidae_layout}" do |styles| %>
         | 
| 2 2 | 
             
                <div id="apidae_header" class="<%= styles[:header] %>">
         | 
| 3 | 
            +
                  <%= link_to pluralize(@projects, 'projet', 'projets'), apidae.projects_path, class: styles[:projects] %>
         | 
| 3 4 | 
             
                  <%= link_to pluralize(@selections, 'sélection', 'sélections'), apidae.selections_path, class: styles[:selections] %>
         | 
| 4 5 | 
             
                  <%= link_to pluralize(@objects, 'objet touristique', 'objets touristiques'), apidae.objects_path, class: styles[:objects] %>
         | 
| 5 6 | 
             
                  <%= link_to (pluralize(@references, 'élément', 'éléments') + ' de référence'), apidae.references_path, class: styles[:references] %>
         | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            <%= render layout: "/layouts/#{Rails.application.config.apidae_layout}" do |styles| %>
         | 
| 2 | 
            +
              <div id="apidae_header" class="<%= styles[:header] %>">
         | 
| 3 | 
            +
                <%= link_to 'Retour', :back, class: styles[:back] %>
         | 
| 4 | 
            +
                <h1 class="<%= styles[:h1] %>">Apidae - Modifier le projet</h1>
         | 
| 5 | 
            +
              </div>
         | 
| 6 | 
            +
              <div id="apidae_edit_project" class="<%= styles[:wrapper] %>">
         | 
| 7 | 
            +
                <div id="apidae_form" class="<%= styles[:body] %>">
         | 
| 8 | 
            +
                  <%= form_for(@project, class: styles[:form]) do |f| %>
         | 
| 9 | 
            +
                    <% if @project.errors.any? %>
         | 
| 10 | 
            +
                      <div id="apidae_form_errors">
         | 
| 11 | 
            +
                        <ul>
         | 
| 12 | 
            +
                          <% @project.errors.full_messages.each do |message| %>
         | 
| 13 | 
            +
                            <li><%= message %></li>
         | 
| 14 | 
            +
                          <% end %>
         | 
| 15 | 
            +
                        </ul>
         | 
| 16 | 
            +
                      </div>
         | 
| 17 | 
            +
                    <% end %>
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    <div class="<%= styles[:form_field] %>">
         | 
| 20 | 
            +
                      <div><%= f.label :name %></div>
         | 
| 21 | 
            +
                      <div><%= f.text_field :name %></div>
         | 
| 22 | 
            +
                    </div>
         | 
| 23 | 
            +
                    <div class="<%= styles[:form_field] %>">
         | 
| 24 | 
            +
                      <div><%= f.label :api_key %></div>
         | 
| 25 | 
            +
                      <div><%= f.text_field :api_key %></div>
         | 
| 26 | 
            +
                    </div>
         | 
| 27 | 
            +
                    <div class="<%= styles[:form_actions] %>">
         | 
| 28 | 
            +
                      <%= f.submit 'Valider' %>
         | 
| 29 | 
            +
                    </div>
         | 
| 30 | 
            +
                  <% end %>
         | 
| 31 | 
            +
                </div>
         | 
| 32 | 
            +
              </div>
         | 
| 33 | 
            +
            <% end %>
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            <%= render layout: "/layouts/#{Rails.application.config.apidae_layout}" do |styles| %>
         | 
| 2 | 
            +
              <div id="apidae_header" class="<%= styles[:header] %>">
         | 
| 3 | 
            +
                <%= link_to 'Retour', root_path, class: styles[:back] %>
         | 
| 4 | 
            +
                <h1 class="<%= styles[:h1] %>">Apidae - Projets</h1>
         | 
| 5 | 
            +
              </div>
         | 
| 6 | 
            +
              <div class="<%= styles[:wrapper] %>">
         | 
| 7 | 
            +
                <div class="<%= styles[:body] %>">
         | 
| 8 | 
            +
                  <table id="apidae_projects" class="<%= styles[:table] %>">
         | 
| 9 | 
            +
                    <thead class="<%= styles[:table_head] %>">
         | 
| 10 | 
            +
                    <tr>
         | 
| 11 | 
            +
                      <th>Nom</th>
         | 
| 12 | 
            +
                      <th>Identifiant</th>
         | 
| 13 | 
            +
                      <th>Mise à jour</th>
         | 
| 14 | 
            +
                      <th></th>
         | 
| 15 | 
            +
                    </tr>
         | 
| 16 | 
            +
                    </thead>
         | 
| 17 | 
            +
                    <tbody class="<%= styles[:table_body] %>">
         | 
| 18 | 
            +
                    <% @projects.each do |proj| %>
         | 
| 19 | 
            +
                      <tr>
         | 
| 20 | 
            +
                        <td><%= proj.name %></td>
         | 
| 21 | 
            +
                        <td><%= proj.apidae_id %></td>
         | 
| 22 | 
            +
                        <td><%= proj.updated_at.strftime('Le %d/%m/%Y à %H:%M') if proj.updated_at %></td>
         | 
| 23 | 
            +
                        <td><%= link_to 'Modifier', edit_project_path(proj) %></td>
         | 
| 24 | 
            +
                      </tr>
         | 
| 25 | 
            +
                    <% end %>
         | 
| 26 | 
            +
                    <% if @projects.empty? %>
         | 
| 27 | 
            +
                      <tr>
         | 
| 28 | 
            +
                        <td colspan="4">Aucun projet pour le moment.</td>
         | 
| 29 | 
            +
                      </tr>
         | 
| 30 | 
            +
                    <% end %>
         | 
| 31 | 
            +
                    </tbody>
         | 
| 32 | 
            +
                  </table>
         | 
| 33 | 
            +
                </div>
         | 
| 34 | 
            +
              </div>
         | 
| 35 | 
            +
            <% end %>
         | 
| @@ -3,8 +3,8 @@ | |
| 3 3 | 
             
                <%= link_to 'Retour', root_path, class: styles[:back] %>
         | 
| 4 4 | 
             
                <h1 class="<%= styles[:h1] %>">Apidae - Eléments de référence</h1>
         | 
| 5 5 | 
             
              </div>
         | 
| 6 | 
            -
              <div  | 
| 7 | 
            -
                <div  | 
| 6 | 
            +
              <div class="<%= styles[:wrapper] %>">
         | 
| 7 | 
            +
                <div class="<%= styles[:body] %>">
         | 
| 8 8 | 
             
                  <table id="apidae_references" class="<%= styles[:table] %>">
         | 
| 9 9 | 
             
                    <thead class="<%= styles[:table_head] %>">
         | 
| 10 10 | 
             
                    <tr>
         | 
    
        data/config/routes.rb
    CHANGED
    
    | @@ -5,6 +5,7 @@ Apidae::Engine.routes.draw do | |
| 5 5 | 
             
                resources :objects, only: [:index], path: 'objets'
         | 
| 6 6 | 
             
              end
         | 
| 7 7 | 
             
              resources :references, only: [:index]
         | 
| 8 | 
            +
              resources :projects, only: [:index, :edit, :update], path: 'projets'
         | 
| 8 9 |  | 
| 9 10 | 
             
              match 'import/callback', via: :post, to: 'import#callback'
         | 
| 10 11 | 
             
              match 'import/run', via: :post, to: 'import#run'
         | 
    
        data/lib/apidae/engine.rb
    CHANGED
    
    | @@ -4,6 +4,9 @@ module Apidae | |
| 4 4 | 
             
                # Include all helpers from main app
         | 
| 5 5 | 
             
                config.to_prepare do
         | 
| 6 6 | 
             
                  ApplicationController.helper(ActionView::Helpers::ApplicationHelper)
         | 
| 7 | 
            +
                  Dir.glob(Rails.root + "app/decorators/**/*_decorator*.rb").each do |c|
         | 
| 8 | 
            +
                    require_dependency(c)
         | 
| 9 | 
            +
                  end
         | 
| 7 10 | 
             
                end
         | 
| 8 11 | 
             
              end
         | 
| 9 12 | 
             
            end
         | 
    
        data/lib/apidae/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: apidae
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.7.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Jean-Baptiste Vilain
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2018- | 
| 11 | 
            +
            date: 2018-11-13 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rails
         | 
| @@ -84,6 +84,7 @@ files: | |
| 84 84 | 
             
            - app/controllers/apidae/dashboard_controller.rb
         | 
| 85 85 | 
             
            - app/controllers/apidae/import_controller.rb
         | 
| 86 86 | 
             
            - app/controllers/apidae/objects_controller.rb
         | 
| 87 | 
            +
            - app/controllers/apidae/projects_controller.rb
         | 
| 87 88 | 
             
            - app/controllers/apidae/references_controller.rb
         | 
| 88 89 | 
             
            - app/controllers/apidae/selections_controller.rb
         | 
| 89 90 | 
             
            - app/helpers/apidae/api_helper.rb
         | 
| @@ -97,6 +98,7 @@ files: | |
| 97 98 | 
             
            - app/models/apidae/export.rb
         | 
| 98 99 | 
             
            - app/models/apidae/file_import.rb
         | 
| 99 100 | 
             
            - app/models/apidae/obj.rb
         | 
| 101 | 
            +
            - app/models/apidae/project.rb
         | 
| 100 102 | 
             
            - app/models/apidae/reference.rb
         | 
| 101 103 | 
             
            - app/models/apidae/selection.rb
         | 
| 102 104 | 
             
            - app/models/apidae/selection_object.rb
         | 
| @@ -110,6 +112,8 @@ files: | |
| 110 112 | 
             
            - app/views/apidae/objects/new.html.erb
         | 
| 111 113 | 
             
            - app/views/apidae/objects/show.html.erb
         | 
| 112 114 | 
             
            - app/views/apidae/objects/show.json.jbuilder
         | 
| 115 | 
            +
            - app/views/apidae/projects/edit.html.erb
         | 
| 116 | 
            +
            - app/views/apidae/projects/index.html.erb
         | 
| 113 117 | 
             
            - app/views/apidae/references/index.html.erb
         | 
| 114 118 | 
             
            - app/views/apidae/selections/_form.html.erb
         | 
| 115 119 | 
             
            - app/views/apidae/selections/edit.html.erb
         | 
| @@ -150,6 +154,8 @@ files: | |
| 150 154 | 
             
            - db/migrate/20180519170210_remove_insee_code_unicity.rb
         | 
| 151 155 | 
             
            - db/migrate/20180521211735_destroy_attached_files.rb
         | 
| 152 156 | 
             
            - db/migrate/20180625050400_rename_objects_to_obj.rb
         | 
| 157 | 
            +
            - db/migrate/20181024072424_add_project_id_to_selections.rb
         | 
| 158 | 
            +
            - db/migrate/20181024072843_create_apidae_projects.rb
         | 
| 153 159 | 
             
            - lib/apidae.rb
         | 
| 154 160 | 
             
            - lib/apidae/engine.rb
         | 
| 155 161 | 
             
            - lib/apidae/version.rb
         |