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.
@@ -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: []