datasift 3.1.5 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -2
- data/.yardopts +4 -0
- data/CHANGELOG.md +23 -0
- data/Gemfile +13 -0
- data/README.md +17 -16
- data/VERSION +1 -1
- data/datasift.gemspec +8 -14
- data/examples/account_identity_eg.rb +48 -0
- data/examples/account_identity_limit_eg.rb +68 -0
- data/examples/account_identity_token_eg.rb +70 -0
- data/examples/auth.rb +4 -4
- data/examples/core_api_eg.rb +1 -2
- data/examples/historics_eg.rb +7 -1
- data/examples/pylon_eg.rb +116 -0
- data/lib/account.rb +6 -0
- data/lib/account_identity.rb +73 -0
- data/lib/account_identity_limit.rb +85 -0
- data/lib/account_identity_token.rb +86 -0
- data/lib/api/api_resource.rb +14 -5
- data/lib/cli.rb +306 -132
- data/lib/datasift.rb +82 -47
- data/lib/errors.rb +21 -5
- data/lib/historics.rb +71 -40
- data/lib/historics_preview.rb +25 -8
- data/lib/managed_source.rb +69 -25
- data/lib/managed_source_auth.rb +21 -6
- data/lib/managed_source_resource.rb +21 -6
- data/lib/push.rb +132 -65
- data/lib/pylon.rb +122 -0
- data/test/datasift/core_api_test.rb +116 -90
- data/test/datasift/historics_preview_api_test.rb +27 -58
- data/test/datasift/push_api_test.rb +156 -141
- data/test/fixtures/cassettes/core/after_historic_dpu.json +1 -0
- data/test/fixtures/cassettes/core/balance_get.json +1 -0
- data/test/fixtures/cassettes/core/before_dpu.json +1 -0
- data/test/fixtures/cassettes/core/before_historic_dpu.json +1 -0
- data/test/fixtures/cassettes/core/compile_success.json +1 -0
- data/test/fixtures/cassettes/core/dpu_get_cost.json +1 -0
- data/test/fixtures/cassettes/core/dpu_throw_badrequest.json +1 -0
- data/test/fixtures/cassettes/core/historic_dpu.json +1 -0
- data/test/fixtures/cassettes/core/usage_success.json +1 -0
- data/test/fixtures/cassettes/core/validate_invalid_hash.json +1 -0
- data/test/fixtures/cassettes/core/validate_success_bool.json +1 -0
- data/test/fixtures/cassettes/core/validate_success_hash.json +1 -0
- data/test/fixtures/cassettes/preview/before_preview_create.json +1 -0
- data/test/fixtures/cassettes/preview/before_preview_get.json +1 -0
- data/test/fixtures/cassettes/preview/preview_create_success.json +1 -0
- data/test/fixtures/cassettes/preview/preview_get_success.json +1 -0
- data/test/fixtures/cassettes/push/after_push_create.json +1 -0
- data/test/fixtures/cassettes/push/after_push_get.json +1 -0
- data/test/fixtures/cassettes/push/after_push_log.json +1 -0
- data/test/fixtures/cassettes/push/after_push_pause.json +1 -0
- data/test/fixtures/cassettes/push/after_push_resume.json +1 -0
- data/test/fixtures/cassettes/push/after_push_stop.json +1 -0
- data/test/fixtures/cassettes/push/after_push_update.json +1 -0
- data/test/fixtures/cassettes/push/before_push_create.json +1 -0
- data/test/fixtures/cassettes/push/before_push_delete.json +1 -0
- data/test/fixtures/cassettes/push/before_push_get.json +1 -0
- data/test/fixtures/cassettes/push/before_push_log.json +1 -0
- data/test/fixtures/cassettes/push/before_push_pause.json +1 -0
- data/test/fixtures/cassettes/push/before_push_resume.json +1 -0
- data/test/fixtures/cassettes/push/before_push_stop.json +1 -0
- data/test/fixtures/cassettes/push/before_push_update.json +1 -0
- data/test/fixtures/cassettes/push/push_create.json +1 -0
- data/test/fixtures/cassettes/push/push_delete.json +1 -0
- data/test/fixtures/cassettes/push/push_get_by_id.json +1 -0
- data/test/fixtures/cassettes/push/push_log_with_id.json +1 -0
- data/test/fixtures/cassettes/push/push_pause.json +1 -0
- data/test/fixtures/cassettes/push/push_resume.json +1 -0
- data/test/fixtures/cassettes/push/push_stop.json +1 -0
- data/test/fixtures/cassettes/push/push_update.json +1 -0
- data/test/fixtures/cassettes/push/push_validate.json +1 -0
- data/test/test_helper.rb +31 -1
- metadata +64 -104
- data/examples/dynamic_list_eg.rb +0 -74
- data/examples/dynamic_list_replace_eg.rb +0 -45
- data/lib/dynamic_list.rb +0 -66
- data/lib/dynamic_list_replace.rb +0 -45
- data/test/fixtures/balance.json +0 -1
- data/test/fixtures/compile_csdl_invalid.json +0 -1
- data/test/fixtures/compile_csdl_valid.json +0 -1
- data/test/fixtures/dpu_valid.json +0 -1
- data/test/fixtures/preview_create_valid.json +0 -1
- data/test/fixtures/preview_get_running.json +0 -1
- data/test/fixtures/preview_get_succeeded.json +0 -1
- data/test/fixtures/push_create_valid.json +0 -1
- data/test/fixtures/push_get_list_by_hash_valid.json +0 -1
- data/test/fixtures/push_get_list_by_historics_id_valid.json +0 -1
- data/test/fixtures/push_get_list_valid.json +0 -1
- data/test/fixtures/push_get_valid.json +0 -1
- data/test/fixtures/push_log_valid.json +0 -1
- data/test/fixtures/push_pause_valid.json +0 -1
- data/test/fixtures/push_stop_valid.json +0 -1
- data/test/fixtures/push_validate_valid.json +0 -1
- data/test/fixtures/usage_current.json +0 -1
- data/test/fixtures/validate_csdl_invalid.json +0 -1
- data/test/fixtures/validate_csdl_valid.json +0 -1
@@ -0,0 +1,116 @@
|
|
1
|
+
require './auth'
|
2
|
+
class AnalysisApi < DataSiftExample
|
3
|
+
def initialize
|
4
|
+
super
|
5
|
+
run_analysis
|
6
|
+
end
|
7
|
+
|
8
|
+
def run_analysis
|
9
|
+
begin
|
10
|
+
puts "Create a new identity to make PYLON API calls"
|
11
|
+
identity = @datasift.account_identity.create(
|
12
|
+
"JASON_#{Time.now.to_i}",
|
13
|
+
"active",
|
14
|
+
false
|
15
|
+
)
|
16
|
+
identity_id = identity[:data][:id]
|
17
|
+
puts identity[:data].to_json
|
18
|
+
|
19
|
+
puts "\nCreate a Token for our Identity"
|
20
|
+
token = @datasift.account_identity_token.create(
|
21
|
+
identity_id,
|
22
|
+
'facebook',
|
23
|
+
'YOUR_TOKEN'
|
24
|
+
)
|
25
|
+
puts token[:data].to_json
|
26
|
+
|
27
|
+
puts "\nNow make PYLON API calls using the Identity's API key"
|
28
|
+
@config.merge!(api_key: identity[:data][:api_key])
|
29
|
+
@datasift = DataSift::Client.new(@config)
|
30
|
+
|
31
|
+
csdl = 'return { fb.content contains "data" }'
|
32
|
+
|
33
|
+
puts "Check this CSDL is valid: #{csdl}"
|
34
|
+
puts "Valid? #{@datasift.pylon.valid?(csdl)}"
|
35
|
+
|
36
|
+
puts "\nCompile my CSDL"
|
37
|
+
compiled = @datasift.pylon.compile csdl
|
38
|
+
hash = compiled[:data][:hash]
|
39
|
+
puts "Hash: #{hash}"
|
40
|
+
|
41
|
+
puts "\nStart recording filter with hash #{hash}"
|
42
|
+
filter = @datasift.pylon.start(
|
43
|
+
hash,
|
44
|
+
'Facebook Pylon Test Filter'
|
45
|
+
)
|
46
|
+
puts filter[:data].to_json
|
47
|
+
|
48
|
+
puts "\nSleep for 10 seconds to record a little data"
|
49
|
+
sleep(10)
|
50
|
+
|
51
|
+
puts "\nGet details of our running recording"
|
52
|
+
puts @datasift.pylon.get(hash)[:data].to_json
|
53
|
+
|
54
|
+
puts "\nYou can also list running recordings"
|
55
|
+
puts @datasift.pylon.list[:data].to_json
|
56
|
+
|
57
|
+
puts "\nFrequency distribution analysis on fb.author.country"
|
58
|
+
params = {
|
59
|
+
analysis_type: 'freqDist',
|
60
|
+
parameters: {
|
61
|
+
threshold: 1,
|
62
|
+
target: 'fb.author.country'
|
63
|
+
}
|
64
|
+
}
|
65
|
+
puts @datasift.pylon.analyze(
|
66
|
+
hash,
|
67
|
+
params
|
68
|
+
)[:data].to_json
|
69
|
+
|
70
|
+
puts "\nFrequency distribution analysis on fb.author.age with filter"
|
71
|
+
params = {
|
72
|
+
analysis_type: 'freqDist',
|
73
|
+
parameters: {
|
74
|
+
threshold: 1,
|
75
|
+
target: 'fb.author.age'
|
76
|
+
}
|
77
|
+
}
|
78
|
+
filter = 'fb.content contains "starbucks"'
|
79
|
+
puts @datasift.pylon.analyze(
|
80
|
+
hash,
|
81
|
+
params,
|
82
|
+
filter
|
83
|
+
)[:data].to_json
|
84
|
+
|
85
|
+
puts "\nTime series analysis"
|
86
|
+
params = {
|
87
|
+
analysis_type: 'timeSeries',
|
88
|
+
parameters: {
|
89
|
+
interval: 'hour',
|
90
|
+
span: 12
|
91
|
+
}
|
92
|
+
}
|
93
|
+
filter = ''
|
94
|
+
start_time = Time.now.to_i - (60 * 60 * 12) # 7 days ago
|
95
|
+
end_time = Time.now.to_i
|
96
|
+
puts @datasift.pylon.analyze(
|
97
|
+
hash,
|
98
|
+
params,
|
99
|
+
filter,
|
100
|
+
start_time,
|
101
|
+
end_time
|
102
|
+
)[:data].to_json
|
103
|
+
|
104
|
+
puts "\nTags analysis"
|
105
|
+
puts @datasift.pylon.tags(hash)[:data].to_json
|
106
|
+
|
107
|
+
puts "\nStop recording filter with hash #{hash}"
|
108
|
+
puts @datasift.pylon.stop(hash)[:data].to_json
|
109
|
+
|
110
|
+
rescue DataSiftError => dse
|
111
|
+
puts dse.to_s
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
AnalysisApi.new
|
data/lib/account.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
module DataSift
|
2
|
+
#
|
3
|
+
# Class for accessing DataSift's Account API Identities
|
4
|
+
class AccountIdentity < DataSift::ApiResource
|
5
|
+
# Creates a new Identity
|
6
|
+
#
|
7
|
+
# @param label [String] A unique identifier for this Identity
|
8
|
+
# @param status [String] (Optional, Default: "active") What status this
|
9
|
+
# Identity currently has. Possible values are 'active' and 'disabled'
|
10
|
+
# @param master [Boolean] (Optional, Default: false) Whether this is the
|
11
|
+
# master Identity for your account
|
12
|
+
# @return [Object] API reponse object
|
13
|
+
def create(label = '', status = 'active', master = '')
|
14
|
+
fail ArgumentError, 'label is missing' if label.empty?
|
15
|
+
|
16
|
+
params = { label: label }
|
17
|
+
params.merge!(status: status) unless status.empty?
|
18
|
+
params.merge!(master: master) if [TrueClass, FalseClass].include?(master.class)
|
19
|
+
|
20
|
+
DataSift.request(:POST, 'account/identity', @config, params)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Gets a specific Identity by ID
|
24
|
+
#
|
25
|
+
# @param id [String] ID of the Identity you wish to return
|
26
|
+
# @return [Object] API reponse object
|
27
|
+
def get(id)
|
28
|
+
DataSift.request(:GET, "account/identity/#{id}", @config)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns a list of Identities
|
32
|
+
#
|
33
|
+
# @param label [String] (Optional) Search by a given Identity label
|
34
|
+
# @param per_page [Integer] (Optional) How many Identities should be
|
35
|
+
# returned per page of results
|
36
|
+
# @param page [Integer] (Optional) Which page of results to return
|
37
|
+
# @return [Object] API reponse object
|
38
|
+
def list(label = '', per_page = '', page = '')
|
39
|
+
params = {}
|
40
|
+
params.merge!(label: label) unless label.empty?
|
41
|
+
params.merge!(per_page: per_page) unless per_page.empty?
|
42
|
+
params.merge!(page: page) unless page.empty?
|
43
|
+
|
44
|
+
DataSift.request(:GET, 'account/identity', @config, params)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Updates a specific Identity by ID
|
48
|
+
#
|
49
|
+
# @param id [String] ID of the Identity you are updating
|
50
|
+
# @param label [String] (Optional) New label value
|
51
|
+
# @param status [String] (Optional) New status for this Identity
|
52
|
+
# @param master [Boolean] (Optional) Whether this Identity should be master
|
53
|
+
# @return [Object] API reponse object
|
54
|
+
def update(id = '', label = '', status = '', master = '')
|
55
|
+
fail ArgumentError, 'id is missing' if id.empty?
|
56
|
+
|
57
|
+
params = {}
|
58
|
+
params.merge!(label: label) unless label.empty?
|
59
|
+
params.merge!(status: status) unless status.empty?
|
60
|
+
params.merge!(master: master) if [TrueClass, FalseClass].include?(master.class)
|
61
|
+
|
62
|
+
DataSift.request(:PUT, "account/identity/#{id}", @config, params)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Deletes a specific Identity by ID
|
66
|
+
#
|
67
|
+
# @param id [String] ID of the Identity you wish to delete
|
68
|
+
# @return [Object] API response object
|
69
|
+
def delete(id)
|
70
|
+
DataSift.request(:DELETE, "account/identity/#{id}", @config)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module DataSift
|
2
|
+
#
|
3
|
+
# Class for accessing DataSift's Account API Identity Limits
|
4
|
+
class AccountIdentityLimit < DataSift::ApiResource
|
5
|
+
# Creates a Limit for an Identity
|
6
|
+
#
|
7
|
+
# @param identity_id [String] ID of the Identity for which you are creating
|
8
|
+
# a limit
|
9
|
+
# @param service [String] The service this limit will apply to. For example;
|
10
|
+
# 'facebook'
|
11
|
+
# @param total_allowance [Integer] The limit for this Identity
|
12
|
+
# @return [Object] API reponse object
|
13
|
+
def create(identity_id = '', service = '', total_allowance = nil)
|
14
|
+
fail BadParametersError, 'identity_id is required' if identity_id.empty?
|
15
|
+
fail BadParametersError, 'service is required' if service.empty?
|
16
|
+
fail BadParametersError, 'total_allowance can not be "nil"' if total_allowance.nil?
|
17
|
+
params = {
|
18
|
+
service: service,
|
19
|
+
total_allowance: total_allowance
|
20
|
+
}
|
21
|
+
|
22
|
+
DataSift.request(:POST, "account/identity/#{identity_id}/limit", @config, params)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Get the Limit for a given Identity and Service
|
26
|
+
#
|
27
|
+
# @param identity_id [String] ID of the Identity you wish to return limits
|
28
|
+
# for
|
29
|
+
# @param service [String] Name of the service you are retreiving limits for
|
30
|
+
# @return [Object] API reponse object
|
31
|
+
def get(identity_id = '', service = '')
|
32
|
+
fail BadParametersError, 'identity_id is required' if identity_id.empty?
|
33
|
+
fail BadParametersError, 'service is required' if service.empty?
|
34
|
+
|
35
|
+
DataSift.request(:GET, "account/identity/#{identity_id}/limit/#{service}", @config)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns a list Identities and their Limits for a given Service
|
39
|
+
#
|
40
|
+
# @param service [String] ID of the Identity we are fetching Limits for
|
41
|
+
# @param per_page [Integer] (Optional) How many Identities and Limits should
|
42
|
+
# be returned per page of results
|
43
|
+
# @param page [Integer] (Optional) Which page of results to return
|
44
|
+
# @return [Object] API reponse object
|
45
|
+
def list(service = '', per_page = '', page = '')
|
46
|
+
fail BadParametersError, 'service is required' if service.empty?
|
47
|
+
|
48
|
+
params = {}
|
49
|
+
params.merge!(per_page: per_page) unless per_page.empty?
|
50
|
+
params.merge!(page: page) unless page.empty?
|
51
|
+
|
52
|
+
DataSift.request(:GET, "account/identity/limit/#{service}", @config, params)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Updates a Limit for an Identity by Service
|
56
|
+
#
|
57
|
+
# @param identity_id [String] ID of the Identity for which you are updating
|
58
|
+
# a limit
|
59
|
+
# @param service [String] The service this limit will apply to. For example;
|
60
|
+
# 'facebook'
|
61
|
+
# @param total_allowance [Integer] The new limit for this Identity
|
62
|
+
# @return [Object] API reponse object
|
63
|
+
def update(identity_id = '', service = '', total_allowance = nil)
|
64
|
+
fail BadParametersError, 'identity_id is required' if identity_id.empty?
|
65
|
+
fail BadParametersError, 'service is required' if service.empty?
|
66
|
+
fail BadParametersError, 'total_allowance can not be "nil"' if total_allowance.nil?
|
67
|
+
params = { total_allowance: total_allowance }
|
68
|
+
|
69
|
+
DataSift.request(:PUT, "account/identity/#{identity_id}/limit/#{service}", @config, params)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Removes a Service Limit for an Identity
|
73
|
+
#
|
74
|
+
# @param identity_id [String] ID of the Identity for which you wish to
|
75
|
+
# remove the Limit
|
76
|
+
# @param service [String] Service from which you wish to remove the Limit
|
77
|
+
# @return [Object] API response object
|
78
|
+
def delete(identity_id = '', service = '')
|
79
|
+
fail BadParametersError, 'identity_id is required' if identity_id.empty?
|
80
|
+
fail BadParametersError, 'service is required' if service.empty?
|
81
|
+
|
82
|
+
DataSift.request(:DELETE, "account/identity/#{identity_id}/limit/#{service}", @config)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module DataSift
|
2
|
+
#
|
3
|
+
# Class for accessing DataSift's Account API Identity Tokens
|
4
|
+
class AccountIdentityToken < DataSift::ApiResource
|
5
|
+
# Creates a new Identity Token
|
6
|
+
#
|
7
|
+
# @param identity_id [String] ID of the Identity for which you are creating
|
8
|
+
# a token
|
9
|
+
# @param service [String] The service this token will be used to access. For
|
10
|
+
# example; 'facebook'
|
11
|
+
# @param token [String] The token provided by the PYLON data provider
|
12
|
+
# @return [Object] API reponse object
|
13
|
+
def create(identity_id = '', service = '', token = '')
|
14
|
+
fail BadParametersError, 'identity_id is required' if identity_id.empty?
|
15
|
+
fail BadParametersError, 'service is required' if service.empty?
|
16
|
+
fail BadParametersError, 'token is required' if token.empty?
|
17
|
+
params = {
|
18
|
+
service: service,
|
19
|
+
token: token
|
20
|
+
}
|
21
|
+
|
22
|
+
DataSift.request(:POST, "account/identity/#{identity_id}/token", @config, params)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Get a Token for a given Identity and Service
|
26
|
+
#
|
27
|
+
# @param identity_id [String] ID of the Identity you wish to return tokens
|
28
|
+
# for
|
29
|
+
# @param service [String] Name of the service you are retreiving tokens for
|
30
|
+
# @return [Object] API reponse object
|
31
|
+
def get(identity_id = '', service = '')
|
32
|
+
fail BadParametersError, 'identity_id is required' if identity_id.empty?
|
33
|
+
fail BadParametersError, 'service is required' if service.empty?
|
34
|
+
|
35
|
+
DataSift.request(:GET, "account/identity/#{identity_id}/token/#{service}", @config)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns a list of Tokens for a given Identity
|
39
|
+
#
|
40
|
+
# @param identity_id [String] ID of the Identity we are fetching Tokens for
|
41
|
+
# @param per_page [Integer] (Optional) How many Tokens should be returned
|
42
|
+
# per page of results
|
43
|
+
# @param page [Integer] (Optional) Which page of results to return
|
44
|
+
# @return [Object] API reponse object
|
45
|
+
def list(identity_id = '', per_page = '', page = '')
|
46
|
+
params = { identity_id: identity_id }
|
47
|
+
requires params
|
48
|
+
params.merge!(per_page: per_page) unless per_page.empty?
|
49
|
+
params.merge!(page: page) unless page.empty?
|
50
|
+
|
51
|
+
DataSift.request(:GET, "account/identity/#{identity_id}/token", @config, params)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Updates a specific Token by Identity ID and Service
|
55
|
+
#
|
56
|
+
# @param identity_id [String] ID of the Identity you are updating a token
|
57
|
+
# for
|
58
|
+
# @param service [String] The service this token will be used to access. For
|
59
|
+
# example; 'facebook'
|
60
|
+
# @param token [String] The token provided by the PYLON data provider
|
61
|
+
# @return [Object] API reponse object
|
62
|
+
def update(identity_id = '', service = '', token = '')
|
63
|
+
fail BadParametersError, 'identity_id is required' if identity_id.empty?
|
64
|
+
fail BadParametersError, 'service is required' if service.empty?
|
65
|
+
fail BadParametersError, 'token is required' if token.empty?
|
66
|
+
params = {
|
67
|
+
token: token
|
68
|
+
}
|
69
|
+
|
70
|
+
DataSift.request(:PUT, "account/identity/#{identity_id}/token/#{service}", @config, params)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Deletes a specific Token by Identity and Service
|
74
|
+
#
|
75
|
+
# @param identity_id [String] ID of the Identity for which you wish to
|
76
|
+
# delete a token
|
77
|
+
# @param service [String] Service from which you wish to delete a token
|
78
|
+
# @return [Object] API response object
|
79
|
+
def delete(identity_id = '', service = '')
|
80
|
+
fail BadParametersError, 'identity_id is required' if identity_id.empty?
|
81
|
+
fail BadParametersError, 'service is required' if service.empty?
|
82
|
+
|
83
|
+
DataSift.request(:DELETE, "account/identity/#{identity_id}/token/#{service}", @config)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/api/api_resource.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
module DataSift
|
2
|
+
# Base API class
|
2
3
|
class ApiResource
|
3
4
|
include DataSift
|
4
5
|
|
5
|
-
|
6
|
+
# Initializer to create global @config object
|
7
|
+
#
|
8
|
+
# @param config [Hash] Pass config object, including your DataSift username,
|
9
|
+
# API key and any other custom config parameters
|
10
|
+
def initialize(config)
|
6
11
|
@config = config
|
7
12
|
config[:api_host] = 'api.datasift.com' unless config.has_key?(:api_host)
|
8
13
|
config[:stream_host] = 'websocket.datasift.com' unless config.has_key?(:stream_host)
|
9
|
-
config[:api_version] = 'v1' unless config.has_key?(:api_version)
|
14
|
+
config[:api_version] = 'v1.1' unless config.has_key?(:api_version)
|
10
15
|
config[:enable_ssl] = true unless config.has_key?(:enable_ssl)
|
11
16
|
# Only SSLv3, TLSv1 and TLSv1.2 currently supported, TLSv1.2 preferred
|
12
17
|
# this is fixed in REST client and is scheduled for the 1.7.0 release
|
@@ -20,11 +25,15 @@ module DataSift
|
|
20
25
|
ssl_default
|
21
26
|
|
22
27
|
# max 320 seconds retry - http://dev.datasift.com/docs/streaming-api/reconnecting
|
23
|
-
config[:max_retry_time] = 320 unless config.
|
24
|
-
config[:retry_timeout] = 0 unless config.
|
28
|
+
config[:max_retry_time] = 320 unless config.key?(:max_retry_time)
|
29
|
+
config[:retry_timeout] = 0 unless config.key?(:retry_timeout)
|
25
30
|
end
|
26
31
|
|
27
|
-
|
32
|
+
# Ensure parameters have been set
|
33
|
+
#
|
34
|
+
# @param params [Hash] Hash of parameters you need to check exist and are
|
35
|
+
# non-null values
|
36
|
+
def requires(params)
|
28
37
|
params.each { |k, v|
|
29
38
|
if v == nil || v.to_s.length == 0
|
30
39
|
raise InvalidParamError.new "#{k} is a required parameter, it cannot be nil or empty"
|
data/lib/cli.rb
CHANGED
@@ -6,12 +6,14 @@ require 'multi_json'
|
|
6
6
|
require_relative '../lib/datasift'
|
7
7
|
|
8
8
|
def to_output(r)
|
9
|
-
MultiJson.dump(
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
MultiJson.dump(
|
10
|
+
{
|
11
|
+
:status => r[:http][:status],
|
12
|
+
:headers => r[:http][:headers],
|
13
|
+
:body => r[:data]
|
14
|
+
},
|
15
|
+
:pretty => true
|
16
|
+
)
|
15
17
|
end
|
16
18
|
|
17
19
|
def opt(val, default)
|
@@ -19,7 +21,7 @@ def opt(val, default)
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def err(m)
|
22
|
-
puts MultiJson.dump(
|
24
|
+
puts MultiJson.dump(:error => m)
|
23
25
|
end
|
24
26
|
|
25
27
|
def parse(args)
|
@@ -34,160 +36,322 @@ def parse(args)
|
|
34
36
|
opts.banner = 'Usage: cli.rb [-c] [--api] -a -e [-p*]'
|
35
37
|
opts.separator 'Specific options:'
|
36
38
|
|
37
|
-
opts.on('-a', '--auth AUTH', 'DataSift username
|
38
|
-
api_key = ARGV.length>0 && ARGV[0].index('-') == 0 ? '' : ARGV[0]
|
39
|
-
if username
|
39
|
+
opts.on('-a', '--auth AUTH', 'DataSift username and API key (formatted as "username api_key")') do |username|
|
40
|
+
api_key = ARGV.length > 0 && ARGV[0].index('-') == 0 ? '' : ARGV[0]
|
41
|
+
if username.nil? || api_key.nil? || username.empty? || api_key.empty?
|
40
42
|
err 'Unable to parse username and API key, they must be in the format username api_key'
|
41
43
|
err parse(%w(-h))
|
42
44
|
exit
|
43
45
|
end
|
44
|
-
options.auth = {:username => username, :api_key => api_key}
|
46
|
+
options.auth = { :username => username, :api_key => api_key }
|
45
47
|
end
|
46
48
|
|
47
|
-
opts.on('-e', '--endpoint ENDPOINT', 'Defaults to core, must be one of core,push,historics,preview,sources') do |e|
|
49
|
+
opts.on('-e', '--endpoint ENDPOINT', 'Defaults to core, must be one of core, push, historics, preview, sources, pylon') do |e|
|
48
50
|
options.endpoint = e
|
49
51
|
end
|
50
52
|
|
51
53
|
opts.on('-c', '--command COMMAND', 'DataSift endpoint, depends on the endpoint') do |e|
|
52
|
-
options.command = e|| 'core'
|
54
|
+
options.command = e || 'core'
|
53
55
|
end
|
54
56
|
|
55
57
|
opts.on('-p', '--param PARAM', 'Command specific parameters e.g. -p name value') do |k|
|
56
58
|
# value is ARGV[0] unless ARGV[0] starts with a hyphen
|
57
|
-
options.params[k] = ARGV.length>0 && ARGV[0].index('-') == 0 ? '' :
|
59
|
+
options.params[k] = ARGV.length > 0 && ARGV[0].index('-') == 0 ? '' :
|
60
|
+
ARGV[0]
|
58
61
|
end
|
59
62
|
|
60
63
|
opts.on('-u', '--url API_HOSTNAME', 'Override the API URL') do |e|
|
61
64
|
options.api = e
|
62
65
|
end
|
63
66
|
|
67
|
+
opts.on('--no-ssl', 'Do not use SSL for API requests') do
|
68
|
+
options.enable_ssl = false
|
69
|
+
end
|
70
|
+
|
64
71
|
opts.on_tail('-h', '--help', 'Show this message') do
|
65
|
-
|
72
|
+
puts opts
|
66
73
|
exit
|
67
74
|
end
|
68
75
|
|
69
|
-
opts.on_tail('--version', '
|
70
|
-
|
76
|
+
opts.on_tail('-v', '--version', 'DataSift client library version') do
|
77
|
+
puts DataSift::VERSION
|
71
78
|
exit
|
72
79
|
end
|
73
80
|
end
|
74
81
|
|
75
82
|
opt_parser.parse!(args)
|
76
|
-
options
|
83
|
+
options
|
77
84
|
end
|
78
85
|
|
79
|
-
def run_core_command
|
86
|
+
def run_core_command(c, command, p)
|
80
87
|
case command
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
88
|
+
when 'validate'
|
89
|
+
c.valid?(p['csdl'], false)
|
90
|
+
when 'compile'
|
91
|
+
c.compile(p['csdl'])
|
92
|
+
when 'usage'
|
93
|
+
c.usage(p['period'] ? p['period'].to_sym : :hour)
|
94
|
+
when 'balance'
|
95
|
+
c.balance
|
96
|
+
when 'dpu'
|
97
|
+
c.dpu(opt(p['hash'], ''), opt(p['historics_id'], ''))
|
98
|
+
else
|
99
|
+
err 'Unknown command for the core endpoint'
|
100
|
+
exit
|
94
101
|
end
|
95
102
|
end
|
96
103
|
|
97
|
-
def run_historics_command
|
104
|
+
def run_historics_command(c, command, p)
|
98
105
|
case command
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
106
|
+
when 'prepare'
|
107
|
+
c.historics.prepare(p['hash'], p['start'], p['end'], p['name'], opt(p['sources'], 'twitter'), opt(p['sample'], 10))
|
108
|
+
when 'start'
|
109
|
+
c.historics.start(p['id'])
|
110
|
+
when 'stop'
|
111
|
+
c.historics.stop(p['id'], opt(p['reason'], ''))
|
112
|
+
when 'status'
|
113
|
+
c.historics.status(p['start'], p['end'], opt(p['sources'], 'twitter'))
|
114
|
+
when 'update'
|
115
|
+
c.historics.update(p['id'], p['name'])
|
116
|
+
when 'delete'
|
117
|
+
c.historics.delete(p['id'])
|
118
|
+
when 'get'
|
119
|
+
c.historics.get(opt(p['max'], 20), opt(p['page'], 1), opt(p['with_estimate'], 1))
|
120
|
+
else
|
121
|
+
err 'Unknown command for the historics endpoint'
|
122
|
+
exit
|
116
123
|
end
|
117
124
|
end
|
118
125
|
|
119
|
-
def run_preview_command
|
126
|
+
def run_preview_command(c, command, p)
|
120
127
|
case command
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
+
when 'create'
|
129
|
+
c.historics_preview.create(p['hash'], p['parameters'], p['start'], opt(p['end'], nil))
|
130
|
+
when 'get'
|
131
|
+
c.historics_preview.get(p['id'])
|
132
|
+
else
|
133
|
+
err 'Unknown command for the historics preview endpoint'
|
134
|
+
exit
|
128
135
|
end
|
129
136
|
end
|
130
137
|
|
131
|
-
def run_sources_command
|
138
|
+
def run_sources_command(c, command, p)
|
132
139
|
case command
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
140
|
+
when 'create'
|
141
|
+
c.managed_source.create(p['source_type'],p['name'], opt(p['parameters'], {}),
|
142
|
+
opt(p['resources'], []), opt(p['auth'], []))
|
143
|
+
when 'update'
|
144
|
+
c.managed_source.update(p['id'], p['source_type'], p['name'], opt(p['parameters'], {}),
|
145
|
+
opt(p['resources'], []),
|
146
|
+
opt(p['auth'], []))
|
147
|
+
when 'delete'
|
148
|
+
c.managed_source.delete(p['id'])
|
149
|
+
when 'stop'
|
150
|
+
c.managed_source.stop(p['id'])
|
151
|
+
when 'start'
|
152
|
+
c.managed_source.start(p['id'])
|
153
|
+
when 'log'
|
154
|
+
c.managed_source.log(p['id'], opt(p['page'], 1), opt(p['per_page'], 20))
|
155
|
+
when 'get'
|
156
|
+
c.managed_source.get(opt(p['id'], nil), opt(p['source_type'], nil), opt(p['page'], 1), opt(p['per_page'], 20))
|
157
|
+
else
|
158
|
+
err 'Unknown command for the historics preview endpoint'
|
159
|
+
exit
|
153
160
|
end
|
154
161
|
end
|
155
162
|
|
156
|
-
def run_push_command
|
163
|
+
def run_push_command(c, command, p)
|
157
164
|
case command
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
else
|
184
|
-
c.push.get(opt(p['page'], 0), opt(p['per_page'], 20), opt(p['order_by'], :request_time), opt(p['order_dir'], :desc))
|
185
|
-
end
|
186
|
-
when 'pull'
|
187
|
-
c.push.pull(p['id'], opt(p['size'], 20971520), opt(p['cursor'], ''))
|
165
|
+
when 'validate'
|
166
|
+
c.push.valid? p, false
|
167
|
+
when 'create'
|
168
|
+
c.push.create p
|
169
|
+
when 'pause'
|
170
|
+
c.push.pause p['id']
|
171
|
+
when 'resume'
|
172
|
+
c.push.resume p['id']
|
173
|
+
when 'update'
|
174
|
+
c.push.update p
|
175
|
+
when 'stop'
|
176
|
+
c.push.stop p['id']
|
177
|
+
when 'delete'
|
178
|
+
c.push.delete p['id']
|
179
|
+
when 'log'
|
180
|
+
p['id'] ?
|
181
|
+
c.push.logs_for(p['id'], opt(p['page'], 0), opt(p['per_page'], 20), opt(p['order_by'], :request_time), opt(p['order_dir'], :desc)) :
|
182
|
+
c.push.logs(opt(p['page'], 0), opt(p['per_page'], 20), opt(p['order_by'], :request_time), opt(p['order_dir'], :desc))
|
183
|
+
when 'get'
|
184
|
+
if p['id']
|
185
|
+
c.push.get_by_subscription(p['id'], opt(p['page'], 0), opt(p['per_page'], 20), opt(p['order_by'], :request_time))
|
186
|
+
elsif p['hash']
|
187
|
+
c.push.get_by_hash(p['hash'], opt(p['page'], 0), opt(p['per_page'], 20), opt(p['order_by'], :request_time), opt(p['order_dir'], :desc), opt(p['include_finished'], 0), opt(p['all'], false))
|
188
|
+
elsif p['historics_id']
|
189
|
+
c.push.get_by_historics_id(p['historics_id'], opt(p['page'], 0), opt(p['per_page'], 20), opt(p['order_by'], :request_time), opt(p['order_dir'], :desc), opt(p['include_finished'], 0), opt(p['all'], false))
|
188
190
|
else
|
189
|
-
|
190
|
-
|
191
|
+
c.push.get(opt(p['page'], 0), opt(p['per_page'], 20), opt(p['order_by'], :request_time), opt(p['order_dir'], :desc), opt(p['include_finished'], 0), opt(p['all'], false))
|
192
|
+
end
|
193
|
+
when 'pull'
|
194
|
+
c.push.pull(p['id'], opt(p['size'], 20_971_520), opt(p['cursor'], ''))
|
195
|
+
else
|
196
|
+
err 'Unknown command for the core endpoint'
|
197
|
+
exit
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def run_pylon_command(c, command, p)
|
202
|
+
case command
|
203
|
+
when 'validate'
|
204
|
+
c.pylon.valid?(
|
205
|
+
opt(p['csdl'], ''),
|
206
|
+
opt(p['boolResponse'], true)
|
207
|
+
)
|
208
|
+
when 'compile'
|
209
|
+
c.pylon.compile(opt(p['csdl'], ''))
|
210
|
+
when 'start'
|
211
|
+
c.pylon.start(
|
212
|
+
opt(p['hash'], ''),
|
213
|
+
opt(p['name'], '')
|
214
|
+
)
|
215
|
+
when 'stop'
|
216
|
+
c.pylon.stop(opt(p['hash'], ''))
|
217
|
+
when 'get'
|
218
|
+
c.pylon.get(opt(p['id'], ''))
|
219
|
+
when 'list'
|
220
|
+
c.pylon.list(
|
221
|
+
opt(p['page'], 0),
|
222
|
+
opt(p['per_page'], 20),
|
223
|
+
opt(p['order_by'], :created_at),
|
224
|
+
opt(p['order_dir'], :desc)
|
225
|
+
)
|
226
|
+
when 'analyze'
|
227
|
+
params = nil
|
228
|
+
if p['parameters']
|
229
|
+
params = MultiJson.load(p['parameters'])
|
230
|
+
end
|
231
|
+
c.pylon.analyze(
|
232
|
+
opt(p['hash'], ''),
|
233
|
+
params,
|
234
|
+
opt(p['filter'], ''),
|
235
|
+
opt(p['start'], ''),
|
236
|
+
opt(p['end'], '')
|
237
|
+
)
|
238
|
+
when 'tags'
|
239
|
+
c.pylon.tags(p['hash'])
|
240
|
+
else
|
241
|
+
err 'Unknown command for the pylon endpoint'
|
242
|
+
exit
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
def run_account_identity_command(c, command, p)
|
247
|
+
case command
|
248
|
+
when 'create'
|
249
|
+
c.account_identity.create(
|
250
|
+
opt(p['label'], ''),
|
251
|
+
opt(p['status'], ''),
|
252
|
+
to_bool(opt(p['master'], ''))
|
253
|
+
)
|
254
|
+
when 'get'
|
255
|
+
c.account_identity.get(opt(p['id'], ''))
|
256
|
+
when 'list'
|
257
|
+
c.account_identity.list(
|
258
|
+
opt(p['label'], ''),
|
259
|
+
opt(p['per_page'], ''),
|
260
|
+
opt(p['page'], '')
|
261
|
+
)
|
262
|
+
when 'update'
|
263
|
+
c.account_identity.update(
|
264
|
+
opt(p['id'], ''),
|
265
|
+
opt(p['label'], ''),
|
266
|
+
opt(p['status'], ''),
|
267
|
+
to_bool(opt(p['master'], ''))
|
268
|
+
)
|
269
|
+
when 'delete'
|
270
|
+
c.account_identity.delete(opt(p['id'], ''))
|
271
|
+
else
|
272
|
+
err 'Unknown command for the account/identity endpoint'
|
273
|
+
exit
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def run_account_token_command(c, command, p)
|
278
|
+
case command
|
279
|
+
when 'create'
|
280
|
+
c.account_identity_token.create(
|
281
|
+
opt(p['identity_id'], ''),
|
282
|
+
opt(p['service'], ''),
|
283
|
+
opt(p['token'], '')
|
284
|
+
)
|
285
|
+
when 'get'
|
286
|
+
c.account_identity_token.get(
|
287
|
+
opt(p['identity_id'], ''),
|
288
|
+
opt(p['service'], '')
|
289
|
+
)
|
290
|
+
when 'list'
|
291
|
+
c.account_identity_token.list(
|
292
|
+
opt(p['identity_id'], ''),
|
293
|
+
opt(p['per_page'], ''),
|
294
|
+
opt(p['page'], '')
|
295
|
+
)
|
296
|
+
when 'update'
|
297
|
+
c.account_identity_token.update(
|
298
|
+
opt(p['identity_id'], ''),
|
299
|
+
opt(p['service'], ''),
|
300
|
+
opt(p['token'], '')
|
301
|
+
)
|
302
|
+
when 'delete'
|
303
|
+
c.account_identity_token.delete(
|
304
|
+
opt(p['identity_id'], ''),
|
305
|
+
opt(p['service'], '')
|
306
|
+
)
|
307
|
+
else
|
308
|
+
err 'Unknown command for the account/identity/token endpoint'
|
309
|
+
exit
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
def run_account_limit_command(c, command, p)
|
314
|
+
case command
|
315
|
+
when 'create'
|
316
|
+
c.account_identity_limit.create(
|
317
|
+
opt(p['identity_id'], ''),
|
318
|
+
opt(p['service'], ''),
|
319
|
+
opt(p['total_allowance'], nil)
|
320
|
+
)
|
321
|
+
when 'get'
|
322
|
+
c.account_identity_limit.get(
|
323
|
+
opt(p['identity_id'], ''),
|
324
|
+
opt(p['service'], '')
|
325
|
+
)
|
326
|
+
when 'list'
|
327
|
+
c.account_identity_limit.list(
|
328
|
+
opt(p['service'], ''),
|
329
|
+
opt(p['per_page'], ''),
|
330
|
+
opt(p['page'], '')
|
331
|
+
)
|
332
|
+
when 'update'
|
333
|
+
c.account_identity_limit.update(
|
334
|
+
opt(p['identity_id'], ''),
|
335
|
+
opt(p['service'], ''),
|
336
|
+
opt(p['total_allowance'], nil)
|
337
|
+
)
|
338
|
+
when 'delete'
|
339
|
+
c.account_identity_limit.delete(
|
340
|
+
opt(p['identity_id'], ''),
|
341
|
+
opt(p['service'], '')
|
342
|
+
)
|
343
|
+
else
|
344
|
+
err 'Unknown command for the account/identity/limit endpoint'
|
345
|
+
exit
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
def to_bool(str)
|
350
|
+
if ['true', 'false', '1', '0'].include?(str.to_s.downcase)
|
351
|
+
bool = true if ['true', '1'].include?str.to_s.downcase
|
352
|
+
bool = false if ['false', '0'].include?str.to_s.downcase
|
353
|
+
|
354
|
+
return bool
|
191
355
|
end
|
192
356
|
end
|
193
357
|
|
@@ -200,34 +364,44 @@ begin
|
|
200
364
|
err parse(%w(-h))
|
201
365
|
exit
|
202
366
|
end
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
367
|
+
|
368
|
+
config = {
|
369
|
+
username: options.auth[:username],
|
370
|
+
api_key: options.auth[:api_key],
|
371
|
+
api_host: options.api
|
372
|
+
}
|
373
|
+
config.merge!(enable_ssl: options.enable_ssl) unless options.enable_ssl.nil?
|
209
374
|
datasift = DataSift::Client.new(config)
|
210
375
|
|
211
376
|
res = case options.endpoint
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
377
|
+
when 'core'
|
378
|
+
run_core_command(datasift, options.command, options.params)
|
379
|
+
when 'historics'
|
380
|
+
run_historics_command(datasift, options.command, options.params)
|
381
|
+
when 'push'
|
382
|
+
run_push_command(datasift, options.command, options.params)
|
383
|
+
when 'preview'
|
384
|
+
run_preview_command(datasift, options.command, options.params)
|
385
|
+
when 'managed_sources'
|
386
|
+
run_sources_command(datasift, options.command, options.params)
|
387
|
+
when 'pylon'
|
388
|
+
run_pylon_command(datasift, options.command, options.params)
|
389
|
+
when 'identity'
|
390
|
+
run_account_identity_command(datasift, options.command, options.params)
|
391
|
+
when 'token'
|
392
|
+
run_account_token_command(datasift, options.command, options.params)
|
393
|
+
when 'limit'
|
394
|
+
run_account_limit_command(datasift, options.command, options.params)
|
395
|
+
else
|
396
|
+
err 'Unsupported/Unknown endpoint'
|
397
|
+
exit
|
225
398
|
end
|
226
399
|
puts to_output(res)
|
400
|
+
|
227
401
|
rescue DataSiftError => e
|
228
402
|
err e.message
|
229
403
|
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
|
230
|
-
err
|
404
|
+
err $ERROR_INFO.to_s
|
231
405
|
err parse(%w(-h))
|
232
406
|
exit
|
233
407
|
end
|