geo_labels 0.2.0 → 0.3.1
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/CHANGELOG.md +20 -0
- data/README.md +127 -6
- data/Rakefile +6 -5
- data/app/assets/javascripts/geo_labels/application.coffee +11 -2
- data/app/assets/javascripts/geo_labels/ratings.coffee +80 -0
- data/app/assets/stylesheets/geo_labels/application.sass +21 -0
- data/app/controllers/concerns/geo_labels/shared_template_and_instance_methods.rb +3 -0
- data/app/controllers/geo_labels/application_controller.rb +3 -0
- data/app/controllers/geo_labels/contacts_controller.rb +18 -0
- data/app/controllers/geo_labels/dashboard_controller.rb +14 -9
- data/app/controllers/geo_labels/labels_controller.rb +3 -1
- data/app/controllers/geo_labels/ratings_controller.rb +30 -0
- data/app/helpers/geo_labels/application_helper.rb +73 -44
- data/app/helpers/geo_labels/rating_helper.rb +15 -0
- data/app/jobs/geo_labels/application_job.rb +1 -0
- data/app/mailers/geo_labels/application_mailer.rb +4 -2
- data/app/models/concerns/geo_labels/ratings_support.rb +102 -0
- data/app/models/geo_labels/application_record.rb +22 -0
- data/app/models/geo_labels/contact.rb +62 -20
- data/app/models/geo_labels/contact_label.rb +43 -7
- data/app/models/geo_labels/label.rb +13 -0
- data/app/views/geo_labels/contacts/_form.html.slim +15 -6
- data/app/views/geo_labels/contacts/index.html.slim +19 -7
- data/app/views/geo_labels/contacts/show.html.slim +24 -2
- data/app/views/geo_labels/dashboard/main.html.slim +27 -5
- data/app/views/geo_labels/labels/index.html.slim +10 -6
- data/app/views/geo_labels/labels/show.html.slim +15 -1
- data/app/views/layouts/geo_labels/application.html.slim +2 -0
- data/config/environment.rb +2 -0
- data/config/initializers/human_plural.rb +8 -5
- data/config/locales/geo_labels.en.yml +1 -0
- data/config/locales/geo_labels.es.yml +9 -0
- data/config/routes.rb +12 -1
- data/db/migrate/20221019150722_create_geo_labels_contacts.rb +5 -3
- data/db/migrate/20221020180213_create_geo_labels_labels.rb +2 -0
- data/db/migrate/20221020195346_create_geo_labels_contact_labels.rb +4 -2
- data/db/migrate/20230602182522_geo_labels_contacts_complex_name_to_name.rb +9 -0
- data/db/migrate/20230726154822_add_state_to_geo_labels_contacts.rb +8 -0
- data/db/migrate/20230801145902_add_food_rating_to_geo_labels_contacts.rb +7 -0
- data/lib/geo_labels/engine.rb +17 -7
- data/lib/geo_labels/exporter.rb +24 -10
- data/lib/geo_labels/importer.rb +31 -27
- data/lib/geo_labels/version.rb +3 -1
- data/lib/geo_labels.rb +2 -0
- data/lib/tasks/geo_labels_tasks.rake +1 -0
- metadata +37 -15
@@ -1,17 +1,24 @@
|
|
1
1
|
.ui.container
|
2
2
|
= page_title :index, record_class
|
3
|
-
|
3
|
+
= render 'button-new-record'
|
4
|
+
- if @records.any? or @q.base.conditions.any?
|
4
5
|
= search_form_for(@q, html: {class: 'ui form'}) do |f|
|
5
6
|
= hidden_field_tag :per_page, params[:per_page], id: 'q_per_page'
|
6
7
|
table.ui.compact.top.attached.striped.table
|
7
8
|
thead
|
8
9
|
tr
|
9
|
-
th= sort_link @q, :
|
10
|
-
th
|
10
|
+
th= sort_link @q, :name, at(:name), default_order: :asc
|
11
|
+
th= sort_link @q, :city, at(:city), default_order: :asc
|
12
|
+
th= sort_link @q, :department, at(:department), default_order: :asc
|
13
|
+
th= sort_link @q, :country, at(:country), default_order: :asc
|
14
|
+
th.collapsing.column-filter.actions
|
11
15
|
= search_result_info @records
|
12
16
|
= search_row class: 'ui mini form' do
|
13
|
-
th= f.
|
14
|
-
th.
|
17
|
+
th= f.search_field :name_cont, placeholder: at(:name)
|
18
|
+
th= f.search_field :city_cont, placeholder: at(:city)
|
19
|
+
th= f.search_field :department_cont, placeholder: at(:department)
|
20
|
+
th= f.search_field :country_cont, placeholder: at(:country)
|
21
|
+
th.collapsing.column-filter.actions
|
15
22
|
button.ui.mini.primary.icon.button
|
16
23
|
i.filter.icon
|
17
24
|
= link_to polymorphic_path(record_class, reset_q: true), class: 'clear-filters-button ui mini basic yellow icon button' do
|
@@ -19,8 +26,13 @@
|
|
19
26
|
tbody
|
20
27
|
- @records.each do |record|
|
21
28
|
tr
|
22
|
-
td
|
23
|
-
|
29
|
+
td
|
30
|
+
= link_to record.name, record
|
31
|
+
/= address_tag record.address, title: record.description
|
32
|
+
td= record.city
|
33
|
+
td= record.department
|
34
|
+
td= record.country
|
35
|
+
td.collapsing.actions
|
24
36
|
= table_show_link record
|
25
37
|
= table_edit_link record
|
26
38
|
.ui.bottom.attached.segment
|
@@ -1,13 +1,35 @@
|
|
1
|
+
- content_for :head
|
2
|
+
javascript:
|
3
|
+
setupRatings()
|
4
|
+
|
1
5
|
.ui.container
|
2
6
|
= page_title :show, @record, back: [record_class]
|
3
7
|
table.ui.top.attached.compact.definition.table
|
4
8
|
tbody
|
5
9
|
tr
|
6
10
|
td= t 'form.name'
|
7
|
-
td
|
11
|
+
td
|
12
|
+
= @record.name
|
13
|
+
= address_tag @record.address, title: @record.description
|
8
14
|
tr
|
9
15
|
td= GeoLabels::Label.model_name.human_plural
|
10
|
-
td
|
16
|
+
td== @record.labels.map{ |label| link_to label.name, label }.join(', ')
|
17
|
+
tr
|
18
|
+
td Ratings
|
19
|
+
td
|
20
|
+
= show_rating_for @record, :food
|
21
|
+
tr
|
22
|
+
td= at :state
|
23
|
+
td
|
24
|
+
- unless @record.rejected?
|
25
|
+
= link_to 'Reject', geo_labels.reject_contact_path(@record.id), method: :put, class: 'ui right floated button negative'
|
26
|
+
- unless @record.approved?
|
27
|
+
= link_to 'Approve', geo_labels.approve_contact_path(@record.id), method: :put, class: 'ui right floated button positive'
|
28
|
+
.ui.basic.label class=(@record.state == 'rejected' ? 'red' : (@record.state == 'approved' ? 'green' : 'yelow'))
|
29
|
+
= @record.state
|
30
|
+
tr
|
31
|
+
td= at :description
|
32
|
+
td= @record.description
|
11
33
|
- if @record.geocoded?
|
12
34
|
tr
|
13
35
|
td Location
|
@@ -4,7 +4,7 @@
|
|
4
4
|
.field
|
5
5
|
/label Blabla
|
6
6
|
.fields
|
7
|
-
.
|
7
|
+
.eight.wide.field
|
8
8
|
.ui.fluid.multiple.search.selection.dropdown
|
9
9
|
= hidden_field_tag 'label_ids', params[:label_ids]
|
10
10
|
i.dropdown.icon
|
@@ -15,6 +15,16 @@
|
|
15
15
|
.item data-value=label_id
|
16
16
|
= label_name
|
17
17
|
.four.wide.field
|
18
|
+
.ui.fluid.multiple.selection.dropdown
|
19
|
+
/input name='q[state][]' value='approved' type='hidden'
|
20
|
+
= hidden_field_tag 'states', params[:states].presence || 'approved'
|
21
|
+
i.dropdown.icon
|
22
|
+
.default.text states
|
23
|
+
.menu
|
24
|
+
.item data-value='approved' approved
|
25
|
+
.item data-value='recommended' recommended
|
26
|
+
.item data-value='rejected' rejected
|
27
|
+
.three.wide.field
|
18
28
|
.ui.buttons.fluid.and-or-switch-buttons
|
19
29
|
= hidden_field_tag 'predication', params[:predication].presence || 'and'
|
20
30
|
/= text_field_tag 'predication', 'and'
|
@@ -25,11 +35,23 @@
|
|
25
35
|
button.ui.blue.icon.button
|
26
36
|
i.search.icon
|
27
37
|
|
28
|
-
|
38
|
+
- if params[:label_ids].blank?
|
39
|
+
.ui.basic.pointing.label= t 'geo_labels.select_labels_text', models: GeoLabels::Label.model_name.human_plural
|
29
40
|
- if @contacts.present?
|
30
|
-
.ui.
|
31
|
-
|
41
|
+
.ui.top.attached.tabular.menu
|
42
|
+
a.item.active data-tab='contacts'= GeoLabels::Contact.model_name.human_plural
|
43
|
+
a.item data-tab='map' Map
|
44
|
+
.ui.bottom.attached.tab.segment.active data-tab='contacts'
|
45
|
+
.ui.list
|
46
|
+
- @contacts.each do |contact|
|
47
|
+
.ui.item
|
48
|
+
= link_to contact.name, contact
|
49
|
+
= address_tag contact.address, title: contact.description
|
50
|
+
.ui.bottom.attached.tab.segment data-tab='map'
|
51
|
+
#map-canvas
|
52
|
+
/.ui.horizontal.divider= GeoLabels::Contact.model_name.human_plural
|
53
|
+
/.ui.segment
|
32
54
|
#map-canvas
|
33
55
|
javascript:
|
34
56
|
window.map_points = #{@contacts.map(&:map_attributes).to_json.html_safe};
|
35
|
-
script src="https://maps.googleapis.com/maps/api/js?key=#{Rails.application.config.x.geo_labels.google_api_key}&
|
57
|
+
script src="https://maps.googleapis.com/maps/api/js?key=#{Rails.application.config.x.geo_labels.google_api_key}&v=weekly" defer
|
@@ -1,17 +1,21 @@
|
|
1
1
|
.ui.container
|
2
2
|
= page_title :index, record_class
|
3
|
-
|
3
|
+
span
|
4
|
+
= link_to new_label_path
|
5
|
+
i.plus.icon
|
6
|
+
= link_to_labels_tree
|
7
|
+
/- if @records.any? or @q.base.conditions.any?
|
4
8
|
= search_form_for(@q, html: {class: 'ui form'}) do |f|
|
5
9
|
= hidden_field_tag :per_page, params[:per_page], id: 'q_per_page'
|
6
10
|
table.ui.compact.top.attached.striped.table
|
7
11
|
thead
|
8
12
|
tr
|
9
13
|
th= sort_link @q, :name, at(:name), default_order: :asc
|
10
|
-
th.column-filter.actions
|
14
|
+
th.collapsing.column-filter.actions
|
11
15
|
= search_result_info @records
|
12
16
|
= search_row class: 'ui mini form' do
|
13
17
|
th= f.text_field :name_cont, placeholder: at(:name)
|
14
|
-
th.column-filter.actions
|
18
|
+
th.collapsing.column-filter.actions
|
15
19
|
button.ui.mini.primary.icon.button
|
16
20
|
i.filter.icon
|
17
21
|
= link_to polymorphic_path(record_class, reset_q: true), class: 'clear-filters-button ui mini basic yellow icon button' do
|
@@ -20,17 +24,17 @@
|
|
20
24
|
- @records.each do |record|
|
21
25
|
tr
|
22
26
|
td= link_to record.name, record
|
23
|
-
td.actions
|
27
|
+
td.collapsing.actions
|
24
28
|
= table_show_link record
|
25
29
|
= table_edit_link record
|
26
30
|
.ui.bottom.attached.segment
|
27
31
|
= render 'button-new-record'
|
28
32
|
= paginate @records
|
29
|
-
|
33
|
+
/- else
|
30
34
|
p= t 'collection.empty', models: record_class.model_name.human_plural
|
31
35
|
= render 'button-new-record'
|
32
36
|
|
33
|
-
|
37
|
+
/.ui.styled.accordion
|
34
38
|
.title.active
|
35
39
|
i.dropdown.icon
|
36
40
|
= t 'geo_labels.tree_title'
|
@@ -7,6 +7,20 @@
|
|
7
7
|
td= @record.name
|
8
8
|
tr
|
9
9
|
td Parents
|
10
|
-
td
|
10
|
+
td== @record.ancestors.map{ |label| link_to label.name, label }.join(' -> ')
|
11
|
+
tr
|
12
|
+
td Children
|
13
|
+
td
|
14
|
+
.ui.horizontal.bulleted.list
|
15
|
+
- @record.children.each do |child|
|
16
|
+
.item= link_to child.name, child
|
17
|
+
tr
|
18
|
+
td= GeoLabels::Contact.model_name.human_plural
|
19
|
+
td
|
20
|
+
.ui.list
|
21
|
+
- @record.associated_contacts.each do |contact|
|
22
|
+
.item
|
23
|
+
= link_to(contact.name, contact)
|
24
|
+
= address_tag contact.address, title: contact.description
|
11
25
|
.ui.bottom.attached.segment
|
12
26
|
= render 'button-edit-record', record: @record
|
@@ -11,6 +11,8 @@ html lang="en"
|
|
11
11
|
|
12
12
|
= stylesheet_link_tag 'geo_labels/application', media: 'all'
|
13
13
|
= javascript_include_tag 'geo_labels/application'
|
14
|
+
javascript:
|
15
|
+
window.geo_labels = #{{paths: GeoLabels::Engine.client_paths}.to_json.html_safe};
|
14
16
|
= content_for :head
|
15
17
|
body
|
16
18
|
header= render 'navigation'
|
data/config/environment.rb
CHANGED
@@ -1,16 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveModel
|
2
4
|
class Name
|
5
|
+
|
3
6
|
def human_plural
|
4
7
|
# Try to find the plural name of a model. If none can be found try to find a non namespaced version and return that one
|
5
|
-
default =
|
6
|
-
if path.present? and path['/'] # non namespaced model a
|
7
|
-
unnamespaced_path = path.sub(
|
8
|
-
I18n.t(unnamespaced_path, default:
|
8
|
+
default = proc do |path|
|
9
|
+
if path.present? and path['/'] # non namespaced model a.b.c/d/e => a.b.c
|
10
|
+
unnamespaced_path = path.sub(%r{\.(\w+)/[\w\\]+}, '.\1')
|
11
|
+
I18n.t(unnamespaced_path, default: proc{ human.pluralize })
|
9
12
|
else
|
10
13
|
human.pluralize
|
11
14
|
end
|
12
15
|
end
|
13
|
-
I18n.t("#{@klass.i18n_scope}.models.plural.#{i18n_key}", default: default
|
16
|
+
I18n.t("#{@klass.i18n_scope}.models.plural.#{i18n_key}", default: default)
|
14
17
|
end
|
15
18
|
end
|
16
19
|
end
|
@@ -1,5 +1,14 @@
|
|
1
1
|
es:
|
2
|
+
activerecord:
|
3
|
+
models:
|
4
|
+
geo_labels/contact: Contacto
|
5
|
+
geo_labels/label: Etiqueta
|
6
|
+
plural:
|
7
|
+
geo_labels/contact: Contactos
|
8
|
+
geo_labels/label: Etiquetas
|
9
|
+
|
2
10
|
geo_labels:
|
3
11
|
export: Exportar
|
4
12
|
import: Importar
|
5
13
|
tree_title: Árbol
|
14
|
+
select_labels_text: Seleccionar %{models} y busca...
|
data/config/routes.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
GeoLabels::Engine.routes.draw do
|
2
3
|
root 'dashboard#main'
|
3
4
|
|
@@ -8,6 +9,16 @@ GeoLabels::Engine.routes.draw do
|
|
8
9
|
post :import_file
|
9
10
|
end
|
10
11
|
|
11
|
-
|
12
|
+
scope 'ratings', controller: :ratings do
|
13
|
+
post :set, as: :set_rating # post because of.. well.. $.post
|
14
|
+
get :get, as: :get_rating
|
15
|
+
end
|
16
|
+
|
17
|
+
resources :contacts do
|
18
|
+
member do
|
19
|
+
put :approve
|
20
|
+
put :reject
|
21
|
+
end
|
22
|
+
end
|
12
23
|
resources :labels
|
13
24
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
class CreateGeoLabelsContacts < ActiveRecord::Migration[7.0]
|
3
|
+
|
2
4
|
def change
|
3
5
|
create_table :geo_labels_contacts do |t|
|
4
6
|
t.string :first_name
|
@@ -10,11 +12,11 @@ class CreateGeoLabelsContacts < ActiveRecord::Migration[7.0]
|
|
10
12
|
t.string :state
|
11
13
|
t.string :country
|
12
14
|
t.text :description
|
13
|
-
t.
|
14
|
-
t.
|
15
|
+
t.decimal :latitude, precision: 15, scale: 13
|
16
|
+
t.decimal :longitude, precision: 15, scale: 13
|
15
17
|
|
16
18
|
t.timestamps
|
17
|
-
t.index [
|
19
|
+
t.index %i[latitude longitude]
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
class CreateGeoLabelsContactLabels < ActiveRecord::Migration[7.0]
|
3
|
+
|
2
4
|
def change
|
3
5
|
create_table :geo_labels_contact_labels, id: false do |t|
|
4
|
-
#t.belongs_to :contact, null: false, foreign_key: true
|
5
|
-
#t.belongs_to :label, null: false, foreign_key: true
|
6
|
+
# t.belongs_to :contact, null: false, foreign_key: true
|
7
|
+
# t.belongs_to :label, null: false, foreign_key: true
|
6
8
|
t.integer :contact_id, index: true
|
7
9
|
t.integer :label_id, index: true
|
8
10
|
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
class GeoLabelsContactsComplexNameToName < ActiveRecord::Migration[7.0]
|
3
|
+
|
4
|
+
def change
|
5
|
+
rename_column :geo_labels_contacts, :first_name, :name
|
6
|
+
remove_column :geo_labels_contacts, :middle_name
|
7
|
+
remove_column :geo_labels_contacts, :last_name
|
8
|
+
end
|
9
|
+
end
|
data/lib/geo_labels/engine.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'geocoder'
|
2
3
|
require 'slim-rails'
|
3
4
|
require 'coffee-rails'
|
@@ -11,24 +12,33 @@ require 'awesome_nested_set'
|
|
11
12
|
|
12
13
|
module GeoLabels
|
13
14
|
class Engine < ::Rails::Engine
|
15
|
+
|
14
16
|
isolate_namespace GeoLabels
|
15
17
|
|
16
|
-
initializer
|
17
|
-
#app.config.assets.precompile << "config/engine_name_manifest.js"
|
18
|
-
main_app.config.assets.precompile <<
|
19
|
-
main_app.config.assets.precompile <<
|
18
|
+
initializer 'geo_labels.assets.precompile' do |main_app|
|
19
|
+
# app.config.assets.precompile << "config/engine_name_manifest.js"
|
20
|
+
main_app.config.assets.precompile << 'geo_labels/application.css'
|
21
|
+
main_app.config.assets.precompile << 'geo_labels/application.js'
|
20
22
|
|
21
23
|
# Engine specific config
|
22
24
|
main_app.config.x.geo_labels.application_title ||= -> { 'GEO-labels' }
|
23
25
|
main_app.config.x.geo_labels.link_home_content ||= -> { '<i class="arrow left icon"></i> Back' }
|
24
|
-
main_app.config.x.geo_labels.google_api_key ||=
|
26
|
+
main_app.config.x.geo_labels.google_api_key ||= ENV['GOOGLE_API_KEY'] || 'GOOGLE_API_KEY'
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.client_paths
|
30
|
+
{
|
31
|
+
mount: routes.find_script_name({}),
|
32
|
+
get_rating: routes.url_helpers.get_rating_path,
|
33
|
+
set_rating: routes.url_helpers.set_rating_path
|
34
|
+
}
|
25
35
|
end
|
26
36
|
|
27
37
|
# add migrations to containing application
|
28
38
|
initializer 'geo_labels.append_migrations' do |app|
|
29
39
|
unless app.root.to_s.match root.to_s
|
30
|
-
config.paths[
|
31
|
-
app.config.paths[
|
40
|
+
config.paths['db/migrate'].expanded.each do |expanded_path|
|
41
|
+
app.config.paths['db/migrate'] << expanded_path
|
32
42
|
end
|
33
43
|
end
|
34
44
|
end
|
data/lib/geo_labels/exporter.rb
CHANGED
@@ -1,16 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'yaml'
|
2
3
|
module GeoLabels
|
3
4
|
class Exporter
|
5
|
+
|
4
6
|
def self.export_h
|
5
|
-
|
7
|
+
{
|
6
8
|
'labels' => labels_tree,
|
7
|
-
'contacts' =>
|
8
|
-
contact.attributes.merge('labels' => contact.labels.map(&:name)).select{ |attr, val|
|
9
|
-
val.present? and not %w[id created_at updated_at].include?(attr)
|
10
|
-
}
|
11
|
-
}
|
9
|
+
'contacts' => contacts_h
|
12
10
|
}
|
13
|
-
obj
|
14
11
|
end
|
15
12
|
|
16
13
|
def self.export_str
|
@@ -20,11 +17,11 @@ module GeoLabels
|
|
20
17
|
# Formats the tree structure from labels_tree_h to a string output
|
21
18
|
# can be called with add_punctuation: '-' to add dashes
|
22
19
|
def self.labels_tree(add_punctuation: nil)
|
23
|
-
output =
|
24
|
-
tree_formatter =
|
20
|
+
output = ''
|
21
|
+
tree_formatter = proc do |items, lead_space|
|
25
22
|
items.each do |item|
|
26
23
|
output += "#{lead_space}#{item[:name]}\n"
|
27
|
-
tree_formatter.call(item[:children], lead_space
|
24
|
+
tree_formatter.call(item[:children], "#{lead_space} ") if item[:children].present?
|
28
25
|
end
|
29
26
|
end
|
30
27
|
tree_formatter.call(labels_tree_h, '')
|
@@ -32,6 +29,23 @@ module GeoLabels
|
|
32
29
|
output
|
33
30
|
end
|
34
31
|
|
32
|
+
def self.contacts_h
|
33
|
+
GeoLabels::Contact.includes(:labels).map do |contact|
|
34
|
+
contact
|
35
|
+
.attributes
|
36
|
+
.slice(*%w[name street subsection city department country state description latitude longitude])
|
37
|
+
.merge('labels' => contact.labels.map(&:name))
|
38
|
+
.select { |_, v| v.present? }
|
39
|
+
.transform_values do |value|
|
40
|
+
case value
|
41
|
+
when Date, Time then value.iso8601
|
42
|
+
when BigDecimal then value.to_f
|
43
|
+
else value
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
35
49
|
# Returns an array having the tree structure as ruby objects
|
36
50
|
def self.labels_tree_h
|
37
51
|
labels = GeoLabels::Label.order(:name).to_a
|
data/lib/geo_labels/importer.rb
CHANGED
@@ -1,27 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module GeoLabels
|
2
3
|
module Importer
|
3
4
|
def self.import(subject)
|
4
|
-
yaml_h =
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
5
|
+
yaml_h = case subject
|
6
|
+
when String
|
7
|
+
if subject.start_with?('/') or subject.start_with?('./')
|
8
|
+
YAML.load_file(subject)
|
9
|
+
else
|
10
|
+
YAML.safe_load(subject)
|
11
|
+
end
|
12
|
+
when File then YAML.safe_load(subject.read)
|
13
|
+
when Pathname then YAML.safe_load(subject.read)
|
14
|
+
when ActionDispatch::Http::UploadedFile then YAML.safe_load(subject.read)
|
15
|
+
else
|
16
|
+
raise 'Argument not recognized'
|
17
|
+
end
|
17
18
|
GeoLabels::Contact.delete_all
|
18
19
|
GeoLabels::Label.delete_all
|
19
20
|
GeoLabels::ContactLabel.delete_all
|
20
21
|
labels_dict = persist_labels_tree yaml_h['labels']
|
21
22
|
yaml_h['contacts'].each do |contact_attributes|
|
22
|
-
label_names = Array(contact_attributes.delete
|
23
|
+
label_names = Array(contact_attributes.delete('labels'))
|
23
24
|
contact = GeoLabels::Contact.new(contact_attributes)
|
24
|
-
contact.labels = label_names.map{labels_dict[_1]}.compact
|
25
|
+
contact.labels = label_names.map{ labels_dict[_1] }.compact
|
25
26
|
contact.save
|
26
27
|
end
|
27
28
|
GeoLabels::Contact.count
|
@@ -29,13 +30,13 @@ module GeoLabels
|
|
29
30
|
|
30
31
|
def self.labels_text_to_tree(tree_text)
|
31
32
|
txt = tree_text.gsub("\n\u0001", "\n") # remove START OF HEADING TRASH
|
32
|
-
txt.gsub! /^(\s*)[
|
33
|
+
txt.gsub! /^(\s*)[-*] /, '\1 ' # remove list punctuations and interpret just the spaces
|
33
34
|
lines = txt.split("\n")
|
34
35
|
root_label, current_indentation = ImportLabel.new('root'), -1
|
35
36
|
working_object = root_label
|
36
37
|
lines.each do |line|
|
37
38
|
line_indentation = (line.match(/\s+/).try(:[], 0).try(:size) || 0) / 2
|
38
|
-
#name = line[(2*line_indentation)..] # strip the leading spaces
|
39
|
+
# name = line[(2*line_indentation)..] # strip the leading spaces
|
39
40
|
name = line.strip
|
40
41
|
label = ImportLabel.new(name)
|
41
42
|
if line_indentation > current_indentation # level deeper
|
@@ -55,13 +56,13 @@ module GeoLabels
|
|
55
56
|
|
56
57
|
def self.persist_labels_tree(tree_or_text = nil)
|
57
58
|
tree = case tree_or_text
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
59
|
+
when ImportLabel then tree_or_text
|
60
|
+
when String then labels_text_to_tree(tree_or_text)
|
61
|
+
else
|
62
|
+
raise 'Must provide a tree label object or tree text'
|
63
|
+
end
|
63
64
|
record_lookup_dict = {}
|
64
|
-
persister =
|
65
|
+
persister = proc do |items, parent|
|
65
66
|
items.each do |item|
|
66
67
|
record = Label.create name: item.name, parent: parent
|
67
68
|
record_lookup_dict[item.name] = record
|
@@ -73,11 +74,14 @@ module GeoLabels
|
|
73
74
|
end
|
74
75
|
|
75
76
|
class LabelList < Array
|
77
|
+
|
76
78
|
attr_accessor :parent
|
77
79
|
end
|
78
80
|
|
79
81
|
class ImportLabel
|
80
|
-
|
82
|
+
|
83
|
+
attr_accessor :name, :parent
|
84
|
+
|
81
85
|
def initialize(name)
|
82
86
|
@name = name
|
83
87
|
end
|
@@ -103,9 +107,9 @@ module GeoLabels
|
|
103
107
|
end
|
104
108
|
|
105
109
|
def inspect
|
106
|
-
#"#{name} => #{children.inspect}"
|
107
|
-
#children.any? ? "<#{name}> => #{children.inpsect}" : "#{name}"
|
108
|
-
base =
|
110
|
+
# "#{name} => #{children.inspect}"
|
111
|
+
# children.any? ? "<#{name}> => #{children.inpsect}" : "#{name}"
|
112
|
+
base = name.to_s
|
109
113
|
base = "#{base} => #{children.inspect}" if children.any?
|
110
114
|
base
|
111
115
|
end
|
data/lib/geo_labels/version.rb
CHANGED
data/lib/geo_labels.rb
CHANGED