bhm-google-maps 0.1.0

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.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ .DS_Store
2
+ *.tmproj
3
+ tmtags
4
+ *~
5
+ \#*
6
+ .\#*
7
+ *.swp
8
+ coverage
9
+ rdoc
10
+ pkg
11
+ build
data/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ Copyright (c) 2010, Youth Tree
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+ 3. All advertising materials mentioning features or use of this software
12
+ must display the following acknowledgement:
13
+ This product includes software developed by the Youth Tree.
14
+ 4. Neither the name of the Youth Tree nor the
15
+ names of its contributors may be used to endorse or promote products
16
+ derived from this software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY YOUTH TREE ''AS IS'' AND ANY
19
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL YOUTH TREE BE LIABLE FOR ANY
22
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # BHM Google Maps #
2
+
3
+ Helpers for Google Maps v3 in Rails - Using html 5, the google maps api v3 and the static maps api
4
+ Supports unobtrusive maps in Rails 3 (and 2.3, but preferably 3) using the new google maps v3 api.
5
+
6
+ ## Installation ##
7
+
8
+ Installing bhm-google-maps is simple. To get started with a rails 3 app:
9
+
10
+ 1. Add the gem to your Gemfile: Add `gem "bhm-google-maps"`
11
+ 2. Generate the js into your app: `rake bhm-google-maps:install`
12
+ 3. Configure as needed
13
+
14
+ Some parts of bhm-google-maps may need to be configured - e.g. out of the box, it will append the google
15
+ maps js url to the page and the gmap.js from where it was called, as an example of changing this, we suggest
16
+ creating `config/initializers/bhm_google_maps_config.rb` and configuring from there. e.g:
17
+
18
+ # t is the scope of the view / helpers.
19
+ # This will append it to a content_for section
20
+ # instead of directly in the page.
21
+ BHM::GoogleMaps.include_js_proc = proc do |t|
22
+ t.content_for :extra_head, t.javascript_include_tag(t.google_maps_url(false), "gmap.js")
23
+ end
24
+
25
+ For a fuller / more in depth reference, see configuration below.
26
+
27
+ ## Usage ##
28
+
29
+ Currently, bhm-google-maps is designed to show a single map w/ static fallback. To do this,
30
+ you use the `draw_map_of` helper. You pass it an object you wish to plot, typically following the
31
+ convention that:
32
+
33
+ 1. `object.lat` and `object.lng` return latitude / longitude respectively
34
+ 2. `object.to_s` returns the string representing the address / the address
35
+
36
+ Of course, this can be changed via other conventions. For this example, we'll use the following
37
+ class demo:
38
+
39
+ class Location
40
+ attr_accessor :address, :lat, :lng
41
+
42
+ def initialize(address, lat, lng)
43
+ @address = address
44
+ @lat = lat
45
+ @lng = lng
46
+ end
47
+
48
+ def to_s; address.to_s; end
49
+
50
+ end
51
+
52
+ Then, in your view, you could simple call:
53
+
54
+ <%= draw_map_of Location.new("My House", 12.345, 56.789) %>
55
+
56
+ Optionally, `draw_map_of` accepts a hash of options for:
57
+
58
+ * `:static_map_html` - options to pass to the image\_tag for the static map.
59
+ * `:static_map` - options to pass to the BHM::GoogleMaps::StaticMap constructor. These include `:type`, `:width` and `:height`
60
+ * `:marker` - options to pass to the `google.maps.Marker` in js.
61
+
62
+ You also get the following helpers:
63
+
64
+ * `using_gmaps_js?` - whether or not the embed method has been called
65
+ * `use_gmaps_js` - calls your embed method for the js - see configuration.
66
+ * `google_maps_url(sensor = false)` - returns the url for the google maps api v3.
67
+ * `static_map_of_addresses(addresses)` - returns an image tag for an array of addresses.
68
+ * `static_map_of_address(address)` - returns an image tag for a given address
69
+
70
+ ## Configuration ##
71
+
72
+ For configuration purposes, there are a set of options on `BHM::GoogleMaps`. You can
73
+ set them via `BHM::GoogleMaps.option_name = value`
74
+
75
+ * `container_class` - the map class for the container div, defaults to gmap. If changed, you must update the js.
76
+ * `static_map_class` - the class of the container div, removed via js when made dynamic.
77
+ * `include_js_proc` - how to embed js in the page (e.g. using content\_for), defaults to using concat. Is called as a proc w/ the template passed as the only argument.
78
+ * `address_to_s_proc` - passed an address, converts it to a string (defaults to to_s)
79
+ * `address_to_lat_lng_proc` - passed an address, returns an array w/ lat and lng.
80
+
81
+ Ideally these options should be set in an initializer.
82
+
83
+ ## Note on Patches/Pull Requests ##
84
+
85
+ 1. Fork the project.
86
+ 2. Make your feature addition or bug fix.
87
+ 3. Add tests for it. This is important so I don't break it in a future version unintentionally.
88
+ 4. Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
89
+ 5. Send me a pull request. Bonus points for topic branches.
90
+
91
+ ## Copyright ##
92
+
93
+ Copyright (c) 2010 Youth Tree. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,66 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/rdoctask'
5
+ require File.expand_path("./lib/bhm/google_maps/version", File.dirname(__FILE__))
6
+
7
+ desc "Default: run unit tests."
8
+ task :default => :test
9
+
10
+ begin
11
+ require 'jeweler'
12
+ Jeweler::Tasks.new do |gem|
13
+ gem.name = "bhm-google-maps"
14
+ gem.summary = "Helpers for Google Maps v3 in Rails - Using html 5, the google maps api v3 and the static maps api"
15
+ gem.description = "A set of helpers and javascript files that makes it trivial to implement google maps unobtrusively in an application."
16
+ gem.email = "darcy.laycock@youthtree.org.au"
17
+ gem.homepage = "http://github.com/YouthTree/bhm-google-maps"
18
+ gem.authors = ["Darcy Laycock"]
19
+ gem.version = BHM::GoogleMaps::VERSION
20
+ end
21
+ Jeweler::GemcutterTasks.new
22
+ rescue LoadError
23
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
24
+ end
25
+
26
+ desc "Compiles the javascript from Coffeescript to Javascript"
27
+ task :compile_scripts do
28
+ system "coffee --no-wrap -c coffeescripts/*.coffee -o javascripts/"
29
+ end
30
+
31
+ desc "Interactively compiles coffeescripts as they're changed"
32
+ task :watch_scripts do
33
+ system "coffee --no-wrap -w -c coffeescripts/*.coffee -o javascripts/"
34
+ end
35
+
36
+ desc "Compile scripts, and produce a minified version."
37
+ task :build_scripts => [:compile_scripts] do
38
+ require 'closure-compiler'
39
+ build_prefix = "build/#{BHM::GoogleMaps::VERSION}"
40
+ FileUtils.mkdir_p build_prefix
41
+ Dir["javascripts/*.js"].each do |js|
42
+ new_name = js.gsub(/^javascripts\//, build_prefix + "/").gsub(/\.js$/, "-#{BHM::GoogleMaps::VERSION}.js")
43
+ FileUtils.cp js, new_name
44
+ min_name = new_name.gsub(/\.js$/, '.min.js')
45
+ File.open(min_name, "w+") do |f|
46
+ f.write Closure::Compiler.new.compile(File.read(js))
47
+ end
48
+ end
49
+ end
50
+
51
+ desc "Generate docs for the bhm-google-maps plugin"
52
+ Rake::RDocTask.new(:rdoc) do |rdoc|
53
+ rdoc.rdoc_dir = 'rdoc'
54
+ rdoc.title = "bhm-google-maps"
55
+ rdoc.options << '--line-numbers' << '--inline-source'
56
+ rdoc.rdoc_files.include('README.md')
57
+ rdoc.rdoc_files.include('lib/**/*.rb')
58
+ end
59
+
60
+ desc "Test the bhm-google-maps plugin"
61
+ Rake::TestTask.new(:test) do |test|
62
+ test.libs << 'lib'
63
+ test.libs << 'test'
64
+ test.pattern = 'test/**/*_test.rb'
65
+ test.verbose = true
66
+ end
@@ -0,0 +1,62 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{bhm-google-maps}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Darcy Laycock"]
12
+ s.date = %q{2010-04-26}
13
+ s.description = %q{A set of helpers and javascript files that makes it trivial to implement google maps unobtrusively in an application.}
14
+ s.email = %q{darcy.laycock@youthtree.org.au}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.md",
24
+ "Rakefile",
25
+ "bhm-google-maps.gemspec",
26
+ "coffeescripts/gmap.coffee",
27
+ "javascripts/gmap.js",
28
+ "lib/bhm-google-maps.rb",
29
+ "lib/bhm/google_maps.rb",
30
+ "lib/bhm/google_maps/builder.rb",
31
+ "lib/bhm/google_maps/helper.rb",
32
+ "lib/bhm/google_maps/static_map.rb",
33
+ "lib/bhm/google_maps/tasks/bhm_google_maps.rake",
34
+ "lib/bhm/google_maps/version.rb",
35
+ "test/builder_test.rb",
36
+ "test/helper_test.rb",
37
+ "test/support/misc_helpers.rb",
38
+ "test/test_helper.rb"
39
+ ]
40
+ s.homepage = %q{http://github.com/YouthTree/bhm-google-maps}
41
+ s.rdoc_options = ["--charset=UTF-8"]
42
+ s.require_paths = ["lib"]
43
+ s.rubygems_version = %q{1.3.6}
44
+ s.summary = %q{Helpers for Google Maps v3 in Rails - Using html 5, the google maps api v3 and the static maps api}
45
+ s.test_files = [
46
+ "test/builder_test.rb",
47
+ "test/helper_test.rb",
48
+ "test/support/misc_helpers.rb",
49
+ "test/test_helper.rb"
50
+ ]
51
+
52
+ if s.respond_to? :specification_version then
53
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
54
+ s.specification_version = 3
55
+
56
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
57
+ else
58
+ end
59
+ else
60
+ end
61
+ end
62
+
@@ -0,0 +1,88 @@
1
+ # GMap is a simply, unobtrusive google map adder for jQuery + HTML5.
2
+ # It uses data attributes to store map locations, works with a rails
3
+ # plugin to generate static alternatives and most importantly is simple.
4
+ GMap: (($) ->
5
+
6
+ # The actual object we'll be exporting.
7
+ map: {}
8
+
9
+ # Map and marker options to autoextract.
10
+ mapOptionKeys: ["zoom", "title"]
11
+ markerOptionKeys: ["title"]
12
+
13
+ # Exposed options / data.
14
+ map.count: 0
15
+ map.autoIDPrefix: "gmap-"
16
+ map.maps: []
17
+
18
+ # Use a function for the roadmap value to avoid load order issues.
19
+ # e.g. if the google maps library is loaded after this one.
20
+ map.defaultOptions: {
21
+ zoom: 15
22
+ mapTypeId: -> google.maps.MapTypeId.ROADMAP
23
+ scroolwheel: false
24
+ }
25
+
26
+ # Very, very simple wrapper for generating a data key - tbh possibly un-needed.
27
+ dataKey: (key, spacer) ->
28
+ spacer?= ""
29
+ "data-$spacer$key"
30
+
31
+ # Returns true iff the given element has the set data element, false otherwise.
32
+ hasData: (e, key, spacer) ->
33
+ e.is "[${dataKey key, spacer}]"
34
+
35
+ # Return the value of a given data attribute.
36
+ getData: (e, key, spacer) ->
37
+ e.attr dataKey(key, spacer)
38
+
39
+ # Merges a given object w/ values retrieved using data element.
40
+ # automatically namespaces keys etc.
41
+ mergeDataOptions: (element, options, keys, spacer) ->
42
+ for key in keys
43
+ options[key] = getData(element, key, spacer) if hasData element, key, spacer
44
+
45
+ # Return the map options for a given element.
46
+ mapOptionsForElement: (element) ->
47
+ options: $.extend {}, map.defaultOptions
48
+ # Set the mapTypeId if it's a function
49
+ options.mapTypeId: options.mapTypeId() if $.isFunction options.mapTypeId
50
+ mergeDataOptions element, options, mapOptionKeys
51
+ options
52
+
53
+ # Install the google map onto each option with the .gmap key.
54
+ map.install: ->
55
+ $('.gmap').each -> map.setupElement this
56
+
57
+ # Called with a single html dom element as an argument, will
58
+ # automatically set it up as a google map.
59
+ map.setupElement: (e) ->
60
+ $e: $ e
61
+ id: $e.attr "id"
62
+ $e.attr "id", "${map.autoIDPrefix}${map.count++}" unless id?
63
+ # Get the position of the current marker.
64
+ lat: Number getData($e, "latitude")
65
+ lng: Number getData($e, "longitude")
66
+ point: new google.maps.LatLng lat, lng
67
+ # Start setting up the map / create a map element.
68
+ mapOptions: mapOptionsForElement $e
69
+ mapOptions.center: point
70
+ $e.empty().addClass('dynamic-google-map').removeClass('static-google-map')
71
+ currentMap: new google.maps.Map e, mapOptions
72
+ map.maps.push currentMap
73
+ # Now, we need to finally add the marker to the map.
74
+ markerOptions: {
75
+ position: point
76
+ map: currentMap
77
+ }
78
+ mergeDataOptions $e, markerOptions, markerOptionKeys, "marker-"
79
+ marker: new google.maps.Marker markerOptions
80
+ currentMap
81
+
82
+ # On load, we'll install the maps.
83
+ $(document).ready -> map.install()
84
+
85
+ # Return map to set it up.
86
+ map
87
+
88
+ )(jQuery)
@@ -0,0 +1,105 @@
1
+ var GMap;
2
+ // GMap is a simply, unobtrusive google map adder for jQuery + HTML5.
3
+ // It uses data attributes to store map locations, works with a rails
4
+ // plugin to generate static alternatives and most importantly is simple.
5
+ GMap = (function($) {
6
+ var dataKey, getData, hasData, map, mapOptionKeys, mapOptionsForElement, markerOptionKeys, mergeDataOptions;
7
+ // The actual object we'll be exporting.
8
+ map = {};
9
+ // Map and marker options to autoextract.
10
+ mapOptionKeys = ["zoom", "title"];
11
+ markerOptionKeys = ["title"];
12
+ // Exposed options / data.
13
+ map.count = 0;
14
+ map.autoIDPrefix = "gmap-";
15
+ map.maps = [];
16
+ // Use a function for the roadmap value to avoid load order issues.
17
+ // e.g. if the google maps library is loaded after this one.
18
+ map.defaultOptions = {
19
+ zoom: 15,
20
+ mapTypeId: function mapTypeId() {
21
+ return google.maps.MapTypeId.ROADMAP;
22
+ },
23
+ scroolwheel: false
24
+ };
25
+ // Very, very simple wrapper for generating a data key - tbh possibly un-needed.
26
+ dataKey = function dataKey(key, spacer) {
27
+ spacer = (typeof spacer !== "undefined" && spacer !== null) ? spacer : "";
28
+ return "data-" + spacer + key;
29
+ };
30
+ // Returns true iff the given element has the set data element, false otherwise.
31
+ hasData = function hasData(e, key, spacer) {
32
+ return e.is(("[" + (dataKey(key, spacer)) + "]"));
33
+ };
34
+ // Return the value of a given data attribute.
35
+ getData = function getData(e, key, spacer) {
36
+ return e.attr(dataKey(key, spacer));
37
+ };
38
+ // Merges a given object w/ values retrieved using data element.
39
+ // automatically namespaces keys etc.
40
+ mergeDataOptions = function mergeDataOptions(element, options, keys, spacer) {
41
+ var _a, _b, _c, _d, key;
42
+ _a = []; _c = keys;
43
+ for (_b = 0, _d = _c.length; _b < _d; _b++) {
44
+ key = _c[_b];
45
+ _a.push((function() {
46
+ if (hasData(element, key, spacer)) {
47
+ options[key] = getData(element, key, spacer);
48
+ return options[key];
49
+ }
50
+ })());
51
+ }
52
+ return _a;
53
+ };
54
+ // Return the map options for a given element.
55
+ mapOptionsForElement = function mapOptionsForElement(element) {
56
+ var options;
57
+ options = $.extend({}, map.defaultOptions);
58
+ // Set the mapTypeId if it's a function
59
+ if ($.isFunction(options.mapTypeId)) {
60
+ options.mapTypeId = options.mapTypeId();
61
+ }
62
+ mergeDataOptions(element, options, mapOptionKeys);
63
+ return options;
64
+ };
65
+ // Install the google map onto each option with the .gmap key.
66
+ map.install = function install() {
67
+ return $('.gmap').each(function() {
68
+ return map.setupElement(this);
69
+ });
70
+ };
71
+ // Called with a single html dom element as an argument, will
72
+ // automatically set it up as a google map.
73
+ map.setupElement = function setupElement(e) {
74
+ var $e, currentMap, id, lat, lng, mapOptions, marker, markerOptions, point;
75
+ $e = $(e);
76
+ id = $e.attr("id");
77
+ if (!((typeof id !== "undefined" && id !== null))) {
78
+ $e.attr("id", ("" + (map.autoIDPrefix) + (map.count++)));
79
+ }
80
+ // Get the position of the current marker.
81
+ lat = Number(getData($e, "latitude"));
82
+ lng = Number(getData($e, "longitude"));
83
+ point = new google.maps.LatLng(lat, lng);
84
+ // Start setting up the map / create a map element.
85
+ mapOptions = mapOptionsForElement($e);
86
+ mapOptions.center = point;
87
+ $e.empty().addClass('dynamic-google-map').removeClass('static-google-map');
88
+ currentMap = new google.maps.Map(e, mapOptions);
89
+ map.maps.push(currentMap);
90
+ // Now, we need to finally add the marker to the map.
91
+ markerOptions = {
92
+ position: point,
93
+ map: currentMap
94
+ };
95
+ mergeDataOptions($e, markerOptions, markerOptionKeys, "marker-");
96
+ marker = new google.maps.Marker(markerOptions);
97
+ return currentMap;
98
+ };
99
+ // On load, we'll install the maps.
100
+ $(document).ready(function() {
101
+ return map.install();
102
+ });
103
+ // Return map to set it up.
104
+ return map;
105
+ })(jQuery);
@@ -0,0 +1,57 @@
1
+ module BHM
2
+ module GoogleMaps
3
+ class Builder
4
+ BasicMarker = Struct.new(:to_s, :lat, :lng)
5
+
6
+ def initialize(template, address, options)
7
+ @template = template
8
+ @address = address
9
+ @options = options.symbolize_keys
10
+ end
11
+
12
+ def build_static_map(marker_options)
13
+ ll = self.ll_pair
14
+ address = self.address_as_string
15
+ address_proxy = BasicMarker.new(address, ll[0], ll[1])
16
+ static_map_url = StaticMap.for_address(address_proxy, marker_options.merge(@options[:static_map] || {}))
17
+ @template.image_tag(static_map_url, {:alt => address}.reverse_merge(@options[:static_map_html] || {}))
18
+ end
19
+
20
+ def build_container
21
+ marker_options = @options[:marker] || {}
22
+ ll = self.ll_pair
23
+ address = self.address_as_string
24
+ container_options = {}
25
+ container_options['data-latitude'] = ll[0]
26
+ container_options['data-longitude'] = ll[1]
27
+ marker_options[:title] ||= address
28
+ marker_options.each_pair do |k, v|
29
+ container_options["data-marker-#{k.to_s.dasherize}"] = v
30
+ end
31
+ default_css_class = "#{BHM::GoogleMaps.container_class} #{BHM::GoogleMaps.static_map_class}"
32
+ container_options = merge_options_with_class(container_options, :class => default_css_class)
33
+ @template.content_tag(:div, build_static_map(marker_options), container_options)
34
+ end
35
+
36
+ def to_html
37
+ @to_html ||= build_container
38
+ end
39
+
40
+ def ll_pair
41
+ BHM::GoogleMaps.address_to_lat_lng_proc.call(@address)
42
+ end
43
+
44
+ def address_as_string
45
+ BHM::GoogleMaps.address_to_s_proc.call(@address)
46
+ end
47
+
48
+ protected
49
+
50
+ def merge_options_with_class(a, b)
51
+ a, b = (a || {}).stringify_keys, (b || {}).stringify_keys
52
+ css_class = [a['class'], b['class']].join(" ").squeeze(" ")
53
+ a.merge(b).merge('class' => css_class)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,37 @@
1
+ module BHM
2
+ module GoogleMaps
3
+ module Helper
4
+
5
+ def using_gmaps_js?
6
+ instance_variable_defined?(:@using_gmaps_js) && !!@using_gmaps_js
7
+ end
8
+
9
+ def google_maps_url(sensor = false)
10
+ "http://maps.google.com/maps/api/js?sensor=#{sensor}"
11
+ end
12
+
13
+ def use_gmaps_js
14
+ return if using_gmaps_js?
15
+ BHM::GoogleMaps.include_js_proc.call(self)
16
+ @using_gmaps_js = true
17
+ end
18
+
19
+ def draw_map_of(address, options = {})
20
+ use_gmaps_js
21
+ BHM::GoogleMaps::Builder.new(self, address, options).to_html
22
+ end
23
+
24
+ # Given an array of addresses, will return an image an
25
+ # image tag with a static google map plotting those points.
26
+ def static_map_of_addresses(addresses, options = {})
27
+ image_tag(BHM::GoogleMaps::StaticMap.for_addresses(addresses, options), :alt => "#{pluralize addresses.size, "address"} plotted on a map")
28
+ end
29
+
30
+ # Returns an image map with a single address plotted on a single static google map.
31
+ def static_map_of_address(address, options = {})
32
+ image_tag(BHM::GoogleMaps::StaticMap.for_address(address, options), :alt => BHM::GoogleMaps.address_to_s_proc(address))
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,60 @@
1
+ module BHM
2
+ module GoogleMaps
3
+ class StaticMap
4
+ URL_TEMPLATE = "http://maps.google.com/maps/api/staticmap?%s"
5
+ COLOURS = %w(red white green brown blue orange gray purple yellow black)
6
+ LABELS = ('A'..'Z').to_a
7
+
8
+ def initialize(options = {})
9
+ @addresses = []
10
+ @width, @height = options.fetch(:width, 540), options.fetch(:height, 400)
11
+ @params = Hash.new.tap do |p|
12
+ p[:sensor] = false
13
+ p[:size] = "#{@width}x#{@height}"
14
+ p[:maptype] = options.fetch(:type, "roadmap")
15
+ end
16
+ end
17
+
18
+ def <<(address)
19
+ @addresses << address
20
+ end
21
+
22
+ def to_url
23
+ params = @params.to_param
24
+ params << "&"
25
+ params << build_marker_params
26
+ URL_TEMPLATE % params
27
+ end
28
+
29
+ def self.for_address(address, opts = {})
30
+ map = self.new(opts.reverse_merge(:zoom => 15))
31
+ map << address
32
+ map.to_url
33
+ end
34
+
35
+ def self.for_addresses(*addresses)
36
+ map = self.new(addresses.extract_options!)
37
+ addresses.flatten.each { |a| map << a }
38
+ map.to_url
39
+ end
40
+
41
+ protected
42
+
43
+ def build_marker_params
44
+ params = []
45
+ @addresses.each_with_index do |address, index|
46
+ return "markers=#{to_ll @addresses.first}" if @addresses.size == 1
47
+ color = COLOURS[index % COLOURS.size]
48
+ label = LABELS[index % LABELS.size]
49
+ params << "markers=color:#{color}|label:#{label}|#{to_ll(address)}"
50
+ end
51
+ params.join("&")
52
+ end
53
+
54
+ def to_ll(address)
55
+ "#{address.lat},#{address.lng}"
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,9 @@
1
+ namespace "bhm-google-maps" do
2
+
3
+ desc "Will copy across the newest version of the javascript files"
4
+ task :install => :environment do
5
+ puts "Installing gmap.js file into public/javascripts"
6
+ BHM::GoogleMaps.install_js!
7
+ end
8
+
9
+ end
@@ -0,0 +1,5 @@
1
+ module BHM
2
+ module GoogleMaps
3
+ VERSION = "0.1.0".freeze
4
+ end
5
+ end
@@ -0,0 +1,46 @@
1
+ require 'active_support'
2
+
3
+ module BHM
4
+ module GoogleMaps
5
+
6
+ autoload :StaticMap, 'bhm/google_maps/static_map'
7
+ autoload :Helper, 'bhm/google_maps/helper'
8
+ autoload :Builder, 'bhm/google_maps/builder'
9
+
10
+ class << self
11
+ attr_accessor :container_class, :static_map_class, :include_js_proc,
12
+ :address_to_s_proc, :address_to_lat_lng_proc
13
+ end
14
+
15
+ self.container_class ||= "gmap"
16
+ self.static_map_class ||= "static-google-map"
17
+ self.include_js_proc ||= lambda { |t| t.concat(t.javascript_include_tag(t.google_maps_url(false), "gmap.js")) }
18
+ self.address_to_s_proc ||= lambda { |a| a.to_s }
19
+ self.address_to_lat_lng_proc ||= lambda { |a| [a.lat, a.lng] }
20
+
21
+ def self.configure
22
+ yield self if block_given?
23
+ end
24
+
25
+ def self.install_helper!
26
+ ::ActionView::Base.send(:include, BHM::GoogleMaps::Helper)
27
+ end
28
+
29
+ def self.install_js!
30
+ from = File.expand_path("../../javascripts/gmap.js", File.dirname(__FILE__))
31
+ if File.exist?(from) && defined?(Rails.root)
32
+ FileUtils.cp from, Rails.root.join("public", "javascripts", "gmap.js")
33
+ end
34
+ end
35
+
36
+ self.install_helper! if defined?(::ActionView)
37
+
38
+ if defined?(Rails::Railtie)
39
+ class Railtie < Rails::Railtie
40
+ rake_tasks do
41
+ load File.expand_path('./google_maps/tasks/bhm_google_maps.rake', File.dirname(__FILE__))
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1 @@
1
+ require 'bhm/google_maps'
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ class BuilderTest < ActionView::TestCase
4
+ end
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+ require 'ostruct'
3
+
4
+ class HelperTest < ActionView::TestCase
5
+
6
+ def setup_default_address
7
+ @address = Struct.new(:lat, :lng, :to_s).new(10.0, 10.0, "Some address")
8
+ end
9
+
10
+ setup :setup_default_address
11
+
12
+ test "should return false if not using google maps js" do
13
+ assert !using_gmaps_js?
14
+ end
15
+
16
+ test "should let you use google maps js" do
17
+ use_gmaps_js
18
+ assert using_gmaps_js?
19
+ assert_select 'script'
20
+ end
21
+
22
+ test "should let you draw a map of an address" do
23
+ concat draw_map_of(@address)
24
+ assert_select '.gmap'
25
+ end
26
+
27
+ test "should automatically use gmap js when an address is drawn" do
28
+ assert !using_gmaps_js?
29
+ concat draw_map_of(@address)
30
+ assert using_gmaps_js?
31
+ end
32
+
33
+ test "should correctly add a container with an address" do
34
+ concat draw_map_of(@address)
35
+ assert_select ".#{BHM::GoogleMaps.container_class}"
36
+ end
37
+
38
+ test "should correctly add an image with an address" do
39
+ concat draw_map_of(@address)
40
+ assert_select ".#{BHM::GoogleMaps.static_map_class}"
41
+ end
42
+
43
+ test "should append a static map image" do
44
+ concat draw_map_of(@address)
45
+ assert_select ".#{BHM::GoogleMaps.static_map_class} img"
46
+ end
47
+
48
+ end
@@ -0,0 +1,21 @@
1
+ module MiscHelpers
2
+
3
+ def assert_no_select(*args)
4
+ assert_raise Test::Unit::AssertionFailedError do
5
+ assert_select(*args)
6
+ end
7
+ end
8
+
9
+ def swap(object, new_values)
10
+ old_values = {}
11
+ new_values.each do |key, value|
12
+ old_values[key] = object.send key
13
+ object.send :"#{key}=", value
14
+ end
15
+ yield
16
+ ensure
17
+ old_values.each do |key, value|
18
+ object.send :"#{key}=", value
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'redgreen' if RUBY_VERSION < '1.9'
4
+
5
+ require 'action_controller'
6
+ require 'action_view'
7
+ require 'action_view/template'
8
+ require 'action_view/test_case'
9
+
10
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
11
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
12
+ require 'bhm-google-maps'
13
+
14
+ Dir["#{File.dirname(__FILE__)}/support/*.rb"].each { |f| require f }
15
+
16
+ class ActionView::TestCase
17
+ include MiscHelpers
18
+
19
+ tests BHM::GoogleMaps::Helper
20
+
21
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bhm-google-maps
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Darcy Laycock
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-04-26 00:00:00 +08:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: A set of helpers and javascript files that makes it trivial to implement google maps unobtrusively in an application.
22
+ email: darcy.laycock@youthtree.org.au
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - LICENSE
29
+ - README.md
30
+ files:
31
+ - .document
32
+ - .gitignore
33
+ - LICENSE
34
+ - README.md
35
+ - Rakefile
36
+ - bhm-google-maps.gemspec
37
+ - coffeescripts/gmap.coffee
38
+ - javascripts/gmap.js
39
+ - lib/bhm-google-maps.rb
40
+ - lib/bhm/google_maps.rb
41
+ - lib/bhm/google_maps/builder.rb
42
+ - lib/bhm/google_maps/helper.rb
43
+ - lib/bhm/google_maps/static_map.rb
44
+ - lib/bhm/google_maps/tasks/bhm_google_maps.rake
45
+ - lib/bhm/google_maps/version.rb
46
+ - test/builder_test.rb
47
+ - test/helper_test.rb
48
+ - test/support/misc_helpers.rb
49
+ - test/test_helper.rb
50
+ has_rdoc: true
51
+ homepage: http://github.com/YouthTree/bhm-google-maps
52
+ licenses: []
53
+
54
+ post_install_message:
55
+ rdoc_options:
56
+ - --charset=UTF-8
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ segments:
71
+ - 0
72
+ version: "0"
73
+ requirements: []
74
+
75
+ rubyforge_project:
76
+ rubygems_version: 1.3.6
77
+ signing_key:
78
+ specification_version: 3
79
+ summary: Helpers for Google Maps v3 in Rails - Using html 5, the google maps api v3 and the static maps api
80
+ test_files:
81
+ - test/builder_test.rb
82
+ - test/helper_test.rb
83
+ - test/support/misc_helpers.rb
84
+ - test/test_helper.rb