apidae 0.1.1 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9dad5ac33a928dbc7b38f6082852b3fbc567f068
4
- data.tar.gz: 1314db67b370e78f927c66efa0472fd2b0050b2a
3
+ metadata.gz: c68638a33f855dbe14caf23d4bb0fa842e8a0263
4
+ data.tar.gz: 05978a1df57ca66bd96f42d66b8141e8c5c096f9
5
5
  SHA512:
6
- metadata.gz: d638d3691a2e55492b57ed553a83b4ed7e610cc8a5b77f936d4009f499a36512c72e47d3e3067810e94fadb25f12f8e639dbb1113d3bbd8cd345d38cbf139b00
7
- data.tar.gz: 30131ad110b06adb93f6489ce4fdf2b82992247a8a382df17073d0788be656f448341ad048abbaeab177b2f348b7ab6598643d78d7da142896504de26290a116
6
+ metadata.gz: 071dc1136e326c7a3370055203ed04eae6954394a65d0f83194a3c9118199c51e4c17650acf0d09931ee43234175365af1cd58c10bec596a19e7b8c7acc19813
7
+ data.tar.gz: 6c82209df78847b4d22b5d42119cc7c664184ced8a067d7a24f6356cebbe7ee29a3b8213b9ecae14620d6e7e00784231a42d98607cf52a6a8e862c9060df936f
@@ -0,0 +1,116 @@
1
+ module Apidae
2
+ class FileImport < ActiveRecord::Base
3
+
4
+ STATUS_PENDING = 'pending'
5
+ STATUS_COMPLETE = 'complete'
6
+ STATUS_CANCELLED = 'cancelled'
7
+
8
+ MODIFIED_DIR = 'objets_modifies'
9
+ DELETED_FILE = 'objets_supprimes.json'
10
+ SELECTIONS_FILE = 'selections.json'
11
+
12
+ def self.import(dir)
13
+ puts 'Update results : '
14
+ puts import_updates(File.join(dir, MODIFIED_DIR))
15
+ puts '------'
16
+ puts 'Deletion results : '
17
+ puts import_deletions(File.join(dir, DELETED_FILE))
18
+ puts '------'
19
+ puts 'Selection results : '
20
+ puts import_selections(File.join(dir,SELECTIONS_FILE))
21
+ puts '------'
22
+ end
23
+
24
+ def self.import_updates(json_dir)
25
+ result = {success: false, created: 0, updated: 0}
26
+ if Dir.exist?(json_dir)
27
+ Dir.foreach(json_dir) do |f|
28
+ if f.end_with?('.json')
29
+ json_file = File.join(json_dir, f)
30
+ objects_json = File.read(json_file)
31
+ objects_hashes = JSON.parse(objects_json, symbolize_names: true)
32
+ objects_hashes.each do |object_data|
33
+ existing = Apidae::Object.find_by_apidae_id(object_data[:id])
34
+ if existing
35
+ Apidae::Object.update_object(existing, object_data)
36
+ result[:updated] += 1
37
+ else
38
+ Apidae::Object.add_object(object_data)
39
+ result[:created] += 1
40
+ end
41
+ end
42
+ end
43
+ result[:success] = true
44
+ end
45
+ end
46
+ result
47
+ end
48
+
49
+
50
+ def self.import_deletions(json_file)
51
+ result = {success: false, deleted: 0}
52
+ if File.exist?(json_file)
53
+ deleted_json = File.read(json_file)
54
+ deleted_ids = JSON.parse(deleted_json)
55
+ deleted_ids.each do |id|
56
+ obj = Apidae::Object.find_by_apidae_id(id)
57
+ if obj
58
+ obj.destroy!
59
+ result[:deleted] += 1
60
+ else
61
+ puts "skipping object deletion : #{id}"
62
+ end
63
+ end
64
+ result[:success] = true
65
+ end
66
+ result
67
+ end
68
+
69
+ def self.update_fields(json_dir)
70
+ result = false
71
+ if Dir.exist?(json_dir)
72
+ Dir.foreach(json_dir) do |f|
73
+ if f.end_with?('.json')
74
+ json_file = File.join(json_dir, f)
75
+ objects_json = File.read(json_file)
76
+ objects_hashes = JSON.parse(objects_json, symbolize_names: true)
77
+ objects_hashes.each do |object_data|
78
+ obj = Apidae::Object.find_by_apidae_id(object_data[:id])
79
+ if obj
80
+ yield(obj, object_data)
81
+ obj.save!
82
+ end
83
+ end
84
+ end
85
+ result = true
86
+ end
87
+ result
88
+ end
89
+ end
90
+
91
+ def self.load_pictures
92
+ Apidae::Object.all.each do |obj|
93
+ if obj.apidae_attached_files.blank? && obj.pictures.any?
94
+ obj.pictures.each do |pic|
95
+ begin
96
+ attached = Apidae::AttachedFile.new(apidae_object_id: id, name: pic[:name], picture: URI.parse(pic[:url]),
97
+ description: pic[:description], credits: pic[:credits])
98
+ attached.save
99
+ rescue OpenURI::HTTPError => e
100
+ puts "Could not retrieve attached picture for object #{title} - Error is #{e.message}"
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ def self.import_selections(json_file)
108
+ selections_json = File.read(json_file)
109
+ selections_hashes = JSON.parse(selections_json, symbolize_names: true)
110
+ selections_hashes.each do |selection_data|
111
+ Apidae::Selection.add_or_update(selection_data)
112
+ end
113
+ Apidae::Selection.all.collect {|sel| {id: sel.id, apidae_id: sel.apidae_id, reference: sel.reference, objects: sel.objects.count}}
114
+ end
115
+ end
116
+ end
@@ -12,115 +12,70 @@ module Apidae
12
12
  store :address, accessors: [:address_fields], coder: JSON
13
13
  store :openings, accessors: [:description, :opening_periods], coder: JSON
14
14
 
15
+ ACT = 'ACTIVITE'
16
+ COS = 'COMMERCE_ET_SERVICE'
17
+ DEG = 'DEGUSTATION'
18
+ DOS = 'DOMAINE_SKIABLE'
19
+ EQU = 'EQUIPEMENT'
20
+ FEM = 'FETE_ET_MANIFESTATION'
21
+ HCO = 'HEBERGEMENT_COLLECTIF'
22
+ HLO = 'HEBERGEMENT_LOCATIF'
23
+ HOT = 'HOTELLERIE'
24
+ HPA = 'HOTELLERIE_PLEIN_AIR'
25
+ PCU = 'PATRIMOINE_CULTUREL'
26
+ PNA = 'PATRIMOINE_NATUREL'
27
+ RES = 'RESTAURATION'
28
+ SPA = 'SEJOUR_PACKAGE'
29
+ STR = 'STRUCTURE'
30
+ TER = 'TERRITOIRE'
31
+
15
32
  TYPES_DATA = {
16
- 'ACTIVITE' => {node: :informationsActivite, subtype: :activiteType},
17
- 'COMMERCE_ET_SERVICE' => {node: :informationsCommerceEtService, subtype: :commerceEtServiceType},
18
- 'DEGUSTATION' => {node: :informationsDegustation, subtype: :degustationType},
19
- 'DOMAINE_SKIABLE' => {node: :informationsDomaineSkiable, subtype: :domaineSkiableType},
20
- 'EQUIPEMENT' => {node: :informationsEquipement, subtype: :equipementType},
21
- 'FETE_ET_MANIFESTATION' => {node: :informationsFeteEtManifestation, subtype: :feteEtManifestationType},
22
- 'HEBERGEMENT_COLLECTIF' => {node: :informationsHebergementCollectif, subtype: :hebergementCollectifType},
23
- 'HEBERGEMENT_LOCATIF' => {node: :informationsHebergementLocatif, subtype: :hebergementLocatifType},
24
- 'HOTELLERIE' => {node: :informationsHotellerie, subtype: :hotellerieType},
25
- 'HOTELLERIE_PLEIN_AIR' => {node: :informationsHotelleriePleinAir, subtype: :hotelleriePleinAirType},
26
- 'PATRIMOINE_CULTUREL' => {node: :informationsPatrimoineCulturel, subtype: :patrimoineCulturelType},
27
- 'PATRIMOINE_NATUREL' => {node: :informationsPatrimoineNaturel, subtype: :patrimoineNaturelType},
28
- 'RESTAURATION' => {node: :informationsRestauration, subtype: :restaurationType},
29
- 'SEJOUR_PACKAGE' => {node: :informationsSejourPackage, subtype: :sejourPackageType},
30
- 'STRUCTURE' => {node: :informationsStructure, subtype: :structureType},
31
- 'TERRITOIRE' => {node: :informationsTerritoire, subtype: :territoireType}
33
+ ACT => {node: :informationsActivite, subtype: :activiteType},
34
+ COS => {node: :informationsCommerceEtService, subtype: :commerceEtServiceType},
35
+ DEG => {node: :informationsDegustation, subtype: :degustationType},
36
+ DOS => {node: :informationsDomaineSkiable, subtype: :domaineSkiableType},
37
+ EQU => {node: :informationsEquipement, subtype: :equipementType},
38
+ FEM => {node: :informationsFeteEtManifestation, subtype: :feteEtManifestationType},
39
+ HCO => {node: :informationsHebergementCollectif, subtype: :hebergementCollectifType},
40
+ HLO => {node: :informationsHebergementLocatif, subtype: :hebergementLocatifType},
41
+ HOT => {node: :informationsHotellerie, subtype: :hotellerieType},
42
+ HPA => {node: :informationsHotelleriePleinAir, subtype: :hotelleriePleinAirType},
43
+ PCU => {node: :informationsPatrimoineCulturel, subtype: :patrimoineCulturelType},
44
+ PNA => {node: :informationsPatrimoineNaturel, subtype: :patrimoineNaturelType},
45
+ RES => {node: :informationsRestauration, subtype: :restaurationType},
46
+ SPA => {node: :informationsSejourPackage, subtype: :sejourPackageType},
47
+ STR => {node: :informationsStructure, subtype: :structureType},
48
+ TER => {node: :informationsTerritoire, subtype: :territoireType}
32
49
  }
33
50
 
34
51
  PHONE = 201
35
52
  EMAIL = 204
36
53
  WEBSITE = 205
37
54
 
38
-
39
- def self.import_updates(json_dir)
40
- result = false
41
- if Dir.exist?(json_dir)
42
- Dir.foreach(json_dir) do |f|
43
- if f.end_with?('.json')
44
- json_file = File.join(json_dir, f)
45
- objects_json = File.read(json_file)
46
- objects_hashes = JSON.parse(objects_json, symbolize_names: true)
47
- objects_hashes.each do |object_data|
48
- type_fields = TYPES_DATA[object_data[:type]]
49
- apidae_obj = Apidae::Object.first_or_initialize(apidae_id: object_data[:id])
50
- apidae_obj.apidae_type = object_data[:type]
51
- apidae_obj.apidae_subtype = node_value(object_data[type_fields[:node]], object_data[type_fields[:subtype]])
52
- apidae_obj.title = node_value(object_data, :nom)
53
- apidae_obj.short_desc = node_value(object_data[:presentation], :descriptifCourt)
54
- apidae_obj.long_desc = node_value(object_data[:presentation], :descriptifDetaille)
55
- apidae_obj.contact = contact(object_data[:informations])
56
- apidae_obj.address = address(object_data[:localisation][:adresse])
57
- apidae_obj.town = town(object_data[:localisation][:adresse])
58
- apidae_obj.latitude = latitude(object_data[:localisation])
59
- apidae_obj.longitude = longitude(object_data[:localisation])
60
- apidae_obj.openings = openings(object_data[:ouverture])
61
- apidae_obj.rates = rates(object_data[:descriptionTarif])
62
- apidae_obj.reservation = reservation(object_data[:reservation])
63
- apidae_obj.type_data = object_data[type_fields[:node]]
64
- apidae_obj.pictures_data = pictures_urls(object_data[:illustrations])
65
- apidae_obj.entity_data = entity_fields(object_data[:informations])
66
- apidae_obj.save!
67
- end
68
- end
69
- result = true
70
- end
71
- result
72
- end
73
- end
74
-
75
- def self.import_deletions(json_file)
76
- result = false
77
- if File.exist?(json_file)
78
- deleted_json = File.read(json_file)
79
- deleted_ids = JSON.parse(deleted_json)
80
- deleted_ids.each do |id|
81
- Apidae::Object.find_by_apidae_id(id).destroy
82
- end
83
- result = true
84
- end
85
- result
86
- end
87
-
88
- def self.update_fields(json_dir)
89
- result = false
90
- if Dir.exist?(json_dir)
91
- Dir.foreach(json_dir) do |f|
92
- if f.end_with?('.json')
93
- json_file = File.join(json_dir, f)
94
- objects_json = File.read(json_file)
95
- objects_hashes = JSON.parse(objects_json, symbolize_names: true)
96
- objects_hashes.each do |object_data|
97
- obj = Apidae::Object.find_by_apidae_id(object_data[:id])
98
- if obj
99
- yield(obj, object_data)
100
- obj.save!
101
- end
102
- end
103
- end
104
- result = true
105
- end
106
- result
107
- end
108
- end
109
-
110
- def self.load_pictures
111
- Object.all.each do |obj|
112
- if obj.apidae_attached_files.blank? && obj.pictures.any?
113
- obj.pictures.each do |pic|
114
- begin
115
- attached = AttachedFile.new(apidae_object_id: id, name: pic[:name], picture: URI.parse(pic[:url]),
116
- description: pic[:description], credits: pic[:credits])
117
- attached.save
118
- rescue OpenURI::HTTPError => e
119
- puts "Could not retrieve attached picture for object #{title} - Error is #{e.message}"
120
- end
121
- end
122
- end
123
- end
55
+ def self.add_object(object_data)
56
+ apidae_obj = Apidae::Object.new(apidae_id: object_data[:id])
57
+ update_object(apidae_obj, object_data)
58
+ end
59
+
60
+ def self.update_object(apidae_obj, object_data)
61
+ type_fields = TYPES_DATA[object_data[:type]]
62
+ apidae_obj.apidae_type = object_data[:type]
63
+ apidae_obj.apidae_subtype = node_value(object_data[type_fields[:node]], object_data[type_fields[:subtype]])
64
+ apidae_obj.title = node_value(object_data, :nom)
65
+ apidae_obj.short_desc = node_value(object_data[:presentation], :descriptifCourt)
66
+ apidae_obj.long_desc = node_value(object_data[:presentation], :descriptifDetaille)
67
+ apidae_obj.contact = contact(object_data[:informations])
68
+ apidae_obj.address = address(object_data[:localisation][:adresse])
69
+ apidae_obj.town = town(object_data[:localisation][:adresse])
70
+ apidae_obj.latitude = latitude(object_data[:localisation])
71
+ apidae_obj.longitude = longitude(object_data[:localisation])
72
+ apidae_obj.openings = openings(object_data[:ouverture])
73
+ apidae_obj.rates = rates(object_data[:descriptionTarif])
74
+ apidae_obj.reservation = reservation(object_data[:reservation])
75
+ apidae_obj.type_data = object_data[type_fields[:node]]
76
+ apidae_obj.pictures_data = pictures_urls(object_data[:illustrations])
77
+ apidae_obj.entity_data = entity_fields(object_data[:informations])
78
+ apidae_obj.save!
124
79
  end
125
80
 
126
81
  def self.pictures_urls(pictures_array)
@@ -5,28 +5,24 @@ module Apidae
5
5
  MAX_COUNT = 100
6
6
  MAX_LOOPS = 10
7
7
 
8
- def self.import(json_file)
9
- selections_json = File.read(json_file)
10
- selections_hashes = JSON.parse(selections_json, symbolize_names: true)
11
- selections_hashes.each do |selection_data|
12
- apidae_sel = Apidae::Selection.first_or_initialize(apidae_id: selection_data[:id])
13
- apidae_sel.label = selection_data[:nom]
14
- apidae_sel.save!
8
+ def self.add_or_update(selection_data)
9
+ apidae_sel = Apidae::Selection.where(apidae_id: selection_data[:id]).first_or_initialize
10
+ apidae_sel.label = selection_data[:nom]
11
+ apidae_sel.save!
15
12
 
16
- current_objs = apidae_sel.objects.collect {|obj| obj.apidae_id}
17
- imported_objs = selection_data[:objetsTouristiques] || []
18
- added = imported_objs - current_objs
19
- removed = current_objs - imported_objs
13
+ current_objs = apidae_sel.objects.collect {|obj| obj.apidae_id}
14
+ imported_objs = selection_data[:objetsTouristiques].blank? ? [] : selection_data[:objetsTouristiques].collect {|obj| obj[:id]}
15
+ added = imported_objs - current_objs
16
+ removed = current_objs - imported_objs
20
17
 
21
- added.each do |o|
22
- apidae_object = Apidae::Object.find_by_apidae_id(o[:id])
23
- apidae_sel.objects << apidae_object
24
- end
18
+ added.each do |o|
19
+ apidae_object = Apidae::Object.find_by_apidae_id(o)
20
+ apidae_sel.objects << apidae_object if apidae_object
21
+ end
25
22
 
26
- removed.each do |o|
27
- apidae_object = Apidae::Object.find_by_apidae_id(o[:id])
28
- apidae_sel.objects.delete(apidae_object)
29
- end
23
+ removed.each do |o|
24
+ apidae_object = Apidae::Object.find_by_apidae_id(o)
25
+ apidae_sel.objects.delete(apidae_object) if apidae_object
30
26
  end
31
27
  end
32
28
 
@@ -0,0 +1,13 @@
1
+ class CreateApidaeFileImports < ActiveRecord::Migration
2
+ def change
3
+ create_table :apidae_file_imports do |t|
4
+ t.string :status
5
+ t.string :remote_file
6
+ t.integer :created
7
+ t.integer :updated
8
+ t.integer :deleted
9
+
10
+ t.timestamps null: false
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Apidae
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ module Apidae
4
+ class FileImportTest < ActiveSupport::TestCase
5
+ # test "the truth" do
6
+ # assert true
7
+ # end
8
+ end
9
+ end
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.1.1
4
+ version: 0.1.2
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: 2017-07-20 00:00:00.000000000 Z
11
+ date: 2017-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -71,6 +71,7 @@ files:
71
71
  - app/helpers/apidae/objects_helper.rb
72
72
  - app/helpers/apidae/selections_helper.rb
73
73
  - app/models/apidae/attached_file.rb
74
+ - app/models/apidae/file_import.rb
74
75
  - app/models/apidae/object.rb
75
76
  - app/models/apidae/selection.rb
76
77
  - app/models/apidae/town.rb
@@ -95,6 +96,7 @@ files:
95
96
  - db/migrate/20170513121215_create_apidae_attached_files.rb
96
97
  - db/migrate/20170513205932_rename_objects_selections_table.rb
97
98
  - db/migrate/20170720161134_add_entity_data_to_objects.rb
99
+ - db/migrate/20170730102424_create_apidae_file_imports.rb
98
100
  - lib/apidae.rb
99
101
  - lib/apidae/engine.rb
100
102
  - lib/apidae/version.rb
@@ -146,6 +148,7 @@ files:
146
148
  - test/fixtures/apidae/towns.yml
147
149
  - test/integration/navigation_test.rb
148
150
  - test/models/apidae/attached_file_test.rb
151
+ - test/models/apidae/file_import_test.rb
149
152
  - test/models/apidae/object_test.rb
150
153
  - test/models/apidae/selection_test.rb
151
154
  - test/models/apidae/town_test.rb
@@ -222,6 +225,7 @@ test_files:
222
225
  - test/fixtures/apidae/towns.yml
223
226
  - test/integration/navigation_test.rb
224
227
  - test/models/apidae/attached_file_test.rb
228
+ - test/models/apidae/file_import_test.rb
225
229
  - test/models/apidae/object_test.rb
226
230
  - test/models/apidae/selection_test.rb
227
231
  - test/models/apidae/town_test.rb