limeade 0.1.1 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c32583152633d904c31c68e00648525e8d9f85765f978d82a43fc0eeb2f24b8a
4
- data.tar.gz: 5d3dc02334d0bfa704f64597ccfa81b537b04c6926452593925987422cba1c84
3
+ metadata.gz: bb14f9082aa25256534bdfe452342afa8e85c91f6865af7018ba29ba1bec0da6
4
+ data.tar.gz: 1eb9ce140d18269679297942b43eebc05999262f04b1e8458fc434b48370fa1c
5
5
  SHA512:
6
- metadata.gz: dd211d93790439cfbdf9e8c609956769139a56cdcfc76f61fb9c55b0ccf6207cedd4e56a443d12bccfdc8fbfc391e15dae65028ddd7e662a42ebf96dd9d14d2c
7
- data.tar.gz: e4f9efeff8dced2acf1ad56e1d74376a6fb4249acb17aa3c088e9f20cd5847eee711e53711cf75e1fa8ac0007d674998628e1c45b68a1b7404c74cfec3921c3c
6
+ metadata.gz: '06690414adef52692099da672515d777a452f7e6cf2b1cd4e5bd6f81c4e92e09b9dc0725a5408c6474427be1c26c5726ccce931667ac0f8ccc81a24e111c6ff8'
7
+ data.tar.gz: e1e0b2bce2473578c58d1e72c0f461d2b044fbc673ac08c435c2a36b739784d9e098e27bc77e53f1007146494e3c2b9cab44372dce07880d3ad2600f204a4c9e
data/README.md CHANGED
@@ -42,7 +42,10 @@ require 'limeade'
42
42
  ```
43
43
 
44
44
  Instantiate a client and start invoking API methods on it. The API methods are documented
45
- [here](https://api.limesurvey.org/classes/remotecontrol_handle.html).
45
+ [here](https://api.limesurvey.org/classes/remotecontrol_handle.html). Do not specify the
46
+ `$sSessionKey`, as it is added as the first argument automatically. (Recall that the session is
47
+ managed for you transparently.)
48
+
46
49
 
47
50
  ```ruby
48
51
  client = Limeade::Client.new(api_uri, username, password)
@@ -1,10 +1,6 @@
1
- require 'limeade/methods'
2
-
3
1
  module Limeade
4
-
5
2
  # Client for accessing the LimeSurvey RemoteControl API from Ruby.
6
3
  class Client
7
-
8
4
  #
9
5
  # Instantiate a client and setup a connection to the LimeSurvey RemoteControl API.
10
6
  # Passes configuration for the Faraday::Request::Retry mechanism.
@@ -67,25 +63,73 @@ module Limeade
67
63
  end
68
64
  end
69
65
 
70
- # Handle LimeSurvey RemoteControl API calls invoked on the client by invoking them on the endpoint.
71
- # @param method [Symbol] the method invoked
72
- # @param arguments [Array] the arguments to the method
66
+ # Define a LimeSurvey RemoteControl API method call.
73
67
  #
74
- # @raise [ServerError] The API endpoint server is having issues. An error code and message are included.
75
- # @raise [InvalidResponseError] The API endpoint is returning malformed JSON RPC responses. A descriptive message
68
+ # @param ruby_method [Symbol] the name of the ruby method to define
69
+ # @param rpc_method [Symbol, String] the name of the JSON RPC method to call
70
+ # @!macro [attach] define_api_method
71
+ # @method $1
72
+ # Invoke the +${-1}+ JSON RPC method on the given endpoint.
76
73
  #
77
- # @return [Object] the result of invoking the method on the endpoint
78
- def method_missing(method, *arguments)
79
- if API_METHODS.include? method
80
- process_request(method, *arguments)
81
- else
82
- super
74
+ # @see https://api.limesurvey.org/classes/remotecontrol_handle.html#method_${-1}
75
+ # @param [variable] *arguments see LimeSurvey documentation
76
+ # @raise [ServerError] The API endpoint server is having issues. An error code and message are included.
77
+ # @raise [InvalidResponseError] The API endpoint is returning malformed JSON RPC responses. A descriptive message
78
+ # @return [Object] the result of invoking the method on the endpoint
79
+ def self.define_api_method(ruby_method, rpc_method = ruby_method)
80
+ define_method(ruby_method) do |*arguments|
81
+ process_request(rpc_method, *arguments)
83
82
  end
84
83
  end
85
84
 
86
- def respond_to_missing?(method_name, include_private = false)
87
- API_METHODS.include?(method_name) || super
88
- end
85
+ define_api_method :activate_survey
86
+ define_api_method :activate_tokens
87
+ define_api_method :add_group
88
+ define_api_method :add_language
89
+ define_api_method :add_participants
90
+ define_api_method :add_response
91
+ define_api_method :add_survey
92
+ define_api_method :copy_survey
93
+ define_api_method :cpd_importParticipants
94
+ define_api_method :delete_group
95
+ define_api_method :delete_language
96
+ define_api_method :delete_participants
97
+ define_api_method :delete_question
98
+ define_api_method :delete_survey
99
+ define_api_method :export_responses
100
+ define_api_method :export_responses_by_token
101
+ define_api_method :export_statistics
102
+ define_api_method :export_timeline
103
+ define_api_method :get_group_properties
104
+ define_api_method :get_language_properties
105
+ define_api_method :get_participant_properties
106
+ define_api_method :get_question_properties
107
+ define_api_method :get_response_ids
108
+ define_api_method :get_session_key
109
+ define_api_method :get_site_settings
110
+ define_api_method :get_summary
111
+ define_api_method :get_survey_properties
112
+ define_api_method :get_uploaded_files
113
+ define_api_method :import_group
114
+ define_api_method :import_question
115
+ define_api_method :import_survey
116
+ define_api_method :invite_participants
117
+ define_api_method :list_groups
118
+ define_api_method :list_participants
119
+ define_api_method :list_questions
120
+ define_api_method :list_surveys
121
+ define_api_method :list_users
122
+ define_api_method :mail_registered_participants
123
+ define_api_method :release_session_key
124
+ define_api_method :remind_participants
125
+ define_api_method :set_group_properties
126
+ define_api_method :set_language_properties
127
+ define_api_method :set_participant_properties
128
+ define_api_method :set_question_properties
129
+ define_api_method :set_quota_properties
130
+ define_api_method :set_survey_properties
131
+ define_api_method :update_response
132
+ define_api_method :upload_file
89
133
 
90
134
  private
91
135
 
@@ -100,7 +144,7 @@ module Limeade
100
144
  def process_request(method_name, *arguments)
101
145
  raise DisconnectedError unless connected?
102
146
  result = @json_rpc.invoke(method_name, @session_key, *arguments)
103
- if result.is_a? Hash and result['status']
147
+ if result.is_a?(Hash) && result['status']
104
148
  case result['status']
105
149
  when 'OK'
106
150
  true
@@ -108,6 +152,8 @@ module Limeade
108
152
  []
109
153
  when 'No Tokens found'
110
154
  []
155
+ when 'No survey participants table'
156
+ false
111
157
  when /(left to send)|(No candidate tokens)$/
112
158
  result
113
159
  when /Invalid surveyid$/i
@@ -153,5 +199,4 @@ module Limeade
153
199
 
154
200
  # Private exception raised only in the context of #process_request.
155
201
  class NoSessionError < Error; end
156
-
157
202
  end
@@ -1,5 +1,6 @@
1
- module Limeade
1
+ # frozen_string_literal: true
2
2
 
3
+ module Limeade
3
4
  class Error < StandardError; end
4
5
 
5
6
  class InvalidResponseError < Error; end
@@ -27,5 +28,4 @@ module Limeade
27
28
  super("LimeSurvey API '#{method}' returned a failure status: #{status}")
28
29
  end
29
30
  end
30
-
31
31
  end
@@ -1,14 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
  require 'multi_json'
3
5
 
4
6
  module Limeade
5
-
6
7
  # An implementation of JSON RPC version 1. This is inspired by jsonrpc-client, which implements
7
8
  # version 2 of the spec. This implementation adds retry capability via Faraday::Request::Retry.
8
9
 
9
10
  class JSON_RPC
10
-
11
- JSON_RPC_VERSION = '1.0'.freeze
11
+ JSON_RPC_VERSION = '1.0'
12
12
 
13
13
  #
14
14
  # Instantiate a client and setup a connection to the endpoint.
@@ -69,7 +69,7 @@ module Limeade
69
69
 
70
70
  private
71
71
 
72
- STANDARD_HEADERS = {content_type: 'application/json'}.freeze
72
+ STANDARD_HEADERS = { content_type: 'application/json' }.freeze
73
73
 
74
74
  def connection
75
75
  @connection ||= ::Faraday.new do |connection|
@@ -84,6 +84,7 @@ module Limeade
84
84
  payload = payload_from(response)
85
85
  verify_payload(payload, request_id)
86
86
  raise ServerError.new(payload['error']['code'], payload['error']['message']) if payload['error']
87
+
87
88
  payload['result']
88
89
  end
89
90
 
@@ -97,30 +98,29 @@ module Limeade
97
98
  def verify_payload(payload, request_id)
98
99
  Limeade.logger.debug "verify_payload: #{payload.inspect}"
99
100
  raise(InvalidResponseError, 'Response body is not a Hash') unless payload.is_a?(::Hash)
100
- raise(InvalidResponseError, 'Response body is missing the id') unless payload.has_key?('id')
101
- raise(InvalidResponseError, "Response id (#{payload['id']}) does not match request id (#{request_id})") unless (payload['id'] == request_id)
102
- raise(InvalidResponseError, 'Response body must have a result and an error') unless (payload.has_key?('error') && payload.has_key?('result'))
101
+ raise(InvalidResponseError, 'Response body is missing the id') unless payload.key?('id')
102
+ raise(InvalidResponseError, "Response id (#{payload['id']}) does not match request id (#{request_id})") unless payload['id'] == request_id
103
+ raise(InvalidResponseError, 'Response body must have a result and an error') unless payload.key?('error') && payload.key?('result')
103
104
 
104
105
  if payload['error']
105
106
  error = payload['error']
106
107
  raise(InvalidResponseError, 'Response error is not a Hash') unless error.is_a?(::Hash)
107
- raise(InvalidResponseError, 'Response error is missing the code') unless error.has_key?('code')
108
+ raise(InvalidResponseError, 'Response error is missing the code') unless error.key?('code')
108
109
  raise(InvalidResponseError, 'Response error code is not a number') unless error['code'].is_a?(::Integer)
109
- raise(InvalidResponseError, 'Response error is missing the message') unless error.has_key?('message')
110
+ raise(InvalidResponseError, 'Response error is missing the message') unless error.key?('message')
110
111
  raise(InvalidResponseError, 'Response error message is not a string') unless error['message'].is_a?(::String)
111
112
  end
112
113
  end
113
114
 
114
115
  def payload_from(response)
115
116
  ::MultiJson.decode(response.body)
116
- rescue => parsing_error
117
+ rescue StandardError => e
117
118
  Limeade.logger.info "Failed to parse JSON from:\n#{response.body}"
118
- raise InvalidResponseError, parsing_error.message
119
+ raise InvalidResponseError, e.message
119
120
  end
120
121
 
121
122
  def make_id
122
123
  rand(10**12)
123
124
  end
124
-
125
125
  end
126
126
  end
@@ -1,3 +1,3 @@
1
1
  module Limeade
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.3'
3
3
  end
data/limeade.gemspec CHANGED
@@ -36,7 +36,7 @@ Gem::Specification.new do |spec|
36
36
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
37
37
  spec.require_paths = ['lib']
38
38
 
39
- spec.add_runtime_dependency 'faraday', '>= 0.12.0'
39
+ spec.add_runtime_dependency 'faraday', '>= 0.12.0', '< 2.0'
40
40
  spec.add_runtime_dependency 'multi_json', '~> 1.13'
41
41
 
42
42
  spec.add_development_dependency 'bundler', '>= 1.17', '< 3.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: limeade
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Pellegrini
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-07 00:00:00.000000000 Z
11
+ date: 2023-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.12.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +27,9 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: 0.12.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: multi_json
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -110,7 +116,6 @@ files:
110
116
  - lib/limeade/client.rb
111
117
  - lib/limeade/errors.rb
112
118
  - lib/limeade/json_rpc.rb
113
- - lib/limeade/methods.rb
114
119
  - lib/limeade/version.rb
115
120
  - limeade.gemspec
116
121
  homepage: https://github.com/spokesoftware/limeade
@@ -119,11 +124,11 @@ licenses:
119
124
  metadata:
120
125
  allowed_push_host: https://rubygems.org
121
126
  homepage_uri: https://github.com/spokesoftware/limeade
122
- documentation_uri: https://www.rubydoc.info/gems/limeade/0.1.1
127
+ documentation_uri: https://www.rubydoc.info/gems/limeade/0.1.3
123
128
  bug_tracker_uri: https://github.com/spokesoftware/limeade/issues
124
129
  source_code_uri: https://github.com/spokesoftware/limeade
125
130
  changelog_uri: https://github.com/spokesoftware/limeade/releases
126
- post_install_message:
131
+ post_install_message:
127
132
  rdoc_options: []
128
133
  require_paths:
129
134
  - lib
@@ -138,8 +143,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
143
  - !ruby/object:Gem::Version
139
144
  version: '0'
140
145
  requirements: []
141
- rubygems_version: 3.0.3
142
- signing_key:
146
+ rubygems_version: 3.1.6
147
+ signing_key:
143
148
  specification_version: 4
144
149
  summary: A Ruby interface to the LimeSurvey API.
145
150
  test_files: []
@@ -1,53 +0,0 @@
1
- module Limeade
2
- API_METHODS = (<<_API_METHODS
3
- activate_survey
4
- activate_tokens
5
- add_group
6
- add_language
7
- add_participants
8
- add_response
9
- add_survey
10
- copy_survey
11
- cpd_importParticipants
12
- delete_group
13
- delete_language
14
- delete_participants
15
- delete_question
16
- delete_survey
17
- export_responses
18
- export_responses_by_token
19
- export_statistics
20
- export_timeline
21
- get_group_properties
22
- get_language_properties
23
- get_participant_properties
24
- get_question_properties
25
- get_response_ids
26
- get_session_key
27
- get_site_settings
28
- get_summary
29
- get_survey_properties
30
- get_uploaded_files
31
- import_group
32
- import_question
33
- import_survey
34
- invite_participants
35
- list_groups
36
- list_participants
37
- list_questions
38
- list_surveys
39
- list_users
40
- mail_registered_participants
41
- release_session_key
42
- remind_participants
43
- set_group_properties
44
- set_language_properties
45
- set_participant_properties
46
- set_question_properties
47
- set_quota_properties
48
- set_survey_properties
49
- update_response
50
- upload_file
51
- _API_METHODS
52
- ).split("\n").map(&:to_sym).freeze
53
- end