loading
Generated 2021-11-05T14:04:46+00:00

All Files ( 70.08% covered at 18.61 hits/line )

10 files in total.
127 relevant lines, 89 lines covered and 38 lines missed. ( 70.08% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
app/admin/admin_users.rb 40.00 % 28 20 8 12 0.40
app/admin/cities.rb 30.00 % 26 10 3 7 0.30
app/admin/dashboard.rb 42.86 % 33 7 3 4 0.43
app/admin/stack_jobs.rb 30.00 % 27 10 3 7 0.30
app/controllers/stack_jobs_controller.rb 82.93 % 86 41 34 7 1.29
app/controllers/static_controller.rb 100.00 % 7 3 3 0 1.00
app/controllers/zzhealth_controller.rb 100.00 % 11 4 4 0 1.00
app/models/admin_user.rb 100.00 % 6 2 2 0 1.00
app/models/city.rb 100.00 % 12 6 6 0 74.00
app/models/stack_job.rb 95.83 % 48 24 23 1 76.71

Controllers ( 85.42% covered at 1.25 hits/line )

3 files in total.
48 relevant lines, 41 lines covered and 7 lines missed. ( 85.42% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
app/controllers/stack_jobs_controller.rb 82.93 % 86 41 34 7 1.29
app/controllers/static_controller.rb 100.00 % 7 3 3 0 1.00
app/controllers/zzhealth_controller.rb 100.00 % 11 4 4 0 1.00

Channels ( 100.0% covered at 0.0 hits/line )

0 files in total.
0 relevant lines, 0 lines covered and 0 lines missed. ( 100.0% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line

Models ( 96.88% covered at 71.47 hits/line )

3 files in total.
32 relevant lines, 31 lines covered and 1 lines missed. ( 96.88% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
app/models/admin_user.rb 100.00 % 6 2 2 0 1.00
app/models/city.rb 100.00 % 12 6 6 0 74.00
app/models/stack_job.rb 95.83 % 48 24 23 1 76.71

Mailers ( 100.0% covered at 0.0 hits/line )

0 files in total.
0 relevant lines, 0 lines covered and 0 lines missed. ( 100.0% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line

Helpers ( 100.0% covered at 0.0 hits/line )

0 files in total.
0 relevant lines, 0 lines covered and 0 lines missed. ( 100.0% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line

Jobs ( 100.0% covered at 0.0 hits/line )

0 files in total.
0 relevant lines, 0 lines covered and 0 lines missed. ( 100.0% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line

Libraries ( 100.0% covered at 0.0 hits/line )

0 files in total.
0 relevant lines, 0 lines covered and 0 lines missed. ( 100.0% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line

Ungrouped ( 36.17% covered at 0.36 hits/line )

4 files in total.
47 relevant lines, 17 lines covered and 30 lines missed. ( 36.17% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
app/admin/admin_users.rb 40.00 % 28 20 8 12 0.40
app/admin/cities.rb 30.00 % 26 10 3 7 0.30
app/admin/dashboard.rb 42.86 % 33 7 3 4 0.43
app/admin/stack_jobs.rb 30.00 % 27 10 3 7 0.30

app/admin/admin_users.rb

40.0% lines covered

20 relevant lines. 8 lines covered and 12 lines missed.
    
  1. 1 ActiveAdmin.register AdminUser do
  2. 1 permit_params :email, :password, :password_confirmation
  3. 1 index do
  4. selectable_column
  5. id_column
  6. column :email
  7. column :current_sign_in_at
  8. column :sign_in_count
  9. column :created_at
  10. actions
  11. end
  12. 1 filter :email
  13. 1 filter :current_sign_in_at
  14. 1 filter :sign_in_count
  15. 1 filter :created_at
  16. 1 form do |f|
  17. f.inputs do
  18. f.input :email
  19. f.input :password
  20. f.input :password_confirmation
  21. end
  22. f.actions
  23. end
  24. end

app/admin/cities.rb

30.0% lines covered

10 relevant lines. 3 lines covered and 7 lines missed.
    
  1. 1 ActiveAdmin.register City do
  2. # See permitted parameters documentation:
  3. # https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters
  4. #
  5. # permit_params :list, :of, :attributes, :on, :model
  6. #
  7. # or
  8. #
  9. # permit_params do
  10. # permitted = [:permitted, :attributes]
  11. # permitted << :other if params[:action] == 'create' && current_user.admin?
  12. # permitted
  13. # end
  14. 1 permit_params :name, :lat, :long, :country, :state
  15. 1 form do |f|
  16. inputs do
  17. input :name
  18. input :lat, :as => :number
  19. input :long, :as => :number
  20. input :country, :as => :string
  21. input :state
  22. actions
  23. end
  24. end
  25. end

app/admin/dashboard.rb

42.86% lines covered

7 relevant lines. 3 lines covered and 4 lines missed.
    
  1. 1 ActiveAdmin.register_page "Dashboard" do
  2. 1 menu priority: 1, label: proc{ I18n.t("active_admin.dashboard") }
  3. 1 content title: proc{ I18n.t("active_admin.dashboard") } do
  4. div class: "blank_slate_container", id: "dashboard_default_message" do
  5. span class: "blank_slate" do
  6. span I18n.t("active_admin.dashboard_welcome.welcome")
  7. small I18n.t("active_admin.dashboard_welcome.call_to_action")
  8. end
  9. end
  10. # Here is an example of a simple dashboard with columns and panels.
  11. #
  12. # columns do
  13. # column do
  14. # panel "Recent Posts" do
  15. # ul do
  16. # Post.recent(5).map do |post|
  17. # li link_to(post.title, admin_post_path(post))
  18. # end
  19. # end
  20. # end
  21. # end
  22. # column do
  23. # panel "Info" do
  24. # para "Welcome to ActiveAdmin."
  25. # end
  26. # end
  27. # end
  28. end # content
  29. end

app/admin/stack_jobs.rb

30.0% lines covered

10 relevant lines. 3 lines covered and 7 lines missed.
    
  1. 1 ActiveAdmin.register StackJob do
  2. # See permitted parameters documentation:
  3. # https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters
  4. #
  5. # permit_params :list, :of, :attributes, :on, :model
  6. #
  7. # or
  8. #
  9. # permit_params do
  10. # permitted = [:permitted, :attributes]
  11. # permitted << :other if params[:action] == 'create' && current_user.admin?
  12. # permitted
  13. # end
  14. 1 permit_params :updated_at
  15. 1 index do
  16. selectable_column
  17. column :id
  18. column :md5hash
  19. column :url
  20. column :created_at
  21. column :updated_at
  22. actions
  23. end
  24. end

app/controllers/stack_jobs_controller.rb

82.93% lines covered

41 relevant lines. 34 lines covered and 7 lines missed.
    
  1. 1 class StackJobsController < ApplicationController
  2. 1 require 'open-uri'
  3. 1 require 'digest'
  4. 1 def index
  5. 1 @search_term = params[:search] || '[ruby-on-rails]'
  6. 1 @min_experience = params[:min] || ''
  7. 1 @max_experience = params[:max] || ''
  8. 1 @job_type = params[:type] || ''
  9. 1 @remote = params[:remote] || nil
  10. args = {
  11. 1 :search => @search_term,
  12. :min_experience => @min_experience,
  13. :max_experience => @max_experience,
  14. :job_type => @job_type,
  15. :remote => @remote
  16. }
  17. 1 url = stack_jobs_url(args)
  18. 1 @stack_jobs = get_stack_jobs(url)
  19. end
  20. 1 def search
  21. args = {
  22. 2 :search => params[:search] || '[ruby-on-rails]',
  23. :min_experience => params[:min] || '',
  24. :max_experience => params[:max] || '',
  25. :job_type => params[:type] || '',
  26. :remote => params[:remote] || nil
  27. }
  28. 2 url = stack_jobs_url(args)
  29. begin
  30. 2 @stack_jobs = get_stack_jobs(url)
  31. 2 if (@stack_jobs.geo_json.blank?)
  32. 1 render json: {"type": "Error", "message": "No jobs found. Try another search"}
  33. else
  34. 1 render json: @stack_jobs.geo_json
  35. end
  36. rescue NoMethodError
  37. render json: {"type": "Error", "message": "No jobs found. Try another search"}
  38. end
  39. end
  40. 1 private
  41. 1 def get_stack_jobs(url)
  42. 3 url_md5 = Digest::MD5.hexdigest url
  43. 3 @stack_jobs = StackJob.find_by(md5hash: url_md5)
  44. 3 if @stack_jobs.blank?
  45. 1 xml = Nokogiri::XML(open(url))
  46. 1 @stack_jobs = StackJob.create(
  47. md5hash: url_md5,
  48. xml: xml,
  49. url: url
  50. )
  51. 1 @stack_jobs.geo_json = @stack_jobs.to_geojson
  52. 1 @stack_jobs.save
  53. 2 elsif @stack_jobs.updated_at < (Time.now - 60.minutes)
  54. xml = Nokogiri::XML(open(url))
  55. @stack_jobs.xml = xml
  56. @stack_jobs.geo_json = @stack_jobs.to_geojson
  57. @stack_jobs.save
  58. end
  59. 3 @stack_jobs
  60. end
  61. 1 def stack_jobs_url(**args)
  62. url = "https://stackoverflow.com/jobs/feed?"\
  63. 3 "q=#{args[:search]}"\
  64. "&ms=#{args[:min_experience]}"\
  65. "&mxs=#{args[:max_experience]}"\
  66. "&j=#{args[:job_type]}"\
  67. "&l=United%20States&d=20&u=Miles" # Currently the application only supports US
  68. 3 unless args[:remote].nil?
  69. url << "&r=true"
  70. end
  71. 3 url
  72. end
  73. end

app/controllers/static_controller.rb

100.0% lines covered

3 relevant lines. 3 lines covered and 0 lines missed.
    
  1. 1 class StaticController < ApplicationController
  2. 1 def pages
  3. end
  4. 1 def index
  5. end
  6. end

app/controllers/zzhealth_controller.rb

100.0% lines covered

4 relevant lines. 4 lines covered and 0 lines missed.
    
  1. 1 class ZzhealthController < ApplicationController
  2. 1 def index
  3. data = {
  4. 1 'status' => 200,
  5. 'message' => 'OK',
  6. 'data' => [],
  7. }
  8. 1 render :json => data
  9. end
  10. end

app/models/admin_user.rb

100.0% lines covered

2 relevant lines. 2 lines covered and 0 lines missed.
    
  1. 1 class AdminUser < ApplicationRecord
  2. # Include default devise modules. Others available are:
  3. # :confirmable, :lockable, :timeoutable and :omniauthable
  4. 1 devise :database_authenticatable,
  5. :recoverable, :rememberable, :trackable, :validatable
  6. end

app/models/city.rb

100.0% lines covered

6 relevant lines. 6 lines covered and 0 lines missed.
    
  1. 1 class City < ApplicationRecord
  2. 1 validates :name, uniqueness: { scope: :state,
  3. message: "One [City, State] pair" }
  4. 1 def self.find_coordinates(city, state)
  5. 290 City.where("lower(name) = ? and lower(state) = ?",city.downcase, state.downcase).first
  6. end
  7. 1 def self.split_city_state(location)
  8. 150 location.split(", ")
  9. end
  10. end

app/models/stack_job.rb

95.83% lines covered

24 relevant lines. 23 lines covered and 1 lines missed.
    
  1. 1 class StackJob < ApplicationRecord
  2. 1 def to_geojson
  3. 2 hash = Hash.from_xml(self.xml)
  4. 2 items = hash['rss']['channel']['item']
  5. 2 json = Hash.new
  6. 2 json["type"] = "FeatureCollection"
  7. 2 features = Array.new
  8. 2 items.each do | item |
  9. 149 if item['location'].nil?
  10. city_loc = City.find_coordinates("remote", "us")
  11. else
  12. 149 scs = City.split_city_state item["location"]
  13. 149 city_loc = City.find_coordinates(scs[0],scs[1])
  14. end
  15. 149 if city_loc.nil? then city_loc = City.find_coordinates("not found", "us") end
  16. 149 date = DateTime.parse(item['pubDate'])
  17. 149 dateFmt = date.strftime("%Y-%m-%dT%H:%M:%S")
  18. 149 categories = item['category'].presence || ["none"]
  19. 149 categories = ( categories.is_a?(Array) ) ? categories : Array(categories)
  20. 149 title = item['title'].split(" at ")
  21. 149 if title.last.include? "allows remote"
  22. 35 title.first << " (allows remote)"
  23. end
  24. 149 feature = { "type" => "Feature",
  25. "properties" => {
  26. "show_on_map" => "true",
  27. "link" => item['link'],
  28. "name" => title.first,
  29. "company" => item['author']['name'],
  30. "city" => item['location'],
  31. "category" => categories,
  32. "date" => dateFmt
  33. },
  34. "geometry" => {
  35. "type" => "Point",
  36. "coordinates" => [ city_loc.long, city_loc.lat ]
  37. }
  38. }
  39. 149 features.push( feature )
  40. end
  41. 2 json["features"] = features
  42. 2 json.to_json
  43. end
  44. end