neighborhood 0.0.1 → 0.1.0

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: 5521f45371fbe97cdd678246ab45140c92d783ee
4
- data.tar.gz: 047178750e1096218bc0cf34ab1abb5254343877
3
+ metadata.gz: a9d37b2adbaa206a5d585a5e05e2754cca94ab66
4
+ data.tar.gz: 6c1047694cd6649fa98d6682ed78f429a46edcd2
5
5
  SHA512:
6
- metadata.gz: d90308a091e8882ac1c4aeeb2a3e7316d1d476868ba27d5290b34e3830767bc48c1d066bc705c17e82a9f6db6f5f65d034b8d139cc46edd304277b553479adec
7
- data.tar.gz: c6619cebc897f075e925c8409eb92bd94b2ea3c727dc990eac00f47e8717e47688587249d118fab52804706131b59ea7deb555b98592e3553bcf6b90d3c72257
6
+ metadata.gz: bb33500ab95e932430dbab64c1d43a1325ecf15c5ae5220c47cf6fda823a5c583ade44bfa0485314f3a1860747792d172fa0b35b13ae8a7fcb94f8b0448b9d2d
7
+ data.tar.gz: db438c434e5e967b9924d559d18d2ebe02dcc0c22213486d2c0b231091575cc97386b1c822d9166c32aabc2ee31bd9b08b64a214c5da7c3d9dacacbdfaf2940c
data/README.md CHANGED
@@ -1,28 +1,92 @@
1
- # Neighborhood
1
+ Neighborhood
2
+ ==========
2
3
 
3
- TODO: Write a gem description
4
+ Neighborhood helps you easily add address fields and geocoding to your Rails
5
+ models.
4
6
 
5
- ## Installation
7
+ It makes use of the [Geocoder gem](https://github.com/alexreisner/geocoder) for
8
+ all geocoding, although it handles some logic behind-the-scenes.
6
9
 
7
- Add this line to your application's Gemfile:
10
+ Installation
11
+ ----------
12
+
13
+ This gem is meant to work with Ruby on Rails projects. I recommend you add it
14
+ to your project's Gemfile:
8
15
 
9
16
  ```ruby
10
- gem 'neighborhood'
17
+ gem 'neighborhood', '~> 0.1.0'
18
+ ```
19
+
20
+ > **WARNING: Neighborhood will likely undergo major changes as I add more
21
+ > features over time. I highly recommend you limit the version in your
22
+ > `Gemfile` when installing Neighborhood (as shown above).**
23
+
24
+ Then install your bundle:
25
+
26
+ ```text
27
+ $ bundle
28
+ ```
29
+
30
+ Usage
31
+ ----------
32
+
33
+ ### Adding Fields to a Model
34
+
35
+ To add address fields to your model, run the generator:
36
+
37
+ ```text
38
+ $ bundle exec rails g neighborhood [Model]
11
39
  ```
12
40
 
13
- And then execute:
41
+ This adds the following fields:
42
+
43
+ * `street_address`
44
+ * `suite_apt`
45
+ * `city`
46
+ * `state`
47
+ * `zip`
48
+ * `country`
49
+ * `phone`
50
+ * `lat`
51
+ * `lng`
52
+ * `full_address`
53
+
54
+ Then migrate your database:
55
+
56
+ ```text
57
+ $ bundle exec rake db:migrate
58
+ ```
14
59
 
15
- $ bundle
60
+ ### Add Auto-Geocoding
61
+
62
+ To add automatic geocoding, add the `in_the_neighborhood` method to the model
63
+ to which you added the fields. For example, if you added these fields to a
64
+ `User` model, it might look like this:
65
+
66
+ ```ruby
67
+ class User < ActiveRecord::Base
68
+ in_the_neighborhood
69
+ end
70
+ ```
16
71
 
17
- Or install it yourself as:
72
+ > **WARNING: Neighborhood's `in_the_neighborhood` is tightly wound to the
73
+ > address fields. You need to make sure you've run the generator (and migrated)
74
+ > before you can mess with this method.
18
75
 
19
- $ gem install neighborhood
76
+ This method add an `after_validation` callback that will geocode the *address*
77
+ on the model. `address` is an instance method made available to you which
78
+ combines the individual address fields into one field.
20
79
 
21
- ## Usage
80
+ When geocoding, Neighborhood automatically sets `lat`, `lng`, `full_address`
81
+ and `country`. Of course, you can still set country automatically, it just may
82
+ be overwritten.
22
83
 
23
- TODO: Write usage instructions here
84
+ > *Note: I know there's a lot missing here. I'm simply adding features and
85
+ > options as I need them. Feel free to contribute if you see something missing
86
+ > that you need.*
24
87
 
25
- ## Contributing
88
+ Contributing
89
+ ----------
26
90
 
27
91
  1. Fork it ( https://github.com/[my-github-username]/neighborhood/fork )
28
92
  2. Create your feature branch (`git checkout -b my-new-feature`)
@@ -0,0 +1,49 @@
1
+ require 'rake'
2
+ require 'rails/generators'
3
+
4
+ class NeighborhoodGenerator < Rails::Generators::Base
5
+ desc "Add address fields and geocoding to a model"
6
+
7
+ source_root File.expand_path('../templates', __FILE__)
8
+
9
+ argument :model, :type => :string
10
+
11
+ def confirm_model
12
+ @model = model.constantize
13
+ rescue
14
+ puts "Can't find the model: #{model}"
15
+ exit
16
+ end
17
+
18
+ def set_references
19
+ @model_pl = @model.to_s.humanize.downcase.pluralize
20
+ end
21
+
22
+ def generate_migration
23
+ migration_name = "add_neighborhood_fields_to_#{@model_pl}"
24
+ generate "migration #{migration_name} #{database_fields}"
25
+ insert_into_file(
26
+ Dir.glob("#{Rails.root}/db/migrate/*.rb").last,
27
+ ", :precision => 7, :scale => 5",
28
+ :after => /\:l(at|ng), \:decimal/
29
+ )
30
+ end
31
+
32
+ private
33
+
34
+ def database_fields
35
+ [
36
+ 'street_address',
37
+ 'suite_apt',
38
+ 'city',
39
+ 'state',
40
+ 'zip',
41
+ 'country',
42
+ 'phone',
43
+ 'lat:decimal',
44
+ 'lng:decimal',
45
+ 'full_address:text',
46
+ ].join(' ')
47
+ end
48
+
49
+ end
File without changes
data/lib/neighborhood.rb CHANGED
@@ -1,5 +1,9 @@
1
+ # neighborhood files
1
2
  require "neighborhood/version"
3
+ require "neighborhood/in_the_neighborhood"
4
+
5
+ # require dependencies
6
+ require 'geocoder'
2
7
 
3
8
  module Neighborhood
4
- # Your code goes here...
5
9
  end
@@ -0,0 +1,36 @@
1
+ require 'geocoder'
2
+
3
+ class << ActiveRecord::Base
4
+
5
+ def in_the_neighborhood
6
+ geocoded_by :address, :latitude => :lat, :longitude => :lng
7
+
8
+ after_validation :geocode_if_address
9
+
10
+ define_method "address" do
11
+ [street_address, suite_apt, city, state, zip, country].compact.join(', ')
12
+ end
13
+
14
+ define_method "geocode_if_address" do
15
+ if address.present?
16
+ geo = Geocoder.search(address)
17
+ if geo.size > 0
18
+ geo = geo.first.data
19
+ # set basic geo
20
+ attrs = {
21
+ :lat => geo['geometry']['location']['lat'],
22
+ :lng => geo['geometry']['location']['lng'],
23
+ :full_address => geo['formatted_address'],
24
+ }
25
+ # set country if necessary
26
+ country = geo['address_components']
27
+ .select { |a| a['types'].include?('country') }.first['long_name']
28
+ attrs[:country] = country if country.present?
29
+ # save attributes
30
+ update_columns(attrs)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ end
@@ -1,3 +1,3 @@
1
1
  module Neighborhood
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/neighborhood.gemspec CHANGED
@@ -20,4 +20,6 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.7"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
+
24
+ spec.add_dependency 'geocoder'
23
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neighborhood
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean C Davis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-27 00:00:00.000000000 Z
11
+ date: 2015-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: geocoder
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description: ''
42
56
  email:
43
57
  - scdavis41@gmail.com
@@ -50,7 +64,10 @@ files:
50
64
  - LICENSE.md
51
65
  - README.md
52
66
  - Rakefile
67
+ - lib/generators/neighborhood_generator.rb
68
+ - lib/generators/templates/.keep
53
69
  - lib/neighborhood.rb
70
+ - lib/neighborhood/in_the_neighborhood.rb
54
71
  - lib/neighborhood/version.rb
55
72
  - neighborhood.gemspec
56
73
  homepage: ''