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.
@@ -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
@@ -0,0 +1,4 @@
1
+ module HasGeoLookup
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ 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: []