geolist 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/location.rb ADDED
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+ require 'iso_country_codes'
5
+ require 'open-uri'
6
+ require 'zip'
7
+ require 'pry'
8
+
9
+ module GeoList
10
+ class << self
11
+ MAXMIND_URL = 'https://download.maxmind.com/app/geoip_download'
12
+ MAXMIND_PARAMS = '?edition_id=GeoLite2-City-CSV&suffix=zip&license_key=PC4n5BvdsNQK3w6m'
13
+ MAXMIND_LINK = MAXMIND_URL + MAXMIND_PARAMS
14
+
15
+ DATA_FILE = File.join(__dir__, 'data.csv')
16
+
17
+ # position in CSV file
18
+ COUNTRY_NAME = 5
19
+ CITY = 10
20
+
21
+ def update_data # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
22
+ downloaded_file = open(MAXMIND_LINK) # rubocop:disable Security/Open
23
+ csv_filename = 'GeoLite2-City-Locations-en.csv'
24
+
25
+ Zip::File.open(downloaded_file) do |zip_file|
26
+ zip_file.each do |file|
27
+ next unless file.name.match?(/#{csv_filename}/)
28
+
29
+ path = File.join(__dir__, csv_filename)
30
+ zip_file.extract(file, path)
31
+ end
32
+ end
33
+
34
+ FileUtils.rm(DATA_FILE) if File.exist?(DATA_FILE)
35
+ File.rename File.join(__dir__, csv_filename), File.join(__dir__, 'data.csv')
36
+
37
+ true
38
+ end
39
+
40
+ def countries
41
+ ::IsoCountryCodes.all.map { |country| { name: country.name, alpha2: country.alpha2, alpha3: country.alpha3 } }
42
+ end
43
+
44
+ def cities(country_name)
45
+ return [] if country_name&.empty?
46
+ return ['Hong Kong'] if country_name == 'Hong Kong'
47
+
48
+ data.select { |row| row[COUNTRY_NAME] == country_name }.map { |row| row[CITY] }.uniq.compact.sort
49
+ end
50
+
51
+ def suburbs(city)
52
+ return [] unless city == 'Hong Kong'
53
+
54
+ data.select { |row| row[COUNTRY_NAME] == city }.map { |row| row[CITY] }.uniq.compact.sort
55
+ end
56
+
57
+ def get(country = nil, city = nil, _suburb = nil)
58
+ return countries if country.nil?
59
+ return cities(country) if city.nil?
60
+
61
+ suburbs(city)
62
+ end
63
+
64
+ def data
65
+ @data ||= CSV.read(DATA_FILE)
66
+ end
67
+ end
68
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: geolist
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - relaxcore
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-02-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: iso_country_codes
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'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubyzip
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.1'
69
+ description: Useful to make forms and validations. It uses MaxMind database.
70
+ email:
71
+ - yuriirogulya@gmail.com
72
+ executables:
73
+ - console
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - ".rubocop.yml"
79
+ - Gemfile
80
+ - Gemfile.lock
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - bin/console
85
+ - geolist.gemspec
86
+ - lib/data.csv
87
+ - lib/location.rb
88
+ homepage: https://github.com/relaxcoredev/location
89
+ licenses:
90
+ - MIT
91
+ metadata: {}
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ requirements: []
107
+ rubyforge_project:
108
+ rubygems_version: 2.7.6
109
+ signing_key:
110
+ specification_version: 4
111
+ summary: Simple list of countries, cities and suburbs of the world
112
+ test_files: []