magic_addresses 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/README.md +58 -4
- data/app/views/magic_addresses/addresses/_address_fields.html.erb +1 -1
- data/app/views/magic_addresses/addresses/_addresses_fields.html.erb +1 -1
- data/lib/app/models/magic_addresses/address.rb +116 -41
- data/lib/app/models/magic_addresses/addressible.rb +21 -0
- data/lib/app/models/magic_addresses/association.rb +51 -15
- data/lib/app/models/magic_addresses/owner_proxy.rb +14 -0
- data/lib/generators/magic_addresses/add_earthdistance_generator.rb +25 -0
- data/lib/generators/magic_addresses/templates/earthdistance_migration.rb +32 -0
- data/lib/generators/magic_addresses/templates/geocoder_initializer.rb +4 -2
- data/lib/generators/magic_addresses/templates/magic_addresses_migration.rb +5 -0
- data/lib/generators/magic_addresses/templates/magic_initializer.rb +15 -9
- data/lib/generators/magic_addresses/templates/update_address_migration.rb +45 -0
- data/lib/generators/magic_addresses/update_generator.rb +25 -0
- data/lib/magic_addresses/configuration.rb +18 -6
- data/lib/magic_addresses/version.rb +1 -1
- data/lib/magic_addresses.rb +6 -0
- data/spec/dummy/app/models/company.rb +5 -0
- data/spec/dummy/app/views/users/index.html.erb +2 -2
- data/spec/dummy/config/environments/test.rb +5 -0
- data/spec/dummy/config/initializers/magic_addresses.rb +11 -3
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20151111133333_create_companies.rb +10 -0
- data/spec/dummy/db/migrate/20151118102658_update_magic_addresses.rb +45 -0
- data/spec/dummy/db/schema.rb +23 -7
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +18969 -70324
- data/spec/dummy/log/test.log +42010 -94562
- data/spec/dummy/tmp/pids/server.pid +1 -0
- data/spec/models/company_spec.rb +17 -0
- data/spec/models/magic_addresses/address_spec.rb +52 -27
- data/spec/models/user_spec.rb +23 -0
- data/spec/rails_helper.rb +3 -0
- metadata +35 -399
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_aside_nav.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_banner.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_box.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_buttons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_buttons_nice.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_forms.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_helper.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_icons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_inputs.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_labels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_navbar.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_notice.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_panel.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/19b60152c4654e1688273867e38ff5e0b6236ab2/_pix.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_alerts.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_background-variant.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_border-radius.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_buttons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_center-block.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_clearfix.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_forms.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_gradients.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_grid-framework.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_grid.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_hide-text.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_image.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_labels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_list-group.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_nav-divider.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_nav-vertical-align.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_opacity.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_pagination.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_panels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_progress-bar.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_reset-filter.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_resize.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_responsive-visibility.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_size.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_tab-focus.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_table-row.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_text-emphasis.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_text-overflow.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/24c51698ad01336e4b987229e799c2cc59a52365/_vendor-prefixes.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/2557903008e29020a1e41f44af8141d40a1e1147/_corset.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/2557903008e29020a1e41f44af8141d40a1e1147/_fullpage_table.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/2557903008e29020a1e41f44af8141d40a1e1147/_section.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/4a366ea161250132a268ef32a1b08cac8de6b5ae/_asset-pipeline.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/4a366ea161250132a268ef32a1b08cac8de6b5ae/_prefixer.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/4a366ea161250132a268ef32a1b08cac8de6b5ae/_px-to-em.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/51b770beda224b19a22a5fcca280d5fcfa460146/_colors.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/51b770beda224b19a22a5fcca280d5fcfa460146/_fonts.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/51b770beda224b19a22a5fcca280d5fcfa460146/_variables.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_animation.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_appearance.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_backface-visibility.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_background-image.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_background.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_border-image.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_border-radius.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_box-sizing.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_calc.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_columns.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_filter.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_flex-box.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_font-face.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_font-feature-settings.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_hidpi-media-query.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_hyphens.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_image-rendering.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_keyframes.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_linear-gradient.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_perspective.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_placeholder.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_radial-gradient.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_selection.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_text-decoration.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_transform.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_transition.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/54164dda167544c9a2234eb3643bf0895da180fd/_user-select.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/5dac14e9bcf503fc8fa7c4f4440118fabc865d43/autocomplete.cssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/65afb1d40636d95636e95a91bc4e33776a5f48ba/magic-stylez.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/67eeb42d1b5d8b7a99a388bcbdece61f954c9cb0/icomoon.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/67eeb42d1b5d8b7a99a388bcbdece61f954c9cb0/magicons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/67eeb42d1b5d8b7a99a388bcbdece61f954c9cb0/orderlifticons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_assign.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_color-lightness.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_contains.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_is-length.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_is-size.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_modular-scale.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_px-to-em.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_px-to-rem.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_strip-units.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_tint-shade.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_transition-property-name.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6b16abfb17fe2503733e43257f3ae1774c687e5f/_unpack.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_convert-units.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_font-source-declaration.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_gradient-positions-parser.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_is-num.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_linear-angle-parser.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_linear-gradient-parser.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_linear-positions-parser.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_linear-side-corner-parser.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_radial-arg-parser.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_radial-gradient-parser.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_radial-positions-parser.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_render-gradients.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_shape-size-stripper.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/75433b62dd2cb96bb75c34d9a3e28f92ab357b7f/_str-to-num.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_alerts.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_badges.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_breadcrumbs.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_button-groups.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_buttons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_carousel.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_close.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_code.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_component-animations.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_dropdowns.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_forms.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_glyphicons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_grid.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_input-groups.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_jumbotron.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_labels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_list-group.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_media.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_mixins.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_modals.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_navbar.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_navs.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_normalize.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_pager.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_pagination.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_panels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_popovers.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_print.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_progress-bars.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_responsive-embed.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_responsive-utilities.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_scaffolding.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_tables.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_thumbnails.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_tooltip.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_type.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_utilities.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_variables.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/92cf243fa656f5697aab51e7d90e01c1822b2659/_wells.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ba4757a1a53e47b8d77e8b3e570956e2688fcda4/_bourbon-deprecated-upcoming.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ba4757a1a53e47b8d77e8b3e570956e2688fcda4/_bourbon.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/bbf3f90fe22893a2ce61a9eb12fae3a9f2defd14/_animation.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/bbf3f90fe22893a2ce61a9eb12fae3a9f2defd14/_cross_browser.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/bbf3f90fe22893a2ce61a9eb12fae3a9f2defd14/_filter.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/bbf3f90fe22893a2ce61a9eb12fae3a9f2defd14/_forms.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/bbf3f90fe22893a2ce61a9eb12fae3a9f2defd14/_helper.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/bbf3f90fe22893a2ce61a9eb12fae3a9f2defd14/_media_querries.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/bbf3f90fe22893a2ce61a9eb12fae3a9f2defd14/_text.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/bbf3f90fe22893a2ce61a9eb12fae3a9f2defd14/_twbs.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/d11e29c08f9a4c5de5e232de8e0405a1753a5793/application.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/d6dffb77922b7d3b25f0a1059d1311e3279ff693/_circle_diagram.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_clearfix.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_directional-values.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_ellipsis.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_font-family.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_hide-text.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_html5-input-types.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_position.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_prefixer.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_retina-image.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_size.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_timing-functions.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_triangle.scssc +0 -392
- data/spec/dummy/tmp/cache/assets/development/sass/de5c39bfb8e330e076983d775f6d2e28dbe78636/_word-wrap.scssc +0 -42
- data/spec/dummy/tmp/cache/assets/development/sass/e0bbbca13012c1d2a33d6ed35ab7224d7120f071/_all.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/e0bbbca13012c1d2a33d6ed35ab7224d7120f071/_arrow_hints.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/e0bbbca13012c1d2a33d6ed35ab7224d7120f071/_crossed.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/e0bbbca13012c1d2a33d6ed35ab7224d7120f071/_divider.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/e0bbbca13012c1d2a33d6ed35ab7224d7120f071/_dots.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/e0bbbca13012c1d2a33d6ed35ab7224d7120f071/_text.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/e0bbbca13012c1d2a33d6ed35ab7224d7120f071/_three_previews.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/e68899ee835edcf02d7ab60e48d61fa544850864/_nav.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ec54c41325c4a582d617d517b74a3bd29b054c6a/_reflections.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ec54c41325c4a582d617d517b74a3bd29b054c6a/_shadows.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
OTkzYTVhZmQyZmJiZjJjYjdlMmE5MzVlZWVlODBhNmVjZGM3MTU3MQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 04b5e9909e1b2e874ca012a22f9ec278cb2a6c4f
|
4
|
+
data.tar.gz: dfa7e10310297100ff901bf1abf04dacce29eeee
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
NjE2NmExNjg3NWRjOWZmOWRjMTEwNTIzYjEyMDAzNzk5MzcwOWVlOGQ5OTdi
|
11
|
-
NGNlNTEzN2NlMGE0NTkxMzMwZGQzOWI5ZTk5OThiYjY3ZDk4NWE=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ZmM2ZDY1N2Q0ZjUyNGRiYzMwYTA1MTMzYzczNjA1YjhhNjI4MjRlOWI3MjIy
|
14
|
-
YWU5Y2MyNDJhMzQyNzEzYTE2ZmUzNTRiYjFmMzkzOGI0OTUyYWVkZTQzN2Vm
|
15
|
-
ODVlNGYwZTkwNjZkZjg0NzVhNzIyMWIxYTJjMTRhMzc0NGFkNmY=
|
6
|
+
metadata.gz: 0d3f5fb35f5dab3de3f50699581e82c117bc591dd5a14f63fa2f1e23115593146a11d374b8c270721801d3112fb31d3ebddd5a974ab1b4b620ee49af8cb4e4a1
|
7
|
+
data.tar.gz: 3e73a954d8c9e3bd148ba8cb876c0ade5a35f5764f2c75c88bad454120b2c3efe65d04f92d20edf42c0d71c79de4394ba17f08974989d997b3b268d5915916e8
|
data/README.md
CHANGED
@@ -15,7 +15,38 @@ rails g magic_addresses:install
|
|
15
15
|
- 4. **add to your models**
|
16
16
|
|
17
17
|
|
18
|
-
|
18
|
+
## Features
|
19
|
+
|
20
|
+
- full tranlated addresses
|
21
|
+
- allways correct addresses (query to google/verbatim service)
|
22
|
+
- addresses, cities, countries, and so one, are uniq (i.e. only one "New-York" with lots of addresses, districts, ..)
|
23
|
+
- perfect order ( city has X addresses )
|
24
|
+
- postgresql earthdistance included (for distance checks)
|
25
|
+
- tested
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
## New
|
31
|
+
since version `0.0.13` addresses are uniq, so the same address never will be saved twice, instead owners share one address
|
32
|
+
|
33
|
+
run:
|
34
|
+
```ruby
|
35
|
+
rails g magic_addresses:update
|
36
|
+
```
|
37
|
+
to update old addresses and add the new structure
|
38
|
+
|
39
|
+
|
40
|
+
##### You can add Earthdistance plugin later!
|
41
|
+
run:
|
42
|
+
```ruby
|
43
|
+
rails g magic_addresses:add_earthdistance
|
44
|
+
```
|
45
|
+
be sure to activate it in initializer before migrate!
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
### Model methods
|
19
50
|
|
20
51
|
```ruby
|
21
52
|
has_one_address # => This model has one address associated with it. (ie: User)
|
@@ -29,7 +60,7 @@ rails g magic_addresses:install
|
|
29
60
|
|
30
61
|
```
|
31
62
|
|
32
|
-
|
63
|
+
### View Mehtods
|
33
64
|
|
34
65
|
```ruby
|
35
66
|
|
@@ -41,7 +72,7 @@ rails g magic_addresses:install
|
|
41
72
|
|
42
73
|
```
|
43
74
|
|
44
|
-
|
75
|
+
### in your Controllers:
|
45
76
|
|
46
77
|
```ruby
|
47
78
|
|
@@ -66,6 +97,29 @@ rails g magic_addresses:install
|
|
66
97
|
```
|
67
98
|
|
68
99
|
|
100
|
+
## Configuration
|
101
|
+
```ruby
|
102
|
+
|
103
|
+
MagicAddresses.configure do |config|
|
104
|
+
# in which locales addresses should be saved
|
105
|
+
config.active_locales = [:en, :de]
|
106
|
+
# what is the default language (should be :en, except you don't need english at all)
|
107
|
+
config.default_locale = :en
|
108
|
+
# what is the default country for query
|
109
|
+
config.default_country = "Germany"
|
110
|
+
# add default country in each query ?
|
111
|
+
config.query_defaults = true
|
112
|
+
# only save tranlations when differs from default-locale?
|
113
|
+
config.uniq_translations = true
|
114
|
+
# use a background-process for the lookups ( :none | :sidekiq )
|
115
|
+
config.job_backend = :none
|
116
|
+
# use a postgres earthdistance for distance calculation
|
117
|
+
config.earthdistance = false
|
118
|
+
end
|
119
|
+
|
120
|
+
```
|
121
|
+
|
122
|
+
|
69
123
|
|
70
124
|
#### Structure
|
71
125
|
|
@@ -105,7 +159,7 @@ Address:
|
|
105
159
|
```
|
106
160
|
|
107
161
|
|
108
|
-
.. will more info, sometimes ...
|
162
|
+
.. will add more info, sometimes ...
|
109
163
|
|
110
164
|
|
111
165
|
This project rocks and uses MIT-LICENSE.
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<% idkey = "locations_attributes_#{rand(999999)}_" %>
|
4
4
|
<div class="map_form">
|
5
5
|
|
6
|
-
<input type="text" id="<%= idkey %>map_data" class="mgca_map_data <%= style %>" placeholder="<%= placeholder %>" value="<%= f.object.presentation %>" />
|
6
|
+
<input type="text" id="<%= idkey %>map_data" class="mgca_map_data <%= style %>" placeholder="<%= placeholder %>" value="<%= f.object ? f.object.presentation : "" %>" autocomplete="false" role="presentation" />
|
7
7
|
|
8
8
|
<div class="hidden_mgca_form">
|
9
9
|
<div class="row">
|
@@ -8,7 +8,7 @@
|
|
8
8
|
</div>
|
9
9
|
|
10
10
|
<div class="fields">
|
11
|
-
<input type="text" id="<%= idkey %>map_data" class="mgca_short_data <%= style %>" placeholder="<%= placeholder %>" value="<%= f.object.presentation %>"/>
|
11
|
+
<input type="text" id="<%= idkey %>map_data" class="mgca_short_data <%= style %>" placeholder="<%= placeholder %>" value="<%= f.object ? f.object.presentation : "" %>" autocomplete="false" role="presentation" />
|
12
12
|
<%= f.hidden_field :street, class: "mgca_txt street", id: "#{idkey}street" %>
|
13
13
|
<%= f.hidden_field :street_number, class: "mgca_txt street_number", id: "#{idkey}street_number" %>
|
14
14
|
<%= f.hidden_field :latitude, id: "#{idkey}latitude", class: "mgca_latitude" %>
|
@@ -10,7 +10,14 @@ class MagicAddresses::Address < ActiveRecord::Base
|
|
10
10
|
|
11
11
|
|
12
12
|
# =====> A S S O Z I A T I O N S <========================================================= #
|
13
|
-
|
13
|
+
has_many :addressibles, class_name: "MagicAddresses::Addressible", foreign_key: :address_id
|
14
|
+
|
15
|
+
|
16
|
+
## add associations (set in configuration)
|
17
|
+
MagicAddresses.configuration.address_owners.each do |key,type|
|
18
|
+
has_many key.to_sym, through: :addressibles, source: :owner, source_type: type
|
19
|
+
end
|
20
|
+
|
14
21
|
|
15
22
|
belongs_to :magic_country, class_name: "MagicAddresses::Country", foreign_key: :country_id
|
16
23
|
belongs_to :magic_state, class_name: "MagicAddresses::State", foreign_key: :state_id
|
@@ -23,13 +30,14 @@ class MagicAddresses::Address < ActiveRecord::Base
|
|
23
30
|
# address.street_name # => street in I18n.locale
|
24
31
|
# address.read_attribute(:street_name, locale: :de) # => street in german (:de), no fallback
|
25
32
|
#
|
26
|
-
# translates :street_name, fallbacks_for_empty_translations: true #, table_name: "mgca_addresses"
|
27
33
|
mgca_translate :street_name
|
28
34
|
|
29
35
|
acts_as_geolocated lat: 'latitude', lng: 'longitude' if MagicAddresses.configuration.earthdistance
|
30
36
|
|
31
37
|
|
32
38
|
# =====> A T T R I B U T E S <============================================================= #
|
39
|
+
# accepts_nested_attributes_for :translations
|
40
|
+
|
33
41
|
serialize :fetch_address, Hash
|
34
42
|
|
35
43
|
%w[fetch_street fetch_number fetch_city fetch_zipcode fetch_country fetch_country_code].each do |key|
|
@@ -81,16 +89,16 @@ class MagicAddresses::Address < ActiveRecord::Base
|
|
81
89
|
self.fetch_address = (fetch_address || {}).merge("fetch_country_code" => value)
|
82
90
|
end
|
83
91
|
|
92
|
+
def owner=(this)
|
93
|
+
self.addressibles.where( owner_type: this.class.to_s, owner_id: this.id ).first_or_create!
|
94
|
+
end
|
84
95
|
|
85
|
-
# accepts_nested_attributes_for :translations
|
86
|
-
|
87
|
-
|
88
|
-
# =====> V A L I D A T I O N <============================================================= #
|
89
|
-
# => validates :owner, :presence => true
|
90
96
|
|
91
97
|
|
92
98
|
# =====> C A L L B A C K S <=============================================================== #
|
93
|
-
|
99
|
+
## now in addressible or doesnt work nested ..
|
100
|
+
# => after_save :build_address_associations_if_needed
|
101
|
+
# => after_create :build_address_associations_if_needed
|
94
102
|
|
95
103
|
# =====> S C O P E S <===================================================================== #
|
96
104
|
|
@@ -114,11 +122,25 @@ class MagicAddresses::Address < ActiveRecord::Base
|
|
114
122
|
end
|
115
123
|
end
|
116
124
|
|
125
|
+
def owners
|
126
|
+
addressibles.map { |that| ::MagicAddresses::OwnerProxy.new( that ) }
|
127
|
+
end
|
128
|
+
|
129
|
+
def trigger_build_address_associations
|
130
|
+
build_address_associations()
|
131
|
+
end
|
132
|
+
|
133
|
+
def trigger_complete_translated_attributes
|
134
|
+
complete_translated_attributes()
|
135
|
+
end
|
136
|
+
|
137
|
+
|
117
138
|
# =====> P R I V A T E ! <======================================================== # # # # # # # #
|
118
139
|
private
|
119
140
|
|
120
141
|
def build_address_associations_if_needed
|
121
|
-
if self.new_record? || self.fetch_street.present? || self.fetch_city.present? || self.fetch_zipcode.present? || self.fetch_number.present?
|
142
|
+
#if self.new_record? || self.fetch_street.present? || self.fetch_city.present? || self.fetch_zipcode.present? || self.fetch_number.present?
|
143
|
+
if self.new_record? || !["fetched", "translated"].include?( self.status )
|
122
144
|
build_address_associations
|
123
145
|
else
|
124
146
|
true
|
@@ -128,52 +150,94 @@ private
|
|
128
150
|
def build_address_associations
|
129
151
|
dev_log "triggered A D D R E S S - B U I L D E R ! - - #{self.street} #{self.number} #{self.city} #{self.zipcode}"
|
130
152
|
|
131
|
-
addr = []
|
132
153
|
if self.fetch_city.present? || self.fetch_zipcode.present?
|
154
|
+
self.fetch_address["addr"] = []
|
133
155
|
# MagicAddresses::GeoCoder
|
134
|
-
addr << "#{self.fetch_street} #{self.fetch_number}".strip if self.fetch_street
|
135
|
-
addr << "#{self.fetch_zipcode} #{self.fetch_city}".strip if self.fetch_city || self.fetch_zipcode
|
136
|
-
|
156
|
+
self.fetch_address["addr"] << "#{self.fetch_street} #{self.fetch_number}".strip if self.fetch_street
|
157
|
+
self.fetch_address["addr"] << "#{self.fetch_zipcode} #{self.fetch_city}".strip if self.fetch_city || self.fetch_zipcode
|
158
|
+
if MagicAddresses.configuration.query_defaults
|
159
|
+
self.fetch_address["addr"] << "#{self.fetch_country || self.fetch_country_code || MagicAddresses.configuration.default_country}".strip
|
160
|
+
else
|
161
|
+
self.fetch_address["addr"] << "#{self.fetch_country || self.fetch_country_code}".strip if self.fetch_country || self.fetch_country
|
162
|
+
end
|
137
163
|
end
|
138
164
|
|
139
|
-
self.fetch_address = {}
|
140
165
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
166
|
+
if self.fetch_address["addr"] && self.fetch_address["addr"].any?
|
167
|
+
self.fetch_address["geo_data"] = {}
|
168
|
+
gd = MagicAddresses::GeoCoder.search(self.fetch_address["addr"].join(", "), default_locale)
|
169
|
+
self.fetch_address["geo_data"][default_locale] = gd.first if gd.first
|
170
|
+
self.fetch_address["fetched"] = true
|
171
|
+
self.status = "fetched"
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
if self.fetch_address["geo_data"] && self.fetch_address["geo_data"].any?
|
176
|
+
geo_data = self.fetch_address["geo_data"][default_locale]
|
177
|
+
sames = MagicAddresses::Address.where( latitude: geo_data.latitude,
|
178
|
+
longitude: geo_data.longitude,
|
179
|
+
zipcode: geo_data.postal_code,
|
180
|
+
street_number: geo_data.street_number )
|
181
|
+
dev_log "Address.count: #{ MagicAddresses::Address.all.count } .. . .. SAMES.count: #{ sames.count }"
|
182
|
+
if sames.any? && sames.first != self
|
183
|
+
dev_log " found similar address .. will use that !!!"
|
184
|
+
dev_log "addressibles #{self.addressibles.count}"
|
185
|
+
that = sames.first
|
186
|
+
dev_log "owners - #{self.owners.inspect}"
|
187
|
+
self.addressibles.each do |x|
|
188
|
+
dev_log "kill - #{x.address_id}"
|
189
|
+
x.address_id = that.id
|
190
|
+
x.save
|
191
|
+
# x.owner.touch
|
192
|
+
dev_log "kill - #{x.address_id}"
|
193
|
+
end
|
194
|
+
self.destroy
|
195
|
+
else
|
196
|
+
dev_log " geo_data is present !!!"
|
197
|
+
self.street_default = geo_data.street if geo_data && geo_data.street
|
198
|
+
self.zipcode = geo_data.postal_code if geo_data && geo_data.postal_code
|
199
|
+
self.street_number = geo_data.street_number if geo_data && geo_data.street_number
|
200
|
+
# set geo-position
|
201
|
+
self.latitude = geo_data.latitude if geo_data && geo_data.latitude
|
202
|
+
self.longitude = geo_data.longitude if geo_data && geo_data.longitude
|
203
|
+
# translate other languages
|
204
|
+
|
205
|
+
if MagicAddresses.configuration.job_backend == :sidekiq
|
206
|
+
AddressWorker.perform_async( self.id )
|
207
|
+
else
|
208
|
+
complete_translated_attributes()
|
151
209
|
end
|
210
|
+
|
211
|
+
self.save
|
152
212
|
end
|
213
|
+
|
153
214
|
end
|
154
|
-
if geo_data.any?
|
155
|
-
dev_log " geo_data is present !!!"
|
156
|
-
# set default values
|
157
|
-
self.street_default = geo_data[default_locale].street if geo_data[default_locale] && geo_data[default_locale].street
|
158
|
-
self.zipcode = geo_data[default_locale].postal_code if geo_data[default_locale] && geo_data[default_locale].postal_code
|
159
|
-
self.street_number = geo_data[default_locale].street_number if geo_data[default_locale] && geo_data[default_locale].street_number
|
160
|
-
# set geo-position
|
161
|
-
self.latitude = geo_data[default_locale].latitude if geo_data[default_locale] && geo_data[default_locale].latitude
|
162
|
-
self.longitude = geo_data[default_locale].longitude if geo_data[default_locale] && geo_data[default_locale].longitude
|
163
|
-
end
|
164
|
-
complete_translated_attributes( geo_data )
|
165
215
|
|
166
|
-
self.fetch_address = {}
|
167
|
-
self.save
|
168
216
|
end
|
169
217
|
|
170
218
|
|
171
|
-
def complete_translated_attributes
|
219
|
+
def complete_translated_attributes
|
220
|
+
|
221
|
+
MagicAddresses.configuration.active_locales.each do |lcl|
|
222
|
+
unless lcl.to_s == default_locale
|
223
|
+
sleep 0.3
|
224
|
+
gd = MagicAddresses::GeoCoder.search( self.fetch_address["addr"].join(", "), lcl.to_s )
|
225
|
+
self.fetch_address["geo_data"][lcl.to_s] = gd.first if gd.first
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
geo_data = self.fetch_address["geo_data"]
|
230
|
+
|
172
231
|
if geo_data.any?
|
173
232
|
# build street parameters
|
174
233
|
street_params = []
|
175
234
|
geo_data.each do |key, stuff|
|
176
|
-
|
235
|
+
if MagicAddresses.configuration.uniq_translations
|
236
|
+
# => only save locale if different from default-locale:
|
237
|
+
street_params << { locale: key.to_s, street_name: stuff.street } if stuff.street && ((stuff.street != geo_data[default_locale].street) || (default_locale == key.to_s))
|
238
|
+
else
|
239
|
+
street_params << { locale: key.to_s, street_name: stuff.street } if stuff.street
|
240
|
+
end
|
177
241
|
end
|
178
242
|
# set street parameters if present
|
179
243
|
if street_params.any?
|
@@ -209,6 +273,10 @@ private
|
|
209
273
|
connet_address_association( :subdistrict, geo_data )
|
210
274
|
end
|
211
275
|
|
276
|
+
self.fetch_address = {}
|
277
|
+
self.status = "translated"
|
278
|
+
self.save
|
279
|
+
|
212
280
|
end
|
213
281
|
end
|
214
282
|
|
@@ -229,7 +297,8 @@ private
|
|
229
297
|
|
230
298
|
dev_log "#{that} .. #{this}"
|
231
299
|
|
232
|
-
self.send(this).translations = []
|
300
|
+
# self.send(this).translations = []
|
301
|
+
self.send(this).translations.delete_all
|
233
302
|
self.send(this).translations_attributes = lng_params( that, geo_data )
|
234
303
|
self.send(this).save
|
235
304
|
end
|
@@ -240,7 +309,13 @@ private
|
|
240
309
|
lng_params = []
|
241
310
|
geo_data.each do |key, stuff|
|
242
311
|
dev_log "#{that.to_s.titleize}-Params (#{key}) ... #{stuff.send(that)}"
|
243
|
-
|
312
|
+
|
313
|
+
if MagicAddresses.configuration.uniq_translations
|
314
|
+
# => only save locale if different from default-locale:
|
315
|
+
lng_params << { locale: key.to_s, name: stuff.send(that) } if stuff.send(that) && ((stuff.send(that) != geo_data[default_locale].send(that)) || (key.to_s == default_locale))
|
316
|
+
else
|
317
|
+
lng_params << { locale: key.to_s, name: stuff.send(that) } if stuff.send(that)
|
318
|
+
end
|
244
319
|
end
|
245
320
|
lng_params
|
246
321
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
class MagicAddresses::Addressible < ActiveRecord::Base
|
3
|
+
|
4
|
+
belongs_to :owner, polymorphic: true
|
5
|
+
belongs_to :address, class_name: "MagicAddresses::Address", foreign_key: :address_id
|
6
|
+
|
7
|
+
after_create :log_some_stuff
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def log_some_stuff
|
12
|
+
Rails.logger.info "==="
|
13
|
+
Rails.logger.info "=== #{self.inspect}"
|
14
|
+
Rails.logger.info "==="
|
15
|
+
self.address ? self.address.trigger_build_address_associations : true
|
16
|
+
Rails.logger.info "==="
|
17
|
+
Rails.logger.info "=== #{self.inspect}"
|
18
|
+
Rails.logger.info "==="
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -11,31 +11,58 @@ module MagicAddresses
|
|
11
11
|
|
12
12
|
|
13
13
|
def has_addresses
|
14
|
-
has_many :addresses,
|
14
|
+
# has_many :addresses,
|
15
|
+
# as: :owner,
|
16
|
+
# class_name: "MagicAddresses::Address",
|
17
|
+
# dependent: :destroy
|
18
|
+
|
19
|
+
has_many :addressibles,
|
15
20
|
as: :owner,
|
16
|
-
class_name: "MagicAddresses::
|
21
|
+
class_name: "MagicAddresses::Addressible",
|
17
22
|
dependent: :destroy
|
23
|
+
|
24
|
+
has_many :addresses,
|
25
|
+
through: :addressibles,
|
26
|
+
source: :address
|
27
|
+
|
18
28
|
accepts_nested_attributes_for :addresses, allow_destroy: true, reject_if: :all_blank
|
19
29
|
end
|
20
30
|
|
21
31
|
|
22
32
|
def has_one_address
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
33
|
+
send :include, OneInstanceMethods
|
34
|
+
# has_one :address, -> { where(default: true) },
|
35
|
+
# as: :owner,
|
36
|
+
# class_name: "MagicAddresses::Address",
|
37
|
+
# autosave: true,
|
38
|
+
# dependent: :destroy
|
39
|
+
|
40
|
+
has_one :addressible,
|
41
|
+
-> { where(default: true) },
|
42
|
+
as: :owner,
|
43
|
+
class_name: "MagicAddresses::Addressible",
|
27
44
|
dependent: :destroy
|
28
|
-
|
45
|
+
|
46
|
+
has_one :address,
|
47
|
+
through: :addressible,
|
48
|
+
source: :address
|
49
|
+
|
50
|
+
accepts_nested_attributes_for :addressible, :address, allow_destroy: true, reject_if: :all_blank
|
29
51
|
end
|
30
52
|
|
31
53
|
|
32
54
|
def has_nested_address
|
33
|
-
send :include,
|
34
|
-
has_one :address,
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
55
|
+
send :include, NestedInstanceMethods
|
56
|
+
# has_one :address,
|
57
|
+
# as: :owner,
|
58
|
+
# class_name: "MagicAddresses::Address",
|
59
|
+
# autosave: true,
|
60
|
+
# dependent: :destroy
|
61
|
+
|
62
|
+
has_one :addressible, -> { where(default: true) },
|
63
|
+
as: :owner, class_name: "MagicAddresses::Addressible", dependent: :destroy
|
64
|
+
has_one :address, through: :addressibles, source: :address
|
65
|
+
|
39
66
|
delegate :street, :number, :postalcode, :city, :district, :subdistrict, :state, :country,
|
40
67
|
:street=, :number=, :postalcode=, :city=, :country=,
|
41
68
|
to: :address, allow_nil: true
|
@@ -46,8 +73,17 @@ module MagicAddresses
|
|
46
73
|
|
47
74
|
end #> ClassMethods
|
48
75
|
|
49
|
-
## I N S T A N C E - M E T H O D S # # # # # # # # # # # # # # # # # # # # # # #
|
50
|
-
module
|
76
|
+
## I N S T A N C E - M E T H O D S # # # # # # # # # # # # # # # # # # # # # # #
|
77
|
+
module OneInstanceMethods
|
78
|
+
|
79
|
+
# => http://stackoverflow.com/a/6989403/1470996
|
80
|
+
def build_address(params)
|
81
|
+
self.address = MagicAddresses::Address.new(params)
|
82
|
+
end
|
83
|
+
|
84
|
+
end #> InstanceMethods
|
85
|
+
|
86
|
+
module NestedInstanceMethods
|
51
87
|
|
52
88
|
# http://stackoverflow.com/a/4033761
|
53
89
|
def address_with_build
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
class MagicAddresses::OwnerProxy
|
3
|
+
|
4
|
+
attr_accessor :this, :addressible_id, :owner_id, :owner_type, :name
|
5
|
+
|
6
|
+
def initialize( addressible )
|
7
|
+
self.this = addressible.owner
|
8
|
+
self.addressible_id = addressible.id
|
9
|
+
self.owner_id = addressible.owner_id
|
10
|
+
self.owner_type = addressible.owner_type
|
11
|
+
self.name = addressible.owner && addressible.owner.respond_to?(:name) ? addressible.owner.name : nil
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
|
3
|
+
module MagicAddresses
|
4
|
+
module Generators
|
5
|
+
class AddEarthdistanceGenerator < ::Rails::Generators::Base
|
6
|
+
include Rails::Generators::Migration
|
7
|
+
source_root File.expand_path('../templates', __FILE__)
|
8
|
+
desc "add magic_addresses earthdistance migrations"
|
9
|
+
|
10
|
+
def self.next_migration_number(path)
|
11
|
+
unless @prev_migration_nr
|
12
|
+
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
13
|
+
else
|
14
|
+
@prev_migration_nr += 1
|
15
|
+
end
|
16
|
+
@prev_migration_nr.to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
def copy_migrations
|
20
|
+
migration_template( "earthdistance_migration.rb", "db/migrate/add_earthdistance.rb" )
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class AddEarthdistance < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
|
4
|
+
# comented out to avoid PG::InsufficientPrivilege-ERROR
|
5
|
+
# add with cap postgresql:add_extensions
|
6
|
+
# => execute "CREATE EXTENSION IF NOT EXISTS cube"
|
7
|
+
# => execute "CREATE EXTENSION IF NOT EXISTS earthdistance"
|
8
|
+
|
9
|
+
if Rails.env.development? || Rails.env.test?
|
10
|
+
enable_extension "cube"
|
11
|
+
enable_extension "earthdistance"
|
12
|
+
end
|
13
|
+
|
14
|
+
unless index_exists?(:mgca_addresses, [:latitude,:longitude], name: "mgca_addresses_earthdistance_ix")
|
15
|
+
add_earthdistance_index :mgca_addresses, lat: 'latitude', lng: 'longitude'
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.down
|
21
|
+
# => execute "DROP EXTENSION IF EXISTS earthdistance"
|
22
|
+
# => execute "DROP EXTENSION IF EXISTS cube"
|
23
|
+
# comented out in staging and production to avoid PG::InsufficientPrivilege-ERROR .. add with cap postgresql:remove_extensions
|
24
|
+
if Rails.env.development? || Rails.env.test?
|
25
|
+
disable_extension "earthdistance"
|
26
|
+
disable_extension "cube"
|
27
|
+
end
|
28
|
+
|
29
|
+
remove_index :mgca_addresses, [:latitude,:longitude], name: "mgca_addresses_earthdistance_ix"
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# Geocoder initialer slightly changed to work with magic_addresses
|
2
2
|
Geocoder.configure(
|
3
|
+
|
3
4
|
# geocoding options
|
4
5
|
:timeout => 5, # geocoding service timeout (secs)
|
5
6
|
:lookup => :google, # name of geocoding service (symbol)
|
@@ -15,14 +16,15 @@ Geocoder.configure(
|
|
15
16
|
# (if you want to implement custom error handling);
|
16
17
|
# supports SocketError and TimeoutError
|
17
18
|
# :always_raise => [],
|
18
|
-
|
19
|
+
|
19
20
|
# needs to raise OverQueryLimitError to change lookup type when appears
|
20
21
|
:always_raise => [Geocoder::OverQueryLimitError],
|
21
22
|
|
22
23
|
# calculation options
|
23
24
|
# :units => :mi, # :km for kilometers or :mi for miles
|
24
25
|
# :distances => :linear # :spherical or :linear
|
25
|
-
|
26
|
+
|
26
27
|
# needed for nominatim lookups
|
27
28
|
:http_headers => { "User-Agent" => "YOUR-APP-NAME", "Accept-Language" => "de" },
|
29
|
+
|
28
30
|
)
|
@@ -147,6 +147,11 @@ class AddMagicAddresses < ActiveRecord::Migration
|
|
147
147
|
end
|
148
148
|
def down
|
149
149
|
|
150
|
+
# when use postgres earthdistance
|
151
|
+
if MagicAddresses.configuration.earthdistance
|
152
|
+
remove_index :mgca_addresses, [:latitude,:longitude], name: "mgca_addresses_earthdistance_ix"
|
153
|
+
end
|
154
|
+
|
150
155
|
## Addresses
|
151
156
|
remove_index :mgca_addresses, :subdistrict_id
|
152
157
|
remove_index :mgca_addresses, :district_id
|
@@ -1,12 +1,18 @@
|
|
1
1
|
MagicAddresses.configure do |config|
|
2
|
+
# Address Owners .. all models that use addresses (name + class_name => {users: "User", things: "Namespace::Thing"})
|
3
|
+
config.address_owners = {}
|
2
4
|
# in which locales addresses should be saved
|
3
|
-
config.active_locales
|
5
|
+
config.active_locales = [:en, :de]
|
4
6
|
# what is the default language (should be :en, except you don't need english at all)
|
5
|
-
config.default_locale
|
6
|
-
# what is the default country
|
7
|
-
config.default_country
|
8
|
-
#
|
9
|
-
config.
|
10
|
-
#
|
11
|
-
config.
|
12
|
-
|
7
|
+
config.default_locale = :en
|
8
|
+
# what is the default country for query
|
9
|
+
config.default_country = "Germany"
|
10
|
+
# add default country in each query ?
|
11
|
+
config.query_defaults = true
|
12
|
+
# only save tranlations when differs from default-locale?
|
13
|
+
config.uniq_translations = false
|
14
|
+
# use background-process for the lookups ( :none | :sidekiq )
|
15
|
+
config.job_backend = :none
|
16
|
+
# use postgres earthdistance for distance calculation
|
17
|
+
config.earthdistance = false
|
18
|
+
end
|