job-grabber 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|