job-grabber 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/adapters/hackernews.rb +15 -0
- data/lib/adapters/reddit.rb +22 -0
- data/lib/adapters/workinstartups.rb +18 -0
- data/lib/base.rb +24 -0
- data/lib/controller.rb +65 -0
- data/lib/job-grabber.rb +4 -0
- data/lib/job.rb +32 -0
- data/lib/src_grabber.rb +19 -0
- metadata +108 -0
checksums.yaml
ADDED
@@ -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
|
data/lib/base.rb
ADDED
@@ -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
|
data/lib/controller.rb
ADDED
@@ -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
|
data/lib/job-grabber.rb
ADDED
data/lib/job.rb
ADDED
@@ -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
|
data/lib/src_grabber.rb
ADDED
@@ -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: []
|