datasift 3.1.5 → 3.2.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 +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
|