apidae 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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