job-grabber 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 91bdf872df888136c32e434bf70890f957ffbbcf
4
+ data.tar.gz: 3135775fee91d6f773282b48c8f28003f59cad7d
5
+ SHA512:
6
+ metadata.gz: 482997eef2422e7702151cb444a57cb7c9daf4db52457cfba50a538ff58adcffab2b7a1db5edde57654abba354fa7a629dfc0adf498ec8729f7d155387e36f34
7
+ data.tar.gz: eb5c6cec9ebc3693396d4e4cd3c94fe9c80a62e2be609574f4e5c74f62c795656a6b44ffd11f8a4ba2f559562254cfb714deeab422cf6dfdd10e0a1b8f4a1503
@@ -0,0 +1,15 @@
1
+ require 'hnjobs'
2
+ require_relative '../job'
3
+ module Adapters
4
+ module Hackernews
5
+ extend self
6
+ def grab source
7
+ hiring = HNJobs.new.jobs
8
+ jobs = Array.new
9
+ hiring.each do |job|
10
+ jobs << JobGrabber::Job.new('hackernews:' + source, job["id"].to_s, job["title"], job["text"], Time.at(job["time"]).to_datetime.to_s, (job["url"].nil?)? "" : job["url"])
11
+ end
12
+ jobs
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ require 'dotenv'
2
+ Dotenv.load
3
+ require 'redd'
4
+ require_relative '../job'
5
+ module Adapters
6
+ module Reddit
7
+ extend self
8
+ def grab source
9
+ @r ||= Redd.it(:userless, ENV["REDDIT_CLIENT"], ENV["REDDIT_SECRET"], user_agent: "JobGrabber v1.0.0")
10
+ @r.authorize!
11
+ subreddit_name = source
12
+ subreddit = @r.subreddit_from_name(subreddit_name)
13
+
14
+ hiring = subreddit.get_new.select{|obj| obj[:title].downcase.include?"hiring"}
15
+ jobs = Array.new
16
+ hiring.each do |job|
17
+ jobs << JobGrabber::Job.new('reddit:' + source, job[:id], job[:title], job[:selftext], Time.at(job[:created_utc]).to_datetime.to_s, "http://reddit.com" + job[:permalink])
18
+ end
19
+ jobs
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ require 'workinstartups-api'
2
+ require_relative '../job'
3
+ module Adapters
4
+ module Workinstartups
5
+ extend self
6
+ def grab source
7
+ workinstartups_name = source
8
+ category = WorkInStartupsAPI.category_from_string(workinstartups_name)
9
+ api = WorkInStartupsAPI.new(category, 100)
10
+ hiring = api.get_latest(false)
11
+ jobs = Array.new
12
+ hiring.each do |job|
13
+ jobs << JobGrabber::Job.new('workinstartups:' + source, job["id"], job["title"], job["description"], DateTime.parse(job["mysql_date"]).to_s, "http://workinstartups.com/job-board/job/" + job["id"])
14
+ end
15
+ jobs
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,24 @@
1
+ require_relative 'src_grabber'
2
+ require 'thread'
3
+ module JobGrabber
4
+ class Base
5
+ def initialize(sources)
6
+ @sources = sources
7
+ end
8
+ def grab
9
+ jobs = Array.new
10
+ mutex = Mutex.new
11
+ threads = Array.new
12
+ @sources.each do |src|
13
+ threads << Thread.new(src, jobs) do |src, jobs|
14
+ src_jobs = JobGrabber::SrcGrabber.new(src).grab
15
+ mutex.synchronize do
16
+ jobs << src_jobs
17
+ end
18
+ end
19
+ end
20
+ threads.each(&:join)
21
+ jobs
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,65 @@
1
+ require_relative 'base'
2
+ module JobGrabber
3
+ class Controller
4
+ DEFAULT_FORMAT = "created_at id title link"
5
+ DEFAULT_NUMBER = 5
6
+ DEFAULT_SOURCES = [
7
+ 'reddit:forhire',
8
+ # 'reddit:freelance_forhire',
9
+ # 'reddit:london_forhire',
10
+ # 'workinstartups:co-founder',
11
+ 'workinstartups:programmer',
12
+ 'hackernews:jobs'
13
+ ]
14
+ attr_reader :jobs
15
+ def initialize(sources = DEFAULT_SOURCES, format = DEFAULT_FORMAT, number = DEFAULT_NUMBER)
16
+ @sources = sources
17
+ @format = format
18
+ @jobs = Array.new
19
+ @formatted_jobs = Array.new
20
+ @number = number
21
+ @jobs = JobGrabber::Base.new(@sources).grab
22
+ end
23
+ def add_source source
24
+ @sources.push(source)
25
+ @jobs = JobGrabber::Base.new(@sources).grab
26
+ end
27
+ def remove_source source
28
+ @sources.select!{|src| !src.include?source}
29
+ @jobs.select!{|job| !job.origin.include?source}
30
+ end
31
+ def set_number number
32
+ @number = Integer(number)
33
+ end
34
+ def get_sources with_count = false
35
+ unless with_count
36
+ @sources
37
+ end
38
+ end
39
+ def set_format format
40
+ @format = format
41
+ end
42
+ def get_job_count
43
+ @jobs.count
44
+ end
45
+ def get_jobs_from_date date
46
+ @jobs.select{|job| DateTime.parse(job.created_at) > date}.sort{|a,b|a.created_at<=>a.created_at}.map{|job| job.format(@format)}[0...@number]
47
+ end
48
+ def get_jobs_formatted
49
+ @jobs.sort{|a,b|a.created_at<=>a.created_at}.map{|job| job.format(@format)}[0...@number]
50
+ end
51
+ def get_job id
52
+ @jobs.detect{|job| job.id == id}.format(@format)
53
+ end
54
+ def get_by_source source
55
+ if !@sources.include?source
56
+ raise "Source unknown, add it to the source list first"
57
+ end
58
+ @jobs.select{|job| job.origin == source}.sort{|a,b|a.created_at<=>a.created_at}.map{|job| job.format(@format)}
59
+ end
60
+ def get_by_category category
61
+ category = category.downcase
62
+ @jobs.select{|job| job.description.downcase.include?category}.sort{|a,b|a.created_at<=>a.created_at}.map{|job| job.format(@format)}[0...@number]
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,4 @@
1
+ require 'base'
2
+ require 'controller'
3
+ require 'src_grabber'
4
+ require 'job'
@@ -0,0 +1,32 @@
1
+ module JobGrabber
2
+ class Job
3
+ def initialize (origin, id, title, description, created_at, link)
4
+ @origin = origin
5
+ @id = id
6
+ @title = title
7
+ @description = description
8
+ @created_at = created_at
9
+ @link = link
10
+ end
11
+ attr_reader :origin, :id, :description, :created_at
12
+ def format format
13
+ formatted =''
14
+ if format.include?"created_at"
15
+ formatted += "Date: " + @created_at + "\t"
16
+ end
17
+ if format.include?"id"
18
+ formatted += "id: " + @id + "\n"
19
+ end
20
+ if format.include?"link"
21
+ formatted += "Link: " + @link + "\n"
22
+ end
23
+ if format.include?"title"
24
+ formatted += "Title: " + @title + "\n"
25
+ end
26
+ if format.include?"description"
27
+ formatted += "Text: " + @description
28
+ end
29
+ formatted
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,19 @@
1
+ module JobGrabber
2
+ class SrcGrabber
3
+ def initialize(source)
4
+ @raw_source = source
5
+ @source = source.split(":").last
6
+ adapter_name = source.split(":").first
7
+ case adapter_name
8
+ when Symbol, String
9
+ require_relative "adapters/#{adapter_name}"
10
+ @adapter = Adapters.const_get("#{adapter_name.to_s.capitalize}")
11
+ else
12
+ raise "Missing adapter #{adapter_name}"
13
+ end
14
+ end
15
+ def grab
16
+ @adapter.grab(@source)
17
+ end
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: job-grabber
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Hugo Di Francesco
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dotenv
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: redd
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.7.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: workinstartups-api
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.0.6
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.6
55
+ - !ruby/object:Gem::Dependency
56
+ name: hnjobs
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.3
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.0.3
69
+ description: Gets jobs from multiple sources and return a list of them normalised
70
+ to Job objects
71
+ email: hugo@awebots.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/adapters/hackernews.rb
77
+ - lib/adapters/reddit.rb
78
+ - lib/adapters/workinstartups.rb
79
+ - lib/base.rb
80
+ - lib/controller.rb
81
+ - lib/job-grabber.rb
82
+ - lib/job.rb
83
+ - lib/src_grabber.rb
84
+ homepage: https://github.com/HugoDF/job-grabber
85
+ licenses:
86
+ - MIT
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 2.1.0
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 2.4.8
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: Job Grabber
108
+ test_files: []