has_geo_lookup 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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE.txt +21 -0
- data/README.md +389 -0
- data/Rakefile +8 -0
- data/lib/generators/has_geo_lookup/install_generator.rb +66 -0
- data/lib/generators/has_geo_lookup/templates/INSTALL.md +60 -0
- data/lib/generators/has_geo_lookup/templates/create_feature_codes.rb.erb +17 -0
- data/lib/generators/has_geo_lookup/templates/create_geoboundaries.rb.erb +24 -0
- data/lib/generators/has_geo_lookup/templates/create_geoboundaries_metros.rb.erb +10 -0
- data/lib/generators/has_geo_lookup/templates/create_geonames.rb.erb +40 -0
- data/lib/generators/has_geo_lookup/templates/create_geonames_metros.rb.erb +10 -0
- data/lib/generators/has_geo_lookup/templates/create_metros.rb.erb +17 -0
- data/lib/has_geo_lookup/concern.rb +813 -0
- data/lib/has_geo_lookup/index_checker.rb +360 -0
- data/lib/has_geo_lookup/models/feature_code.rb +194 -0
- data/lib/has_geo_lookup/models/geoboundary.rb +220 -0
- data/lib/has_geo_lookup/models/geoname.rb +152 -0
- data/lib/has_geo_lookup/models/metro.rb +247 -0
- data/lib/has_geo_lookup/railtie.rb +11 -0
- data/lib/has_geo_lookup/version.rb +5 -0
- data/lib/has_geo_lookup.rb +28 -0
- data/lib/tasks/has_geo_lookup.rake +111 -0
- data/sig/has_geo_lookup.rbs +4 -0
- metadata +183 -0
@@ -0,0 +1,111 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
namespace :has_geo_lookup do
|
4
|
+
desc "Check HasGeoLookup database setup (columns and indexes)"
|
5
|
+
task check_setup: :environment do
|
6
|
+
puts HasGeoLookup::IndexChecker.performance_report
|
7
|
+
end
|
8
|
+
|
9
|
+
desc "Generate Rails migration for complete HasGeoLookup setup"
|
10
|
+
task create_setup: :environment do
|
11
|
+
migration_path = HasGeoLookup::IndexChecker.generate_index_migration
|
12
|
+
|
13
|
+
if migration_path
|
14
|
+
puts "\n✓ Migration generated successfully!"
|
15
|
+
puts "Next steps:"
|
16
|
+
puts " 1. Review the migration: #{migration_path}"
|
17
|
+
puts " 2. Run: rails db:migrate"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Preview HasGeoLookup setup changes without executing (dry run)"
|
22
|
+
task preview_setup: :environment do
|
23
|
+
results = HasGeoLookup::IndexChecker.analyze_all_models
|
24
|
+
|
25
|
+
if results.empty?
|
26
|
+
puts "No models found that include HasGeoLookup"
|
27
|
+
exit 0
|
28
|
+
end
|
29
|
+
|
30
|
+
models_with_missing = results.select do |_, analysis|
|
31
|
+
(analysis[:missing_columns] || 0) > 0 || (analysis[:missing_indexes] || 0) > 0
|
32
|
+
end
|
33
|
+
|
34
|
+
if models_with_missing.empty?
|
35
|
+
puts "✓ All models have optimal HasGeoLookup setup"
|
36
|
+
exit 0
|
37
|
+
end
|
38
|
+
|
39
|
+
puts "Preview: HasGeoLookup setup changes that would be created"
|
40
|
+
puts "=" * 70
|
41
|
+
|
42
|
+
models_with_missing.each do |model_name, analysis|
|
43
|
+
puts "\n#{model_name} (#{analysis[:table_name]}):"
|
44
|
+
|
45
|
+
if (analysis[:missing_columns] || 0) > 0
|
46
|
+
puts " Missing columns:"
|
47
|
+
analysis[:missing_column_details].each do |col_def|
|
48
|
+
puts " add_column :#{analysis[:table_name]}, :#{col_def[:name]}, :#{col_def[:type]}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
if (analysis[:missing_indexes] || 0) > 0
|
53
|
+
puts " Missing indexes:"
|
54
|
+
analysis[:recommendations].each do |command|
|
55
|
+
puts " #{command}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
puts "\n" + "=" * 70
|
61
|
+
puts "To create this setup, run: rake has_geo_lookup:create_setup"
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Show detailed index analysis for a specific model"
|
65
|
+
task :analyze_model, [:model_name] => :environment do |task, args|
|
66
|
+
unless args[:model_name]
|
67
|
+
puts "Usage: rake has_geo_lookup:analyze_model[ModelName]"
|
68
|
+
puts "Example: rake has_geo_lookup:analyze_model[Listing]"
|
69
|
+
exit 1
|
70
|
+
end
|
71
|
+
|
72
|
+
begin
|
73
|
+
model = args[:model_name].constantize
|
74
|
+
rescue NameError
|
75
|
+
puts "Error: Model '#{args[:model_name]}' not found"
|
76
|
+
exit 1
|
77
|
+
end
|
78
|
+
|
79
|
+
unless model.include?(HasGeoLookup)
|
80
|
+
puts "Error: Model '#{args[:model_name]}' does not include HasGeoLookup"
|
81
|
+
exit 1
|
82
|
+
end
|
83
|
+
|
84
|
+
analysis = HasGeoLookup::IndexChecker.check_model(model)
|
85
|
+
|
86
|
+
puts "=" * 60
|
87
|
+
puts "HasGeoLookup Index Analysis: #{args[:model_name]}"
|
88
|
+
puts "=" * 60
|
89
|
+
puts "Table: #{analysis[:table_name]}"
|
90
|
+
puts "Missing indexes: #{analysis[:missing_indexes]}"
|
91
|
+
|
92
|
+
if analysis[:existing_indexes].any?
|
93
|
+
puts "\nExisting coordinate/geo indexes:"
|
94
|
+
analysis[:existing_indexes].each do |columns|
|
95
|
+
puts " • #{columns.join(', ')}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
if analysis[:recommendations].any?
|
100
|
+
puts "\nRecommended additions:"
|
101
|
+
analysis[:recommendations].each do |rec|
|
102
|
+
puts " #{rec}"
|
103
|
+
end
|
104
|
+
else
|
105
|
+
puts "\n✓ All recommended indexes are present"
|
106
|
+
end
|
107
|
+
|
108
|
+
puts "=" * 60
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
metadata
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: has_geo_lookup
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michael Edlund
|
8
|
+
bindir: exe
|
9
|
+
cert_chain: []
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
|
+
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: rails
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: 7.0.0
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 7.0.0
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: activesupport
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 7.0.0
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 7.0.0
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: activerecord
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 7.0.0
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 7.0.0
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: iso_3166
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 0.1.0
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.1.0
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: rgeo
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '3.0'
|
75
|
+
type: :runtime
|
76
|
+
prerelease: false
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '3.0'
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: rgeo-geojson
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '2.0'
|
89
|
+
type: :runtime
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '2.0'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: minitest
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '5.0'
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '5.0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rake
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '13.0'
|
117
|
+
type: :development
|
118
|
+
prerelease: false
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '13.0'
|
124
|
+
description: A Ruby gem that provides geographic lookup functionality using both GeoBoundaries.org
|
125
|
+
and Geonames.org datasets. Features include coordinate validation with radian/degree
|
126
|
+
detection, spatial containment queries, distance-based lookups, and data coverage
|
127
|
+
analysis utilities.
|
128
|
+
email:
|
129
|
+
- medlund@mac.com
|
130
|
+
executables: []
|
131
|
+
extensions: []
|
132
|
+
extra_rdoc_files: []
|
133
|
+
files:
|
134
|
+
- CHANGELOG.md
|
135
|
+
- CODE_OF_CONDUCT.md
|
136
|
+
- LICENSE.txt
|
137
|
+
- README.md
|
138
|
+
- Rakefile
|
139
|
+
- lib/generators/has_geo_lookup/install_generator.rb
|
140
|
+
- lib/generators/has_geo_lookup/templates/INSTALL.md
|
141
|
+
- lib/generators/has_geo_lookup/templates/create_feature_codes.rb.erb
|
142
|
+
- lib/generators/has_geo_lookup/templates/create_geoboundaries.rb.erb
|
143
|
+
- lib/generators/has_geo_lookup/templates/create_geoboundaries_metros.rb.erb
|
144
|
+
- lib/generators/has_geo_lookup/templates/create_geonames.rb.erb
|
145
|
+
- lib/generators/has_geo_lookup/templates/create_geonames_metros.rb.erb
|
146
|
+
- lib/generators/has_geo_lookup/templates/create_metros.rb.erb
|
147
|
+
- lib/has_geo_lookup.rb
|
148
|
+
- lib/has_geo_lookup/concern.rb
|
149
|
+
- lib/has_geo_lookup/index_checker.rb
|
150
|
+
- lib/has_geo_lookup/models/feature_code.rb
|
151
|
+
- lib/has_geo_lookup/models/geoboundary.rb
|
152
|
+
- lib/has_geo_lookup/models/geoname.rb
|
153
|
+
- lib/has_geo_lookup/models/metro.rb
|
154
|
+
- lib/has_geo_lookup/railtie.rb
|
155
|
+
- lib/has_geo_lookup/version.rb
|
156
|
+
- lib/tasks/has_geo_lookup.rake
|
157
|
+
- sig/has_geo_lookup.rbs
|
158
|
+
homepage: https://github.com/arcticleo/has_geo_lookup
|
159
|
+
licenses:
|
160
|
+
- MIT
|
161
|
+
metadata:
|
162
|
+
allowed_push_host: https://rubygems.org
|
163
|
+
homepage_uri: https://github.com/arcticleo/has_geo_lookup
|
164
|
+
source_code_uri: https://github.com/arcticleo/has_geo_lookup
|
165
|
+
changelog_uri: https://github.com/arcticleo/has_geo_lookup/blob/main/CHANGELOG.md
|
166
|
+
rdoc_options: []
|
167
|
+
require_paths:
|
168
|
+
- lib
|
169
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 3.2.0
|
174
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
|
+
requirements:
|
176
|
+
- - ">="
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: '0'
|
179
|
+
requirements: []
|
180
|
+
rubygems_version: 3.7.1
|
181
|
+
specification_version: 4
|
182
|
+
summary: Geographic lookup functionality using GeoBoundaries and Geonames data
|
183
|
+
test_files: []
|