craigslist-api 0.1.0
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/CHANGELOG.md +53 -0
- data/LICENSE.txt +21 -0
- data/README.md +405 -0
- data/lib/craigslist/api/access_token.rb +68 -0
- data/lib/craigslist/api/area.rb +98 -0
- data/lib/craigslist/api/bulk_transport.rb +94 -0
- data/lib/craigslist/api/category.rb +47 -0
- data/lib/craigslist/api/client.rb +207 -0
- data/lib/craigslist/api/configuration.rb +130 -0
- data/lib/craigslist/api/connection.rb +54 -0
- data/lib/craigslist/api/credit_summary.rb +39 -0
- data/lib/craigslist/api/envelope.rb +65 -0
- data/lib/craigslist/api/errors.rb +82 -0
- data/lib/craigslist/api/image.rb +102 -0
- data/lib/craigslist/api/image_info.rb +53 -0
- data/lib/craigslist/api/json_transport.rb +153 -0
- data/lib/craigslist/api/money.rb +77 -0
- data/lib/craigslist/api/posting.rb +216 -0
- data/lib/craigslist/api/posting_block.rb +44 -0
- data/lib/craigslist/api/posting_handle.rb +142 -0
- data/lib/craigslist/api/posting_stats.rb +85 -0
- data/lib/craigslist/api/reference.rb +84 -0
- data/lib/craigslist/api/resources/account.rb +73 -0
- data/lib/craigslist/api/resources/base.rb +45 -0
- data/lib/craigslist/api/resources/billing.rb +47 -0
- data/lib/craigslist/api/resources/images.rb +104 -0
- data/lib/craigslist/api/resources/postings.rb +95 -0
- data/lib/craigslist/api/response_parser.rb +91 -0
- data/lib/craigslist/api/result.rb +123 -0
- data/lib/craigslist/api/result_set.rb +96 -0
- data/lib/craigslist/api/serializer.rb +177 -0
- data/lib/craigslist/api/token_provider.rb +80 -0
- data/lib/craigslist/api/version.rb +8 -0
- data/lib/craigslist/api/zip_location.rb +80 -0
- data/lib/craigslist/api.rb +63 -0
- metadata +127 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Craigslist
|
|
4
|
+
module API
|
|
5
|
+
# Where a US ZIP code maps to on craigslist.
|
|
6
|
+
#
|
|
7
|
+
# Carries a subarea when the ZIP resolves to one. That matters more than it
|
|
8
|
+
# looks: subarea is required in every area that has subareas, and omitting
|
|
9
|
+
# it is the most common reason a posting comes back NOT_VALID.
|
|
10
|
+
#
|
|
11
|
+
# @example Feeding a posting directly
|
|
12
|
+
# place = client.area_for_zip("94110")
|
|
13
|
+
# place.area #=> "sfo"
|
|
14
|
+
# place.subarea #=> "sfc"
|
|
15
|
+
#
|
|
16
|
+
# Craigslist::API::Posting.new(**place.to_h, key: ..., title: ...)
|
|
17
|
+
class ZipLocation
|
|
18
|
+
# @return [String, nil] area abbreviation, e.g. "sfo"
|
|
19
|
+
attr_reader :area
|
|
20
|
+
|
|
21
|
+
# @return [String, nil] e.g. "SF bay area"
|
|
22
|
+
attr_reader :area_description
|
|
23
|
+
|
|
24
|
+
# @return [String, nil] subarea abbreviation, e.g. "sfc"
|
|
25
|
+
attr_reader :subarea
|
|
26
|
+
|
|
27
|
+
# @return [String, nil] e.g. "city of san francisco"
|
|
28
|
+
attr_reader :subarea_description
|
|
29
|
+
|
|
30
|
+
def initialize(area: nil, area_description: nil, subarea: nil, subarea_description: nil)
|
|
31
|
+
@area = area
|
|
32
|
+
@area_description = area_description
|
|
33
|
+
@subarea = subarea
|
|
34
|
+
@subarea_description = subarea_description
|
|
35
|
+
freeze
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Builds from the endpoint payload.
|
|
39
|
+
#
|
|
40
|
+
# The live API nests under "area" and "subarea". The published OpenAPI
|
|
41
|
+
# spec documents a flat shape instead, so both are accepted.
|
|
42
|
+
#
|
|
43
|
+
# @param data [Hash, nil]
|
|
44
|
+
# @return [ZipLocation]
|
|
45
|
+
def self.from(data)
|
|
46
|
+
data ||= {}
|
|
47
|
+
nested = data["area"]
|
|
48
|
+
|
|
49
|
+
if nested.is_a?(Hash)
|
|
50
|
+
sub = data["subarea"].is_a?(Hash) ? data["subarea"] : {}
|
|
51
|
+
new(
|
|
52
|
+
area: nested["abbreviation"],
|
|
53
|
+
area_description: nested["description"],
|
|
54
|
+
subarea: sub["abbreviation"],
|
|
55
|
+
subarea_description: sub["description"]
|
|
56
|
+
)
|
|
57
|
+
else
|
|
58
|
+
new(area: data["abbreviation"], area_description: data["description"])
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @return [Boolean] whether this ZIP resolved to a subarea
|
|
63
|
+
def subarea?
|
|
64
|
+
!subarea.nil?
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Posting keywords, ready to splat. Omits +:subarea+ when there is none,
|
|
68
|
+
# rather than passing an explicit nil.
|
|
69
|
+
#
|
|
70
|
+
# @return [Hash]
|
|
71
|
+
def to_h
|
|
72
|
+
subarea? ? {area: area, subarea: subarea} : {area: area}
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def inspect
|
|
76
|
+
"#<#{self.class.name} area=#{area.inspect} subarea=#{subarea.inspect}>"
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "time"
|
|
4
|
+
|
|
5
|
+
require "craigslist/api/version"
|
|
6
|
+
require "craigslist/api/errors"
|
|
7
|
+
|
|
8
|
+
require "craigslist/api/connection"
|
|
9
|
+
require "craigslist/api/configuration"
|
|
10
|
+
|
|
11
|
+
require "craigslist/api/money"
|
|
12
|
+
require "craigslist/api/envelope"
|
|
13
|
+
require "craigslist/api/access_token"
|
|
14
|
+
require "craigslist/api/token_provider"
|
|
15
|
+
require "craigslist/api/json_transport"
|
|
16
|
+
|
|
17
|
+
require "craigslist/api/image"
|
|
18
|
+
require "craigslist/api/posting"
|
|
19
|
+
require "craigslist/api/serializer"
|
|
20
|
+
require "craigslist/api/result"
|
|
21
|
+
require "craigslist/api/result_set"
|
|
22
|
+
require "craigslist/api/response_parser"
|
|
23
|
+
require "craigslist/api/bulk_transport"
|
|
24
|
+
|
|
25
|
+
require "craigslist/api/image_info"
|
|
26
|
+
require "craigslist/api/posting_block"
|
|
27
|
+
require "craigslist/api/credit_summary"
|
|
28
|
+
require "craigslist/api/posting_stats"
|
|
29
|
+
require "craigslist/api/area"
|
|
30
|
+
require "craigslist/api/category"
|
|
31
|
+
require "craigslist/api/zip_location"
|
|
32
|
+
require "craigslist/api/reference"
|
|
33
|
+
|
|
34
|
+
require "craigslist/api/resources/base"
|
|
35
|
+
require "craigslist/api/resources/postings"
|
|
36
|
+
require "craigslist/api/resources/images"
|
|
37
|
+
require "craigslist/api/resources/billing"
|
|
38
|
+
require "craigslist/api/resources/account"
|
|
39
|
+
|
|
40
|
+
require "craigslist/api/posting_handle"
|
|
41
|
+
require "craigslist/api/client"
|
|
42
|
+
|
|
43
|
+
# Top-level namespace. This gem defines everything under {Craigslist::API}.
|
|
44
|
+
module Craigslist
|
|
45
|
+
# Ruby client for the Craigslist bulk posting platform.
|
|
46
|
+
#
|
|
47
|
+
# Access to bulk posting is granted by Craigslist on a case-by-case basis to
|
|
48
|
+
# high-volume posters, and is limited to paid US categories: jobs (offered),
|
|
49
|
+
# apartment rentals in NYC, and for-sale-by-dealer.
|
|
50
|
+
#
|
|
51
|
+
# @see Client the single entry point
|
|
52
|
+
module API
|
|
53
|
+
# Convenience constructor.
|
|
54
|
+
#
|
|
55
|
+
# client = Craigslist::API.new(email: ..., password: ..., account_id: ...)
|
|
56
|
+
#
|
|
57
|
+
# @see Client#initialize
|
|
58
|
+
# @return [Client]
|
|
59
|
+
def self.new(...)
|
|
60
|
+
Client.new(...)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: craigslist-api
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Nick Chewning
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: faraday
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '2.9'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '2.9'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: faraday-multipart
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '1.0'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '1.0'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: rexml
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '3.4'
|
|
47
|
+
type: :runtime
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '3.4'
|
|
54
|
+
description: |-
|
|
55
|
+
A single-client Ruby wrapper around both halves of Craigslist's bulk posting
|
|
56
|
+
platform: the RSS bulk interface used to create postings, and the JSON
|
|
57
|
+
Bulkpost API used to manage them afterwards. Handles OAuth2 token lifecycle,
|
|
58
|
+
XML serialization, and per-posting result reporting behind one object.
|
|
59
|
+
email:
|
|
60
|
+
- nchewning@gmail.com
|
|
61
|
+
executables: []
|
|
62
|
+
extensions: []
|
|
63
|
+
extra_rdoc_files: []
|
|
64
|
+
files:
|
|
65
|
+
- CHANGELOG.md
|
|
66
|
+
- LICENSE.txt
|
|
67
|
+
- README.md
|
|
68
|
+
- lib/craigslist/api.rb
|
|
69
|
+
- lib/craigslist/api/access_token.rb
|
|
70
|
+
- lib/craigslist/api/area.rb
|
|
71
|
+
- lib/craigslist/api/bulk_transport.rb
|
|
72
|
+
- lib/craigslist/api/category.rb
|
|
73
|
+
- lib/craigslist/api/client.rb
|
|
74
|
+
- lib/craigslist/api/configuration.rb
|
|
75
|
+
- lib/craigslist/api/connection.rb
|
|
76
|
+
- lib/craigslist/api/credit_summary.rb
|
|
77
|
+
- lib/craigslist/api/envelope.rb
|
|
78
|
+
- lib/craigslist/api/errors.rb
|
|
79
|
+
- lib/craigslist/api/image.rb
|
|
80
|
+
- lib/craigslist/api/image_info.rb
|
|
81
|
+
- lib/craigslist/api/json_transport.rb
|
|
82
|
+
- lib/craigslist/api/money.rb
|
|
83
|
+
- lib/craigslist/api/posting.rb
|
|
84
|
+
- lib/craigslist/api/posting_block.rb
|
|
85
|
+
- lib/craigslist/api/posting_handle.rb
|
|
86
|
+
- lib/craigslist/api/posting_stats.rb
|
|
87
|
+
- lib/craigslist/api/reference.rb
|
|
88
|
+
- lib/craigslist/api/resources/account.rb
|
|
89
|
+
- lib/craigslist/api/resources/base.rb
|
|
90
|
+
- lib/craigslist/api/resources/billing.rb
|
|
91
|
+
- lib/craigslist/api/resources/images.rb
|
|
92
|
+
- lib/craigslist/api/resources/postings.rb
|
|
93
|
+
- lib/craigslist/api/response_parser.rb
|
|
94
|
+
- lib/craigslist/api/result.rb
|
|
95
|
+
- lib/craigslist/api/result_set.rb
|
|
96
|
+
- lib/craigslist/api/serializer.rb
|
|
97
|
+
- lib/craigslist/api/token_provider.rb
|
|
98
|
+
- lib/craigslist/api/version.rb
|
|
99
|
+
- lib/craigslist/api/zip_location.rb
|
|
100
|
+
homepage: https://github.com/biggeektx/craigslist-api-gem
|
|
101
|
+
licenses:
|
|
102
|
+
- MIT
|
|
103
|
+
metadata:
|
|
104
|
+
homepage_uri: https://github.com/biggeektx/craigslist-api-gem
|
|
105
|
+
source_code_uri: https://github.com/biggeektx/craigslist-api-gem/tree/v0.1.0
|
|
106
|
+
changelog_uri: https://github.com/biggeektx/craigslist-api-gem/blob/main/CHANGELOG.md
|
|
107
|
+
bug_tracker_uri: https://github.com/biggeektx/craigslist-api-gem/issues
|
|
108
|
+
documentation_uri: https://rubydoc.info/gems/craigslist-api/0.1.0
|
|
109
|
+
rubygems_mfa_required: 'true'
|
|
110
|
+
rdoc_options: []
|
|
111
|
+
require_paths:
|
|
112
|
+
- lib
|
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - ">="
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '3.3'
|
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
|
+
requirements:
|
|
120
|
+
- - ">="
|
|
121
|
+
- !ruby/object:Gem::Version
|
|
122
|
+
version: '0'
|
|
123
|
+
requirements: []
|
|
124
|
+
rubygems_version: 3.6.9
|
|
125
|
+
specification_version: 4
|
|
126
|
+
summary: Ruby client for the Craigslist bulk posting APIs
|
|
127
|
+
test_files: []
|