orb_def 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +79 -0
  3. data/.gitignore +14 -0
  4. data/.rakeTasks +7 -0
  5. data/.rspec +1 -0
  6. data/Gemfile +15 -0
  7. data/Gemfile.lock +207 -0
  8. data/MIT-LICENSE +20 -0
  9. data/README.md +30 -0
  10. data/Rakefile +23 -0
  11. data/app/assets/config/orb_def_manifest.js +2 -0
  12. data/app/assets/javascripts/orb_def/application.js +15 -0
  13. data/app/assets/stylesheets/orb_def/application.css +15 -0
  14. data/app/controllers/orb_def/api/v1/fires_controller.rb +64 -0
  15. data/app/controllers/orb_def/api/v1/weather_readings_controller.rb +16 -0
  16. data/app/controllers/orb_def/application_controller.rb +5 -0
  17. data/app/helpers/orb_def/application_helper.rb +4 -0
  18. data/app/jobs/orb_def/application_job.rb +4 -0
  19. data/app/mailers/orb_def/application_mailer.rb +6 -0
  20. data/app/models/orb_def/application_record.rb +5 -0
  21. data/app/models/orb_def/detection_type.rb +7 -0
  22. data/app/models/orb_def/fire.rb +60 -0
  23. data/app/models/orb_def/weather_reading.rb +41 -0
  24. data/app/models/orb_def/weather_station.rb +33 -0
  25. data/app/serializers/orb_def/api/v1/fire_serializer.rb +17 -0
  26. data/app/services/orb_def/fire_weather_data.rb +36 -0
  27. data/app/services/orb_def/nasa/firms_client.rb +38 -0
  28. data/app/services/orb_def/nasa/firms_import.rb +44 -0
  29. data/app/services/orb_def/open_weather_api/weather_by_coordinates.rb +31 -0
  30. data/app/views/layouts/orb_def/application.html.erb +16 -0
  31. data/bin/rails +25 -0
  32. data/config/routes.rb +13 -0
  33. data/db/migrate/20200422073925_create_orb_def_weather_stations.rb +12 -0
  34. data/db/migrate/20200422073938_create_orb_def_weather_readings.rb +20 -0
  35. data/db/migrate/20200423064313_create_orb_def_detection_types.rb +9 -0
  36. data/db/migrate/20200428063630_create_orb_def_fires.rb +28 -0
  37. data/db/seeds.rb +8 -0
  38. data/lib/orb_def/engine.rb +16 -0
  39. data/lib/orb_def/version.rb +3 -0
  40. data/lib/orb_def.rb +16 -0
  41. data/lib/tasks/orb_def_tasks.rake +4 -0
  42. data/orb_def.gemspec +38 -0
  43. data/spec/controllers/orb_def/api/v1/fires_controller_spec.rb +16 -0
  44. data/spec/dummy/Rakefile +6 -0
  45. data/spec/dummy/app/assets/config/manifest.js +4 -0
  46. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  47. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  48. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  49. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  50. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  51. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  52. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  53. data/spec/dummy/app/jobs/application_job.rb +2 -0
  54. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  55. data/spec/dummy/app/models/application_record.rb +3 -0
  56. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  57. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  58. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  59. data/spec/dummy/bin/bundle +3 -0
  60. data/spec/dummy/bin/rails +4 -0
  61. data/spec/dummy/bin/rake +4 -0
  62. data/spec/dummy/bin/setup +36 -0
  63. data/spec/dummy/bin/update +31 -0
  64. data/spec/dummy/bin/yarn +11 -0
  65. data/spec/dummy/config/application.rb +30 -0
  66. data/spec/dummy/config/boot.rb +5 -0
  67. data/spec/dummy/config/cable.yml +10 -0
  68. data/spec/dummy/config/database.yml +21 -0
  69. data/spec/dummy/config/environment.rb +5 -0
  70. data/spec/dummy/config/environments/development.rb +61 -0
  71. data/spec/dummy/config/environments/production.rb +94 -0
  72. data/spec/dummy/config/environments/test.rb +46 -0
  73. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  74. data/spec/dummy/config/initializers/assets.rb +14 -0
  75. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  76. data/spec/dummy/config/initializers/content_security_policy.rb +25 -0
  77. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  78. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  79. data/spec/dummy/config/initializers/inflections.rb +16 -0
  80. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  81. data/spec/dummy/config/initializers/orb_def.rb +4 -0
  82. data/spec/dummy/config/initializers/pagy.rb +170 -0
  83. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  84. data/spec/dummy/config/locales/en.yml +33 -0
  85. data/spec/dummy/config/orb_def/spring.rb +1 -0
  86. data/spec/dummy/config/puma.rb +37 -0
  87. data/spec/dummy/config/routes.rb +3 -0
  88. data/spec/dummy/config/spring.rb +6 -0
  89. data/spec/dummy/config/storage.yml +34 -0
  90. data/spec/dummy/config.ru +5 -0
  91. data/spec/dummy/db/schema.rb +87 -0
  92. data/spec/dummy/package.json +5 -0
  93. data/spec/dummy/public/404.html +67 -0
  94. data/spec/dummy/public/422.html +67 -0
  95. data/spec/dummy/public/500.html +66 -0
  96. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  97. data/spec/dummy/public/apple-touch-icon.png +0 -0
  98. data/spec/dummy/public/favicon.ico +0 -0
  99. data/spec/factories/detection_type.rb +5 -0
  100. data/spec/fixtures/files/modis_c6.txt +3 -0
  101. data/spec/fixtures/nasa/firms/viirs.txt +3 -0
  102. data/spec/rails_helper.rb +72 -0
  103. data/spec/services/orbital_defence_engine/nasa/firms_import_spec.rb +27 -0
  104. data/spec/services/orbital_defence_engine/open_weather_api/weather_by_coordinates_spec.rb +16 -0
  105. data/spec/spec/vcr/cassettes/OrbitalDefenceEngine_Nasa_FirmsImport/_all/when_request_successful/creates_fires.yml +77 -0
  106. data/spec/spec/vcr/cassettes/OrbitalDefenceEngine_OpenWeatherApi_WeatherByCoordinates/_fetch_weather_by_coordinates/returns_json_data_as_a_hash.yml +41 -0
  107. data/spec/spec_helper.rb +96 -0
  108. data/spec/support/factory_bot.rb +3 -0
  109. data/spec/support/vcr.rb +9 -0
  110. data/spec/vcr/cassettes/OpenWeatherApi_WeatherByCoordinates/_fetch_weather_by_coordinates/returns_json_data_as_a_hash.yml +41 -0
  111. data/spec/vcr/cassettes/OrbDef_Nasa_FirmsImport/_all/when_request_successful/creates_fires.yml +4766 -0
  112. data/spec/vcr/cassettes/OrbDef_OpenWeatherApi_WeatherByCoordinates/_fetch_weather_by_coordinates/returns_json_data_as_a_hash.yml +41 -0
  113. metadata +438 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 45cd1b41303717de3db93b68f5f070153f9f2df9f7afb949ff8fef692afb796b
4
+ data.tar.gz: ce1191ce16e8f3462aea7fa4e2c3132164c900a26b8ac9f1fc80c0b48b51f64f
5
+ SHA512:
6
+ metadata.gz: 37c7a7c7457d6f7bcbcb496c6c4375038a1fb86b8d717cb42271294418320c568837cae351d6ff0c1ea7d44b071c7bb93b0c965e15b76ad272f7e307703fc6dc
7
+ data.tar.gz: 9a7a3e9774701b98885202078e721a524d53f3f38ca8324aec1f9c57fbf9f805c6a4ae4ed7069ee32138ebde373d3b080951965d2c0e3aad3fc962d5d58c6bfa
@@ -0,0 +1,79 @@
1
+ # Ruby CircleCI 2.0 configuration file
2
+ #
3
+ # Check https://circleci.com/docs/2.0/language-ruby/ for more details
4
+ #
5
+ version: 2
6
+ jobs:
7
+ build:
8
+ docker:
9
+ # specify the version you desire here
10
+ - image: circleci/ruby:2.6.5-node-browsers
11
+ environment:
12
+ RAILS_ENV: test
13
+ PGHOST: 127.0.0.1
14
+ PGUSER: root
15
+ # DB_USER: ${DB_USER}
16
+ # DB_PASSWORD: ${DB_PASSWORD}
17
+ # DB_HOST: ${DB_HOST}
18
+
19
+ # Specify service dependencies here if necessary
20
+ # CircleCI maintains a library of pre-built images
21
+ # documented at https://circleci.com/docs/2.0/circleci-images/
22
+ - image: circleci/postgres:9.4
23
+ environment:
24
+ POSTGRES_USER: root
25
+ POSTGRES_PASSWORD: circleci_test
26
+ POSTGRES_DB: orb_def_test
27
+
28
+ working_directory: ~/repo
29
+
30
+ steps:
31
+ - checkout
32
+
33
+ # Download and cache dependencies
34
+ - restore_cache:
35
+ keys:
36
+ - v1-dependencies-{{ checksum "Gemfile.lock" }}
37
+ # fallback to using the latest cache if no exact match is found
38
+ - v1-dependencies-
39
+
40
+ - run:
41
+ name: install dependencies
42
+ command: |
43
+ bundle install --jobs=4 --retry=3 --path vendor/bundle
44
+
45
+ - run: sudo apt install -y postgresql-client || true
46
+
47
+ - save_cache:
48
+ paths:
49
+ - ./vendor/bundle
50
+ key: v1-dependencies-{{ checksum "Gemfile.lock" }}
51
+
52
+ # Database setup
53
+ - run:
54
+ name: Set up DB
55
+ command: |
56
+ bundle exec rake db:create db:schema:load --trace
57
+ bundle exec rake db:migrate
58
+ environment:
59
+ DATABASE_URL: "postgres://root@localhost:5432/orb_def_test"
60
+
61
+ # run tests!
62
+ - run:
63
+ name: run tests
64
+ command: |
65
+ mkdir /tmp/test-results
66
+ TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
67
+
68
+ bundle exec rspec --format progress \
69
+ --format RspecJunitFormatter \
70
+ --out /tmp/test-results/rspec.xml \
71
+ --format progress \
72
+ $TEST_FILES
73
+
74
+ # collect reports
75
+ - store_test_results:
76
+ path: /tmp/test-results
77
+ - store_artifacts:
78
+ path: /tmp/test-results
79
+ destination: test-results
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ .bundle/
2
+ log/*.log
3
+ pkg/
4
+ spec/dummy/db/*.sqlite3
5
+ spec/dummy/db/*.sqlite3-journal
6
+ spec/dummy/log/*.log
7
+ spec/dummy/node_modules/
8
+ spec/dummy/yarn-error.log
9
+ spec/dummy/storage/
10
+ spec/dummy/tmp/
11
+
12
+ # IDE
13
+ .idea/
14
+ .keep
data/.rakeTasks ADDED
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Settings><!--This file was automatically generated by Ruby plugin.
3
+ You are allowed to:
4
+ 1. Remove rake task
5
+ 2. Add existing rake tasks
6
+ To add existing rake tasks automatically delete this file and reload the project.
7
+ --><RakeGroup description="" fullCmd="" taksId="rake" /></Settings>
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ # Declare your gem's dependencies in orb_def.gemspec.
5
+ # Bundler will treat runtime dependencies like base dependencies, and
6
+ # development dependencies will be added by default to the :development group.
7
+ gemspec
8
+
9
+ # Declare any dependencies that are still in development here instead of in
10
+ # your gemspec. These might include edge Rails or gems from your path or
11
+ # Git. Remember to move these dependencies to your gemspec before releasing
12
+ # your gem to rubygems.org.
13
+
14
+ # To use a debugger
15
+ # gem 'byebug', group: [:development, :test]
data/Gemfile.lock ADDED
@@ -0,0 +1,207 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ orb_def (0.0.1)
5
+ active_model_serializers
6
+ faraday (~> 0.15.3)
7
+ geokit-rails (~> 2.3, >= 2.3.1)
8
+ pagy (~> 3.7, >= 3.7.5)
9
+ rails (~> 5.2.4, >= 5.2.4.2)
10
+
11
+ GEM
12
+ remote: https://rubygems.org/
13
+ specs:
14
+ actioncable (5.2.4.2)
15
+ actionpack (= 5.2.4.2)
16
+ nio4r (~> 2.0)
17
+ websocket-driver (>= 0.6.1)
18
+ actionmailer (5.2.4.2)
19
+ actionpack (= 5.2.4.2)
20
+ actionview (= 5.2.4.2)
21
+ activejob (= 5.2.4.2)
22
+ mail (~> 2.5, >= 2.5.4)
23
+ rails-dom-testing (~> 2.0)
24
+ actionpack (5.2.4.2)
25
+ actionview (= 5.2.4.2)
26
+ activesupport (= 5.2.4.2)
27
+ rack (~> 2.0, >= 2.0.8)
28
+ rack-test (>= 0.6.3)
29
+ rails-dom-testing (~> 2.0)
30
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
31
+ actionview (5.2.4.2)
32
+ activesupport (= 5.2.4.2)
33
+ builder (~> 3.1)
34
+ erubi (~> 1.4)
35
+ rails-dom-testing (~> 2.0)
36
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
37
+ active_model_serializers (0.10.10)
38
+ actionpack (>= 4.1, < 6.1)
39
+ activemodel (>= 4.1, < 6.1)
40
+ case_transform (>= 0.2)
41
+ jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
42
+ activejob (5.2.4.2)
43
+ activesupport (= 5.2.4.2)
44
+ globalid (>= 0.3.6)
45
+ activemodel (5.2.4.2)
46
+ activesupport (= 5.2.4.2)
47
+ activerecord (5.2.4.2)
48
+ activemodel (= 5.2.4.2)
49
+ activesupport (= 5.2.4.2)
50
+ arel (>= 9.0)
51
+ activestorage (5.2.4.2)
52
+ actionpack (= 5.2.4.2)
53
+ activerecord (= 5.2.4.2)
54
+ marcel (~> 0.3.1)
55
+ activesupport (5.2.4.2)
56
+ concurrent-ruby (~> 1.0, >= 1.0.2)
57
+ i18n (>= 0.7, < 2)
58
+ minitest (~> 5.1)
59
+ tzinfo (~> 1.1)
60
+ addressable (2.7.0)
61
+ public_suffix (>= 2.0.2, < 5.0)
62
+ arel (9.0.0)
63
+ builder (3.2.4)
64
+ case_transform (0.2)
65
+ activesupport
66
+ concurrent-ruby (1.1.6)
67
+ connection_pool (2.2.2)
68
+ crack (0.4.3)
69
+ safe_yaml (~> 1.0.0)
70
+ crass (1.0.6)
71
+ diff-lcs (1.3)
72
+ erubi (1.9.0)
73
+ factory_bot (5.1.2)
74
+ activesupport (>= 4.2.0)
75
+ factory_bot_rails (5.1.1)
76
+ factory_bot (~> 5.1.0)
77
+ railties (>= 4.2.0)
78
+ faraday (0.15.4)
79
+ multipart-post (>= 1.2, < 3)
80
+ geokit (1.13.1)
81
+ geokit-rails (2.3.1)
82
+ geokit (~> 1.5)
83
+ rails (>= 3.0)
84
+ globalid (0.4.2)
85
+ activesupport (>= 4.2.0)
86
+ hashdiff (1.0.1)
87
+ i18n (1.8.2)
88
+ concurrent-ruby (~> 1.0)
89
+ jsonapi-renderer (0.2.2)
90
+ loofah (2.5.0)
91
+ crass (~> 1.0.2)
92
+ nokogiri (>= 1.5.9)
93
+ mail (2.7.1)
94
+ mini_mime (>= 0.1.1)
95
+ marcel (0.3.3)
96
+ mimemagic (~> 0.3.2)
97
+ method_source (1.0.0)
98
+ mimemagic (0.3.4)
99
+ mini_mime (1.0.2)
100
+ mini_portile2 (2.4.0)
101
+ minitest (5.14.0)
102
+ multipart-post (2.1.1)
103
+ nio4r (2.5.2)
104
+ nokogiri (1.10.9)
105
+ mini_portile2 (~> 2.4.0)
106
+ pagy (3.7.5)
107
+ pg (1.2.3)
108
+ public_suffix (4.0.4)
109
+ rack (2.2.2)
110
+ rack-protection (2.0.8.1)
111
+ rack
112
+ rack-test (1.1.0)
113
+ rack (>= 1.0, < 3)
114
+ rails (5.2.4.2)
115
+ actioncable (= 5.2.4.2)
116
+ actionmailer (= 5.2.4.2)
117
+ actionpack (= 5.2.4.2)
118
+ actionview (= 5.2.4.2)
119
+ activejob (= 5.2.4.2)
120
+ activemodel (= 5.2.4.2)
121
+ activerecord (= 5.2.4.2)
122
+ activestorage (= 5.2.4.2)
123
+ activesupport (= 5.2.4.2)
124
+ bundler (>= 1.3.0)
125
+ railties (= 5.2.4.2)
126
+ sprockets-rails (>= 2.0.0)
127
+ rails-dom-testing (2.0.3)
128
+ activesupport (>= 4.2.0)
129
+ nokogiri (>= 1.6)
130
+ rails-html-sanitizer (1.3.0)
131
+ loofah (~> 2.3)
132
+ railties (5.2.4.2)
133
+ actionpack (= 5.2.4.2)
134
+ activesupport (= 5.2.4.2)
135
+ method_source
136
+ rake (>= 0.8.7)
137
+ thor (>= 0.19.0, < 2.0)
138
+ rake (13.0.1)
139
+ redis (4.1.3)
140
+ rspec-core (3.9.1)
141
+ rspec-support (~> 3.9.1)
142
+ rspec-expectations (3.9.1)
143
+ diff-lcs (>= 1.2.0, < 2.0)
144
+ rspec-support (~> 3.9.0)
145
+ rspec-mocks (3.9.1)
146
+ diff-lcs (>= 1.2.0, < 2.0)
147
+ rspec-support (~> 3.9.0)
148
+ rspec-rails (3.9.1)
149
+ actionpack (>= 3.0)
150
+ activesupport (>= 3.0)
151
+ railties (>= 3.0)
152
+ rspec-core (~> 3.9.0)
153
+ rspec-expectations (~> 3.9.0)
154
+ rspec-mocks (~> 3.9.0)
155
+ rspec-support (~> 3.9.0)
156
+ rspec-sidekiq (3.0.3)
157
+ rspec-core (~> 3.0, >= 3.0.0)
158
+ sidekiq (>= 2.4.0)
159
+ rspec-support (3.9.2)
160
+ rspec_junit_formatter (0.4.1)
161
+ rspec-core (>= 2, < 4, != 2.12.0)
162
+ safe_yaml (1.0.5)
163
+ shoulda-matchers (3.1.3)
164
+ activesupport (>= 4.0.0)
165
+ sidekiq (6.0.7)
166
+ connection_pool (>= 2.2.2)
167
+ rack (~> 2.0)
168
+ rack-protection (>= 2.0.0)
169
+ redis (>= 4.1.0)
170
+ sprockets (4.0.0)
171
+ concurrent-ruby (~> 1.0)
172
+ rack (> 1, < 3)
173
+ sprockets-rails (3.2.1)
174
+ actionpack (>= 4.0)
175
+ activesupport (>= 4.0)
176
+ sprockets (>= 3.0.0)
177
+ thor (1.0.1)
178
+ thread_safe (0.3.6)
179
+ timecop (0.9.1)
180
+ tzinfo (1.2.7)
181
+ thread_safe (~> 0.1)
182
+ vcr (5.1.0)
183
+ webmock (3.8.3)
184
+ addressable (>= 2.3.6)
185
+ crack (>= 0.3.2)
186
+ hashdiff (>= 0.4.0, < 2.0.0)
187
+ websocket-driver (0.7.1)
188
+ websocket-extensions (>= 0.1.0)
189
+ websocket-extensions (0.1.4)
190
+
191
+ PLATFORMS
192
+ ruby
193
+
194
+ DEPENDENCIES
195
+ factory_bot_rails (>= 5.1.1)
196
+ orb_def!
197
+ pg
198
+ rspec-rails (~> 3.9.0)
199
+ rspec-sidekiq
200
+ rspec_junit_formatter
201
+ shoulda-matchers (~> 3.1)
202
+ timecop (~> 0.9.1)
203
+ vcr
204
+ webmock
205
+
206
+ BUNDLED WITH
207
+ 1.17.3
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2020 James Gascoigne-Taylor
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ [![CircleCI](https://circleci.com/gh/flippakitten/orbital_defence_engine/tree/master.svg?style=svg)](https://circleci.com/gh/flippakitten/orbital_defence_engine/tree/master)
2
+ # OrbitalDefenceEngine
3
+ Busy extracting out the logic from [Orbital Defence Demo](https://github.com/flippakitten/orbital_defence_demo)
4
+ Will probably rename this to something shorter and does not contain the word Engine (unless I name it FireEngine)
5
+
6
+ ## Usage
7
+ Coming soon!
8
+
9
+ ## Installation
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'orb_def'
14
+ ```
15
+
16
+ And then execute:
17
+ ```bash
18
+ $ bundle
19
+ ```
20
+
21
+ Or install it yourself as:
22
+ ```bash
23
+ $ gem install orb_def
24
+ ```
25
+
26
+ ## Contributing
27
+ Contribution directions go here.
28
+
29
+ ## License
30
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'OrbitalDefenceEngine'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ load 'rails/tasks/statistics.rake'
21
+
22
+ require 'bundler/gem_tasks'
23
+
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/orb_def .js
2
+ //= link_directory ../stylesheets/orb_def .css
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require rails-ujs
14
+ //= require activestorage
15
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,64 @@
1
+ module OrbDef
2
+ class Api::V1::FiresController < ApplicationController
3
+ include Pagy::Backend
4
+ after_action { pagy_headers_merge(@pagy) if @pagy }
5
+
6
+ def index
7
+ @pagy, @records = pagy(Fire.in_last_24_hours, items: 100)
8
+
9
+ render json: { data: @records }, status: :ok, each_serializer: Api::V1::FireSerializer
10
+ end
11
+
12
+ def search
13
+ render json: fires_in_bounds, status: :ok, each_serializer: Api::V1::FireSerializer
14
+ end
15
+
16
+ def fires_current_wind_direction_indicator
17
+
18
+ wind_indicators = fires_in_bounds.map do |fire|
19
+ current_weather = fire.weather_station.weather_readings.last
20
+ endpoint = fire.endpoint(current_weather.wind_direction, 2)
21
+ {
22
+ fire: { lat: fire.latitude, lng: fire.longitude },
23
+ wind: { lat: endpoint.lat, lng: endpoint.lng }
24
+ }
25
+ end
26
+
27
+ render json: wind_indicators, status: :ok
28
+ end
29
+
30
+ private
31
+
32
+ def fire_params
33
+ params.permit(:sw_bound_point, :ne_bound_point)
34
+ end
35
+
36
+ def fires_in_bounds
37
+ @fires_in_bounds ||= Fire.in_last_24_hours.in_bounds([sw_bound_point, ne_bound_point])
38
+ end
39
+ def sw_bound_point
40
+ @sw_bound_point ||= Geokit::LatLng.new(get_lat(sw_lat_lng), get_lng(sw_lat_lng))
41
+ end
42
+
43
+ def ne_bound_point
44
+ @ne_bound_point ||= Geokit::LatLng.new(get_lat(ne_lat_lng), get_lng(ne_lat_lng))
45
+ end
46
+
47
+ def ne_lat_lng
48
+ params['ne_bound_point']
49
+ end
50
+
51
+ def sw_lat_lng
52
+ params['sw_bound_point']
53
+ end
54
+
55
+ def get_lat(string)
56
+ string.split(',').first.to_f
57
+ end
58
+
59
+ def get_lng(string)
60
+ string.split(',').last.to_f
61
+ end
62
+ end
63
+ end
64
+
@@ -0,0 +1,16 @@
1
+ module OrbDef
2
+ class Api::V1::WeatherReadingsController < ApplicationController
3
+
4
+ def show
5
+ reading = WeatherStation.find(params['id'].to_i).weather_readings.last
6
+ render json: reading.to_json, status: :ok
7
+ end
8
+
9
+ private
10
+
11
+ def fire_params
12
+ params.permit(:id)
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,5 @@
1
+ module OrbDef
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ module OrbDef
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module OrbDef
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module OrbDef
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: 'from@example.com'
4
+ layout 'mailer'
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module OrbDef
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module OrbDef
2
+ class DetectionType < ApplicationRecord
3
+ has_many :fires
4
+
5
+ validates :name, presence: true, uniqueness: true
6
+ end
7
+ end
@@ -0,0 +1,60 @@
1
+ module OrbDef
2
+ class Fire < ApplicationRecord
3
+ acts_as_mappable :default_units => :kms,
4
+ :default_formula => :sphere,
5
+ :distance_field_name => :distance,
6
+ :lat_column_name => :latitude,
7
+ :lng_column_name => :longitude
8
+
9
+ belongs_to :weather_station
10
+ belongs_to :detection_type
11
+ has_many :weather_readings, through: :weather_station
12
+
13
+ validates :identifier, uniqueness: true
14
+ validates :latitude, presence: true
15
+ validates :longitude, presence: true
16
+
17
+ scope :in_last_24_hours, -> { where(detected_at: (Time.now - 24.hours)..Time.now) }
18
+
19
+ class << self
20
+ def create_from_csv_row(row, scan_type)
21
+ acq_time = row['acq_time'].include?(':') ? row['acq_time'] : "#{row['acq_time'][0..1]}:#{row['acq_time'][2..3]}"
22
+ detected_at = "#{row['acq_date']} #{acq_time}"
23
+ lat_long = "#{row['latitude']},#{row['longitude']}"
24
+ fire_identifier = Digest::SHA2.hexdigest "#{lat_long}#{detected_at}"
25
+
26
+ return if Fire.find_by(identifier: fire_identifier).present?
27
+
28
+ fire = Fire.create(
29
+ identifier: fire_identifier,
30
+ lat_long: lat_long,
31
+ scan_type: scan_type.downcase,
32
+ latitude: row['latitude'].to_f,
33
+ longitude: row['longitude'].to_f,
34
+ brightness: row['brightness'],
35
+ bright_t31: row['bright_t31'],
36
+ bright_ti5: row['bright_ti5'],
37
+ bright_ti4: row['bright_ti4'],
38
+ scan: row['scan'],
39
+ track: row['track'],
40
+ frp: row['frp'],
41
+ satellite: row['satellite'],
42
+ confidence: row['confidence'],
43
+ version: row['version'],
44
+ day_night: row['day_night'],
45
+ detected_at: detected_at.to_datetime,
46
+ detection_type_id: OrbDef::DetectionType.find_by_name('Satellite').id
47
+ )
48
+
49
+ station, reading = OrbDef::FireWeatherData.new(fire).find_or_create_weather
50
+
51
+ fire.update_attributes(detected_at_weather_reading_id: reading.id, weather_station_id: station.id)
52
+ fire.save!
53
+ end
54
+ end
55
+
56
+ def detected_at_weather
57
+ OrbDef::WeatherReading.find_by(id: weather_reading_id)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,41 @@
1
+ module OrbDef
2
+ class WeatherReading < ApplicationRecord
3
+ belongs_to :weather_station
4
+ has_many :fires, through: :weather_station
5
+
6
+ validates :identifier, uniqueness: true
7
+ validates :temperature, presence: true
8
+
9
+ after_find :convert_temperature
10
+
11
+ class << self
12
+ def find_or_create_by_reading(reading_json, weather_station_id)
13
+ identifier = "#{reading_json['name']}:#{reading_json['dt']}"
14
+ weather_reading = WeatherReading.find_by(identifier: identifier)
15
+
16
+ return weather_reading if weather_reading.present?
17
+
18
+ WeatherReading.create(
19
+ weather_station_id: weather_station_id,
20
+ identifier: identifier,
21
+ temperature: reading_json['main']['temp'],
22
+ pressure: reading_json['main']['pressure'],
23
+ ground_level: reading_json['main']['grnd_level'],
24
+ humidity: reading_json['main']['humidity'],
25
+ wind_speed: ( reading_json['wind']['speed'] * 3.6),
26
+ wind_direction: reading_json['wind']['deg'],
27
+ rain: reading_json.dig('rain', '3h'),
28
+ cloud: reading_json.dig('clouds', 'today'),
29
+ description: reading_json['weather'].first['description'],
30
+ reading_at: Time.at(reading_json['dt']).to_datetime
31
+ )
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def convert_temperature
38
+ self.temperature = self.temperature - 273.15
39
+ end
40
+ end
41
+ end