survey-gizmo-ruby 0.9.6 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ test.rb
19
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile CHANGED
@@ -1,22 +1,3 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
- gem "activesupport", '~> 3.0'
4
- gem 'i18n'
5
- gem 'virtus'
6
- gem 'httparty'
7
- gem 'addressable', :require => "addressable/uri"
8
-
9
- group :development do
10
- gem 'bluecloth', :require => nil
11
- gem "yard", "~> 0.7.0"
12
- gem "bundler", "~> 1.0"
13
- gem "jeweler", "~> 1.6.4"
14
- gem 'awesome_print', :require => 'ap'
15
- end
16
-
17
- group :test do
18
- gem "webmock", :require => 'webmock/rspec'
19
- gem "rspec", "~> 2.11.0"
20
- gem 'net-http-spy', :require => nil
21
- gem 'awesome_print', :require => nil
22
- end
3
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,28 +1,46 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ survey-gizmo-ruby (1.0.0)
5
+ activesupport (>= 3.0)
6
+ addressable
7
+ httparty
8
+ i18n
9
+ virtus (>= 1.0.0)
10
+
1
11
  GEM
2
- remote: http://rubygems.org/
12
+ remote: https://rubygems.org/
3
13
  specs:
4
- activesupport (3.2.8)
5
- i18n (~> 0.6)
6
- multi_json (~> 1.0)
7
- addressable (2.3.2)
8
- awesome_print (1.1.0)
9
- backports (2.6.4)
10
- bluecloth (2.2.0)
11
- crack (0.3.1)
14
+ activesupport (4.0.1)
15
+ i18n (~> 0.6, >= 0.6.4)
16
+ minitest (~> 4.2)
17
+ multi_json (~> 1.3)
18
+ thread_safe (~> 0.1)
19
+ tzinfo (~> 0.3.37)
20
+ addressable (2.3.5)
21
+ atomic (1.1.14)
22
+ axiom-types (0.0.5)
23
+ descendants_tracker (~> 0.0.1)
24
+ ice_nine (~> 0.9)
25
+ backports (3.3.5)
26
+ coercible (0.2.0)
27
+ backports (~> 3.0, >= 3.1.0)
28
+ descendants_tracker (~> 0.0.1)
29
+ crack (0.4.1)
30
+ safe_yaml (~> 0.9.0)
31
+ descendants_tracker (0.0.3)
12
32
  diff-lcs (1.1.3)
13
- git (1.2.5)
14
- httparty (0.9.0)
15
- multi_json (~> 1.0)
16
- multi_xml
17
- i18n (0.6.1)
18
- jeweler (1.6.4)
19
- bundler (~> 1.0)
20
- git (>= 1.2.5)
21
- rake
22
- multi_json (1.3.6)
23
- multi_xml (0.5.1)
24
- net-http-spy (0.2.1)
25
- rake (0.9.2.2)
33
+ equalizer (0.0.7)
34
+ httparty (0.12.0)
35
+ json (~> 1.8)
36
+ multi_xml (>= 0.5.2)
37
+ i18n (0.6.5)
38
+ ice_nine (0.10.0)
39
+ json (1.8.1)
40
+ minitest (4.7.5)
41
+ multi_json (1.8.2)
42
+ multi_xml (0.5.5)
43
+ rake (10.1.0)
26
44
  rspec (2.11.0)
27
45
  rspec-core (~> 2.11.0)
28
46
  rspec-expectations (~> 2.11.0)
@@ -31,27 +49,24 @@ GEM
31
49
  rspec-expectations (2.11.3)
32
50
  diff-lcs (~> 1.1.3)
33
51
  rspec-mocks (2.11.3)
34
- virtus (0.5.2)
35
- backports (~> 2.6.1)
36
- webmock (1.8.11)
52
+ safe_yaml (0.9.7)
53
+ thread_safe (0.1.3)
54
+ atomic
55
+ tzinfo (0.3.38)
56
+ virtus (1.0.0)
57
+ axiom-types (~> 0.0.5)
58
+ coercible (~> 0.2)
59
+ descendants_tracker (~> 0.0.1)
60
+ equalizer (~> 0.0.7)
61
+ webmock (1.15.2)
37
62
  addressable (>= 2.2.7)
38
- crack (>= 0.1.7)
39
- yard (0.7.5)
63
+ crack (>= 0.3.2)
40
64
 
41
65
  PLATFORMS
42
66
  ruby
43
67
 
44
68
  DEPENDENCIES
45
- activesupport (~> 3.0)
46
- addressable
47
- awesome_print
48
- bluecloth
49
- bundler (~> 1.0)
50
- httparty
51
- i18n
52
- jeweler (~> 1.6.4)
53
- net-http-spy
69
+ rake
54
70
  rspec (~> 2.11.0)
55
- virtus
71
+ survey-gizmo-ruby!
56
72
  webmock
57
- yard (~> 0.7.0)
data/README.md CHANGED
@@ -1,3 +1,18 @@
1
+ # WARNING:
2
+
3
+ SurveyGizmo doesn't test their REST API when they roll out changes. They don't publish a list of active defects, and when you call/email for support it is unlikely you will geto a person that knows anything about programming or the REST API. You can't talk to level 2 support, although they might offer you a discount on their paid consulting rates if the problem persists for more than a few weeks.
4
+
5
+ You might be able to work around an active SurveyGizmo debacle by change which API version you use one of::
6
+
7
+ export GIZMO_URI="https://restapi.surveygizmo.com/v2"
8
+
9
+ export GIZMO_URI="https://restapi.surveygizmo.com/head"
10
+
11
+ ...and then your application might work again.
12
+
13
+ -chorn@chorn.com 2013-03-15
14
+
15
+
1
16
  # Survey Gizmo (ruby)
2
17
 
3
18
  Integrate with the [Survey Gizmo API](http://developer.surveygizmo.com/resources/rest-api-documentation-version-1-01/) using an ActiveModel style interface. We currently support rest API **v3**. If you want to use version 1 of the API, please use gem version ~0.7.0
data/Rakefile CHANGED
@@ -1,43 +1,7 @@
1
- # encoding: utf-8
2
-
3
- require 'rubygems'
4
- require 'bundler'
5
- begin
6
- Bundler.setup(:default, :development)
7
- rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
10
- exit e.status_code
11
- end
12
- require 'rake'
13
-
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "survey-gizmo-ruby"
18
- gem.homepage = "http://github.com/RipTheJacker/survey-gizmo-ruby"
19
- gem.license = "MIT"
20
- gem.summary = %Q{gem to use the Survey Gizmo REST API}
21
- gem.description = %Q{gem to use the SurveyGizmo.com REST API, v3+}
22
- gem.email = "self@ripthejacker.com"
23
- gem.authors = ["Kabari Hendrick", "Chris Horn"]
24
- gem.files = FileList['lib/**/*.rb', 'Gemfile*', '[A-Z]*', 'Rakefile', 'spec/**/*'].to_a
25
- # dependencies defined in Gemfile
26
- end
27
- Jeweler::RubygemsDotOrgTasks.new
28
-
29
- require 'rspec/core'
30
- require 'rspec/core/rake_task'
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
31
3
  RSpec::Core::RakeTask.new(:spec) do |spec|
32
4
  spec.pattern = FileList['spec/**/*_spec.rb']
33
5
  end
34
6
 
35
- RSpec::Core::RakeTask.new(:rcov) do |spec|
36
- spec.pattern = 'spec/**/*_spec.rb'
37
- spec.rcov = true
38
- end
39
-
40
- task :default => :spec
41
-
42
- require 'yard'
43
- YARD::Rake::YardocTask.new
7
+ task :default => :spec
@@ -6,7 +6,7 @@ module SurveyGizmo; module API
6
6
  # @macro [attach] virtus_attribute
7
7
  # @return [$2]
8
8
  attribute :id, Integer
9
- attribute :title, String
9
+ attribute :title, Hash
10
10
  attribute :description, String
11
11
  attribute :properties, Hash
12
12
  attribute :after, Integer
@@ -23,7 +23,7 @@ module SurveyGizmo; module API
23
23
  # survey gizmo sends a hash back for :title
24
24
  # @private
25
25
  def title_with_multilingual=(val)
26
- self.title_without_multilingual = val.is_a?(Hash) ? val['English'] : val
26
+ self.title_without_multilingual = val.is_a?(Hash) ? val : { "English" => val }
27
27
  end
28
28
 
29
29
  alias_method_chain :title=, :multilingual
@@ -33,4 +33,4 @@ module SurveyGizmo; module API
33
33
  {:id => self.id, :survey_id => self.survey_id}
34
34
  end
35
35
  end
36
- end; end
36
+ end; end
@@ -23,6 +23,7 @@ module SurveyGizmo; module API
23
23
 
24
24
  # @macro collection
25
25
  collection :options
26
+ collection :sub_question_skus
26
27
 
27
28
  # survey gizmo sends a hash back for :title
28
29
  # @private
@@ -28,5 +28,9 @@ module SurveyGizmo; module API
28
28
  {:id => self.id, :survey_id => self.survey_id}
29
29
  end
30
30
 
31
+ def datesubmitted=(value)
32
+ self.date_submitted = value
33
+ end
34
+
31
35
  end
32
- end; end
36
+ end; end
@@ -21,6 +21,7 @@ module SurveyGizmo; module API
21
21
  attribute :statistics, Array
22
22
  attribute :created_on, DateTime
23
23
  attribute :modified_on, DateTime
24
+ attribute :copy, Boolean
24
25
 
25
26
  route '/survey/:id', :via => [:get, :update, :delete]
26
27
  route '/survey', :via => :create
@@ -7,6 +7,7 @@ module SurveyGizmo; module API
7
7
  # @return [$2]
8
8
  attribute :id, Integer
9
9
  attribute :name, String
10
+ attribute :type, String
10
11
  attribute :_type, String
11
12
  attribute :_subtype, String
12
13
  attribute :__subtype, String
@@ -21,6 +22,8 @@ module SurveyGizmo; module API
21
22
  attribute :survey_id, Integer
22
23
  attribute :datecreated, DateTime
23
24
  attribute :datemodified, DateTime
25
+ attribute :surveycampaign, Integer
26
+ attribute :copy, Boolean
24
27
 
25
28
  route '/survey/:survey_id/surveycampaign/:id', :via => [:get, :update, :delete]
26
29
  route '/survey/:survey_id/surveycampaign', :via => :create
@@ -1,6 +1,5 @@
1
1
  module SurveyGizmo
2
2
  class Collection
3
- include Enumerable
4
3
 
5
4
  private
6
5
  # @param [Class] resource
@@ -6,7 +6,7 @@ module SurveyGizmo
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  included do
9
- include Virtus
9
+ include Virtus.model
10
10
  instance_variable_set('@paths', {})
11
11
  instance_variable_set('@collections', {})
12
12
  SurveyGizmo::Resource.descendants << self
@@ -65,6 +65,18 @@ module SurveyGizmo
65
65
  resource
66
66
  end
67
67
 
68
+ # Copy a resource
69
+ # @param [Integer] id
70
+ # @param [Hash] attributes
71
+ # @return [Resource]
72
+ # The newly created resource instance
73
+ def copy(attributes = {})
74
+ attributes[:copy] = true
75
+ resource = new(attributes)
76
+ resource.__send__(:_copy)
77
+ resource
78
+ end
79
+
68
80
  # Deleted the Resource from Survey Gizmo
69
81
  # @param [Hash] conditions
70
82
  # @return [Boolean]
@@ -150,7 +162,7 @@ module SurveyGizmo
150
162
  if new?
151
163
  _create
152
164
  else
153
- handle_response SurveyGizmo.post(handle_route(:update), :query => self.attributes_without_blanks) do
165
+ handle_response SurveyGizmo.post(handle_route(:update), :query => self.attributes_without_blanks) do
154
166
  _response.ok? ? saved! : false
155
167
  end
156
168
  end
@@ -217,18 +229,18 @@ module SurveyGizmo
217
229
  def errors
218
230
  @errors ||= []
219
231
  end
220
-
232
+
221
233
  # @return [Hash] The raw JSON returned by Survey Gizmo
222
234
  def raw_response
223
235
  _response.response if _response
224
236
  end
225
-
237
+
226
238
  # @visibility private
227
239
  def inspect
228
- attrs = self.class.attributes.map do |attrib|
240
+ attrs = self.class.attribute_set.map do |attrib|
229
241
  value = attrib.get!(self).inspect
230
242
 
231
- "#{attrib.instance_variable_name}=#{value}" if attrib.respond_to?(:instance_variable_name)
243
+ "@#{attrib.name}=#{value}" if attrib.respond_to?(:name)
232
244
  end
233
245
 
234
246
  "#<#{self.class.name}:#{self.object_id} #{attrs.join(' ')}>"
@@ -237,7 +249,7 @@ module SurveyGizmo
237
249
  # This class normalizes the response returned by Survey Gizmo
238
250
  class Response
239
251
  def ok?
240
- @response['result_ok']
252
+ @response && @response['result_ok']
241
253
  end
242
254
 
243
255
  # The parsed JSON data of the response
@@ -249,9 +261,9 @@ module SurveyGizmo
249
261
  def message
250
262
  @_message ||= @response['message']
251
263
  end
252
-
264
+
253
265
  attr_reader :response
254
-
266
+
255
267
  private
256
268
  def cleanup_attribute_name(attr)
257
269
  attr.downcase.gsub(/[^[:alnum:]]+/,'_').gsub(/(url|variable|standard|shown)/,'').gsub(/_+/,'_').gsub(/^_/,'').gsub(/_$/,'')
@@ -274,33 +286,35 @@ module SurveyGizmo
274
286
 
275
287
  def initialize(response)
276
288
  @response = response.parsed_response
277
- return unless @response['data'].class == Hash
289
+ return if @response.nil? or not ok?
278
290
  @_data = @response['data']
279
291
 
280
292
  # Handle really crappy [] notation in SG API, so far just in SurveyResponse
281
- @_data.keys.grep(/^\[/).each do |key|
282
- next unless @_data[key].length > 0
283
-
284
- parent = find_attribute_parent(key)
285
- @_data[parent] = {} unless @_data[parent]
286
-
287
- case key.downcase
288
- when /(url|variable.*standard)/
289
- @_data[parent][cleanup_attribute_name(key).to_sym] = @_data[key]
290
- when /variable.*shown/
291
- @_data[parent][cleanup_attribute_name(key).to_i] = @_data[key].include?("1")
292
- when /variable/
293
- @_data[parent][cleanup_attribute_name(key).to_i] = @_data[key].to_i
294
- when /question/
295
- @_data[parent][key] = @_data[key]
293
+ (@_data.is_a?(Array) ? @_data : [@_data]).each do |data_item|
294
+ data_item.keys.grep(/^\[/).each do |key|
295
+ next unless data_item[key].length > 0
296
+
297
+ parent = find_attribute_parent(key)
298
+ data_item[parent] = {} unless data_item[parent]
299
+
300
+ case key.downcase
301
+ when /(url|variable.*standard)/
302
+ data_item[parent][cleanup_attribute_name(key).to_sym] = data_item[key]
303
+ when /variable.*shown/
304
+ data_item[parent][cleanup_attribute_name(key).to_i] = data_item[key].include?("1")
305
+ when /variable/
306
+ data_item[parent][cleanup_attribute_name(key).to_i] = data_item[key].to_i
307
+ when /question/
308
+ data_item[parent][key] = data_item[key]
309
+ end
310
+
311
+ data_item.delete(key)
296
312
  end
297
-
298
- @_data.delete(key)
299
- end
313
+ end unless @_data.nil?
300
314
  end
301
315
  end
302
-
303
-
316
+
317
+
304
318
  protected
305
319
 
306
320
  def attributes_without_blanks
@@ -338,5 +352,17 @@ module SurveyGizmo
338
352
  end
339
353
  end
340
354
 
355
+ def _copy(attributes = {})
356
+ http = SurveyGizmo.post(handle_route(:update), :query => self.attributes_without_blanks)
357
+ handle_response http do
358
+ if _response.ok?
359
+ self.attributes = _response.data
360
+ saved!
361
+ else
362
+ false
363
+ end
364
+ end
365
+ end
366
+
341
367
  end
342
- end
368
+ end
@@ -5,6 +5,7 @@ require "active_support/core_ext/object/blank"
5
5
  require "active_support/concern"
6
6
  require "virtus"
7
7
  require "httparty"
8
+ require "digest/md5"
8
9
 
9
10
  require "survey_gizmo/resource"
10
11
  require "survey_gizmo/collection"
@@ -21,6 +22,7 @@ require "survey_gizmo/api/email_message"
21
22
  module SurveyGizmo
22
23
  include HTTParty
23
24
  debug_output $stderr if ENV['GIZMO_DEBUG']
25
+ default_timeout 600 # 10 minutes, SurveyGizmo has serious problems.
24
26
 
25
27
  format :json
26
28
 
@@ -40,7 +42,7 @@ module SurveyGizmo
40
42
  # The account password
41
43
  def self.setup(opts = {})
42
44
  self.options = opts
43
- default_params({"user:pass" => opts.values_at(:user, :password).join(':')})
45
+ default_params({ "user:md5" => "#{opts[:user]}:#{Digest::MD5.hexdigest(opts[:password])}" })
44
46
  end
45
47
 
46
48
  end
@@ -1,26 +1,26 @@
1
1
  require "spec_helper"
2
2
  describe "Survey Gizmo Resource" do
3
-
3
+
4
4
  describe SurveyGizmo::Resource do
5
5
  before(:each) do
6
6
  SurveyGizmo.setup(:user => 'test@test.com', :password => 'password')
7
7
  end
8
-
8
+
9
9
  let(:described_class) { SurveyGizmoSpec::ResourceTest }
10
-
10
+
11
11
  let(:create_attributes){ {:title => 'Spec', :test_id => 5} }
12
12
  let(:get_attributes) { create_attributes.merge(:id => 1) }
13
13
  let(:update_attributes){ {:title => 'Updated'} }
14
14
  let(:first_params){ {:id => 1, :test_id => 5} }
15
- let(:uri_paths){
16
- {
15
+ let(:uri_paths){
16
+ {
17
17
  :get => '/test/1',
18
18
  :create => '/test/5/resource',
19
19
  :update => '/test/5/resource/1',
20
20
  :delete => '/test/5/resource/1'
21
21
  }
22
22
  }
23
-
23
+
24
24
  it "#new?" do
25
25
  described_class.new.should be_new
26
26
  end
@@ -35,13 +35,13 @@ describe "Survey Gizmo Resource" do
35
35
  end
36
36
 
37
37
  it '#valid?'
38
-
38
+
39
39
  it "should raise an error if params are missing" do
40
40
  lambda {
41
41
  SurveyGizmoSpec::ResourceTest.destroy(:test_id => 5)
42
42
  }.should raise_error(SurveyGizmo::URLError, 'Missing parameters in request: `:id`')
43
43
  end
44
-
44
+
45
45
  it_should_behave_like 'an API object'
46
46
  it_should_behave_like 'an object with errors'
47
47
  end
@@ -51,39 +51,39 @@ describe "Survey Gizmo Resource" do
51
51
  let(:get_attributes) { create_attributes.merge(:id => 1234) }
52
52
  let(:update_attributes){ {:title => 'Updated'} }
53
53
  let(:first_params){ {:id => 1234} }
54
- let(:uri_paths){
54
+ let(:uri_paths){
55
55
  h = { :create => '/survey' }
56
56
  h.default = '/survey/1234'
57
57
  h
58
58
  }
59
-
59
+
60
60
  it_should_behave_like 'an API object'
61
61
  it_should_behave_like 'an object with errors'
62
62
  end
63
63
 
64
64
  describe SurveyGizmo::API::Question do
65
65
  let(:create_attributes){ {:survey_id => 1234, :page_id => 1, :title => 'Spec Question', :type => 'radio', :properties => {"required" => true, "option_sort" => false} } }
66
- let(:get_attributes) {
66
+ let(:get_attributes) {
67
67
  create_attributes.merge(:id => 1)
68
68
  }
69
69
  let(:update_attributes){ {:survey_id => 1234, :page_id => 1, :title => 'Updated'} }
70
70
  let(:first_params){ {:id => 1, :survey_id => 1234, :page_id => 1} }
71
- let(:uri_paths){
71
+ let(:uri_paths){
72
72
  { :get => '/survey/1234/surveyquestion/1',
73
73
  :create => '/survey/1234/surveypage/1/surveyquestion',
74
74
  :update => '/survey/1234/surveypage/1/surveyquestion/1',
75
- :delete => '/survey/1234/surveypage/1/surveyquestion/1'
75
+ :delete => '/survey/1234/surveypage/1/surveyquestion/1'
76
76
  }
77
77
  }
78
-
78
+
79
79
  it_should_behave_like 'an API object'
80
80
  it_should_behave_like 'an object with errors'
81
-
81
+
82
82
  it "should handle the title hash returned from the API" do
83
83
  @question = described_class.new('title' => {'English' => 'Some title'})
84
84
  @question.title.should == 'Some title'
85
85
  end
86
-
86
+
87
87
  it "should handle the _subtype key" do
88
88
  @question = described_class.new(:_subtype => 'radio')
89
89
  @question.type.should == 'radio'
@@ -97,29 +97,29 @@ describe "Survey Gizmo Resource" do
97
97
  }
98
98
  let(:update_attributes){ {:survey_id => 1234, :page_id => 1, :question_id => 1, :title => 'Updated'} }
99
99
  let(:first_params){ {:id => 1, :survey_id => 1234, :page_id => 1, :question_id => 1} }
100
- let(:uri_paths){
100
+ let(:uri_paths){
101
101
  h = { :create => '/survey/1234/surveypage/1/surveyquestion/1/surveyoption' }
102
102
  h.default = '/survey/1234/surveypage/1/surveyquestion/1/surveyoption/1'
103
103
  h
104
104
  }
105
-
105
+
106
106
  it_should_behave_like 'an API object'
107
107
  it_should_behave_like 'an object with errors'
108
108
  end
109
109
 
110
110
  describe SurveyGizmo::API::Page do
111
- let(:create_attributes){ {:survey_id => 1234, :title => 'Spec Page'} }
111
+ let(:create_attributes){ {:survey_id => 1234, :title => {'English' => 'Spec Page'}} }
112
112
  let(:get_attributes) {
113
113
  create_attributes.merge(:id => 1)
114
114
  }
115
115
  let(:update_attributes){ {:survey_id => 1234, :title => 'Updated'} }
116
116
  let(:first_params){ {:id => 1, :survey_id => 1234 } }
117
- let(:uri_paths){
117
+ let(:uri_paths){
118
118
  h = { :create => '/survey/1234/surveypage' }
119
119
  h.default = '/survey/1234/surveypage/1'
120
120
  h
121
121
  }
122
-
122
+
123
123
  it_should_behave_like 'an API object'
124
124
  it_should_behave_like 'an object with errors'
125
125
  end
data/spec/spec_helper.rb CHANGED
@@ -1,10 +1,7 @@
1
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- $LOAD_PATH.unshift(File.dirname(__FILE__))
3
- require "bundler/setup"
4
- Bundler.require(:test)
5
1
  require 'survey-gizmo-ruby'
6
- require "active_support/json"
7
- require "active_support/ordered_hash"
2
+ require 'active_support/json'
3
+ require 'active_support/ordered_hash'
4
+ require 'webmock/rspec'
8
5
 
9
6
  # Requires supporting files with custom matchers and macros, etc,
10
7
  # in ./support/ and its subdirectories.
@@ -12,12 +9,8 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f }
12
9
 
13
10
  RSpec.configure do |config|
14
11
  config.include SurveyGizmoSpec::Methods
15
-
12
+
16
13
  config.before(:each) do
17
14
  @base = 'https://restapi.surveygizmo.com/v3'
18
15
  end
19
-
20
- config.after(:suite) do
21
- SurveyGizmoSpec.cleanup_models
22
- end
23
16
  end
@@ -1,17 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "SurveyGizmo" do
3
+ describe "SurveyGizmo" do
4
4
  it "should have a base uri" do
5
5
  SurveyGizmo.base_uri.should == 'https://restapi.surveygizmo.com/v3'
6
6
  end
7
-
7
+
8
8
  it "should allow basic authentication configuration" do
9
9
  SurveyGizmo.setup(:user => 'test@test.com', :password => 'password')
10
- SurveyGizmo.default_options[:default_params].should == {'user:pass' => 'test@test.com:password'}
10
+ SurveyGizmo.default_options[:default_params].should == {'user:md5' => 'test@test.com:5f4dcc3b5aa765d61d8327deb882cf99'}
11
11
  end
12
-
13
- it "should raise an error if auth isn't configured"
14
-
12
+
13
+ it "should raise an error if auth isn't configured"
14
+
15
15
  describe "Collection" do
16
16
  before(:each) do
17
17
  @array = [
@@ -19,55 +19,55 @@ describe "SurveyGizmo" do
19
19
  {:id => 2, :title => 'Test 2'},
20
20
  {:id => 3, :title => 'Test 3'},
21
21
  {:id => 4, :title => 'Test 4'}
22
- ]
23
-
22
+ ]
23
+
24
24
  SurveyGizmo::Collection.send :public, *SurveyGizmo::Collection.private_instance_methods
25
25
  end
26
-
26
+
27
27
  let(:described_class) { SurveyGizmoSpec::CollectionTest }
28
-
28
+
29
29
  context "class" do
30
30
  before(:each) do
31
31
  described_class.collection :generic_resources
32
32
  end
33
-
33
+
34
34
  subject { SurveyGizmo::Collection.new(described_class, :generic_resources, @array) }
35
-
35
+
36
36
  it { should_not be_loaded }
37
-
37
+
38
38
  it "should set the options in the collections property" do
39
39
  described_class.collections.should == {:generic_resources => {:parent => described_class, :target => :generic_resources}}
40
40
  end
41
-
41
+
42
42
  it "should load objects using the given class" do
43
- subject.first.should be_instance_of(SurveyGizmoSpec::GenericResource)
43
+ subject.first.should be_instance_of(SurveyGizmoSpec::GenericResource)
44
44
  end
45
-
45
+
46
46
  it "should be loaded before iteration" do
47
47
  subject.should_not be_loaded
48
48
  subject.each
49
49
  subject.should be_loaded
50
- end
50
+ end
51
51
  end
52
-
52
+
53
53
  context '#collection' do
54
54
  before(:each) do
55
55
  described_class.collection(:resources, 'ResourceTest')
56
56
  end
57
-
57
+
58
58
  it { lambda{ described_class.collection :resources, 'ResourceTest'}.should_not raise_error }
59
-
59
+
60
60
  it "should have an accessor for the collection" do
61
- described_class.public_instance_methods.should include(:resources)
62
- described_class.public_instance_methods.should include(:resources=)
61
+ described_class.new.should respond_to('resources')
62
+ described_class.new.should respond_to('resources=')
63
63
  end
64
-
64
+
65
65
  it "should set an empty collection" do
66
66
  described_class.collection(:resources, 'ResourceTest')
67
67
  obj = described_class.new()
68
68
  obj.resources.should be_empty
69
69
  end
70
-
70
+
71
71
  it "should set a collection" do
72
72
  described_class.collection(:resources, 'ResourceTest')
73
73
  obj = described_class.new()
@@ -75,19 +75,19 @@ describe "SurveyGizmo" do
75
75
  obj.resources.should be_instance_of(SurveyGizmo::Collection)
76
76
  obj.resources.length.should == @array.length
77
77
  end
78
-
78
+
79
79
  it "should set a collection from a hash" do
80
80
  obj = described_class.new(:id => 1, :resources => @array)
81
81
  obj.resources.should be_instance_of(SurveyGizmo::Collection)
82
82
  obj.resources.length.should == @array.length
83
83
  end
84
-
84
+
85
85
  it "can handle multiple collections" do
86
86
  described_class.collection(:generic_resources)
87
- described_class.public_instance_methods.should include(:resources)
88
- described_class.public_instance_methods.should include(:generic_resources)
87
+ described_class.new.should respond_to('resources')
88
+ described_class.new.should respond_to('generic_resources')
89
89
  end
90
-
90
+
91
91
  it "can handle nested collections" do
92
92
  pending("Needs to be changed to work with suite. Right now it only passes in isolation.")
93
93
  SurveyGizmoSpec::ResourceTest.collection :generic_resources
@@ -95,13 +95,13 @@ describe "SurveyGizmo" do
95
95
  {:id => 1, :title => 'Generic Test 5'},
96
96
  {:id => 2, :title => 'Generic Test 6'},
97
97
  {:id => 3, :title => 'Generic Test 7'}
98
- ]
99
-
98
+ ]
99
+
100
100
  @array << {:id => 99, :generic_resources => @generic_resource_list}
101
101
  obj = described_class.new(:id => 1, :resources => @array)
102
102
  obj.resources.first.should be_instance_of(SurveyGizmoSpec::ResourceTest)
103
103
  obj.resources.detect{|r| r.id == 99 }.generic_resources.first.should be_instance_of(SurveyGizmoSpec::GenericResource)
104
104
  end
105
105
  end
106
- end
106
+ end
107
107
  end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = "survey-gizmo-ruby"
7
+ gem.version = "1.0.1"
8
+ gem.authors = ["Kabari Hendrick", "Chris Horn", "Adrien Jarthon"]
9
+ gem.email = ["adrien.jarthon@dimelo.com"]
10
+ gem.description = "Gem to use the SurveyGizmo.com REST API, v3+"
11
+ gem.summary = "Gem to use the SurveyGizmo.com REST API, v3+"
12
+ gem.homepage = "http://github.com/RipTheJacker/survey-gizmo-ruby"
13
+ gem.licenses = ["MIT"]
14
+
15
+ gem.add_dependency 'activesupport', ">= 3.0"
16
+ gem.add_dependency 'i18n'
17
+ gem.add_dependency 'virtus', ">= 1.0.0"
18
+ gem.add_dependency 'httparty'
19
+ gem.add_dependency 'addressable'
20
+ gem.add_development_dependency 'webmock'
21
+ gem.add_development_dependency 'rspec', "~> 2.11.0"
22
+ gem.add_development_dependency 'rake'
23
+
24
+ gem.files = `git ls-files`.split($/)
25
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
26
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
27
+ gem.require_paths = ["lib"]
28
+ end
29
+
metadata CHANGED
@@ -1,141 +1,161 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: survey-gizmo-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.6
5
4
  prerelease:
5
+ version: 1.0.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Kabari Hendrick
9
9
  - Chris Horn
10
+ - Adrien Jarthon
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2012-10-09 00:00:00.000000000Z
14
+ date: 2013-11-12 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
- name: activesupport
17
- requirement: &70327435758280 !ruby/object:Gem::Requirement
18
- none: false
17
+ version_requirements: !ruby/object:Gem::Requirement
19
18
  requirements:
20
- - - ~>
19
+ - - ! '>='
21
20
  - !ruby/object:Gem::Version
22
21
  version: '3.0'
22
+ none: false
23
+ name: activesupport
23
24
  type: :runtime
24
25
  prerelease: false
25
- version_requirements: *70327435758280
26
- - !ruby/object:Gem::Dependency
27
- name: i18n
28
- requirement: &70327435756840 !ruby/object:Gem::Requirement
26
+ requirement: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '3.0'
29
31
  none: false
32
+ - !ruby/object:Gem::Dependency
33
+ version_requirements: !ruby/object:Gem::Requirement
30
34
  requirements:
31
35
  - - ! '>='
32
36
  - !ruby/object:Gem::Version
33
37
  version: '0'
38
+ none: false
39
+ name: i18n
34
40
  type: :runtime
35
41
  prerelease: false
36
- version_requirements: *70327435756840
37
- - !ruby/object:Gem::Dependency
38
- name: virtus
39
- requirement: &70327435748540 !ruby/object:Gem::Requirement
40
- none: false
42
+ requirement: !ruby/object:Gem::Requirement
41
43
  requirements:
42
44
  - - ! '>='
43
45
  - !ruby/object:Gem::Version
44
46
  version: '0'
47
+ none: false
48
+ - !ruby/object:Gem::Dependency
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 1.0.0
54
+ none: false
55
+ name: virtus
45
56
  type: :runtime
46
57
  prerelease: false
47
- version_requirements: *70327435748540
48
- - !ruby/object:Gem::Dependency
49
- name: httparty
50
- requirement: &70327435746040 !ruby/object:Gem::Requirement
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 1.0.0
51
63
  none: false
64
+ - !ruby/object:Gem::Dependency
65
+ version_requirements: !ruby/object:Gem::Requirement
52
66
  requirements:
53
67
  - - ! '>='
54
68
  - !ruby/object:Gem::Version
55
69
  version: '0'
70
+ none: false
71
+ name: httparty
56
72
  type: :runtime
57
73
  prerelease: false
58
- version_requirements: *70327435746040
59
- - !ruby/object:Gem::Dependency
60
- name: addressable
61
- requirement: &70327435744300 !ruby/object:Gem::Requirement
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
62
79
  none: false
80
+ - !ruby/object:Gem::Dependency
81
+ version_requirements: !ruby/object:Gem::Requirement
63
82
  requirements:
64
83
  - - ! '>='
65
84
  - !ruby/object:Gem::Version
66
85
  version: '0'
86
+ none: false
87
+ name: addressable
67
88
  type: :runtime
68
89
  prerelease: false
69
- version_requirements: *70327435744300
70
- - !ruby/object:Gem::Dependency
71
- name: bluecloth
72
- requirement: &70327435742600 !ruby/object:Gem::Requirement
73
- none: false
90
+ requirement: !ruby/object:Gem::Requirement
74
91
  requirements:
75
92
  - - ! '>='
76
93
  - !ruby/object:Gem::Version
77
94
  version: '0'
78
- type: :development
79
- prerelease: false
80
- version_requirements: *70327435742600
81
- - !ruby/object:Gem::Dependency
82
- name: yard
83
- requirement: &70327435741380 !ruby/object:Gem::Requirement
84
95
  none: false
96
+ - !ruby/object:Gem::Dependency
97
+ version_requirements: !ruby/object:Gem::Requirement
85
98
  requirements:
86
- - - ~>
99
+ - - ! '>='
87
100
  - !ruby/object:Gem::Version
88
- version: 0.7.0
101
+ version: '0'
102
+ none: false
103
+ name: webmock
89
104
  type: :development
90
105
  prerelease: false
91
- version_requirements: *70327435741380
92
- - !ruby/object:Gem::Dependency
93
- name: bundler
94
- requirement: &70327435729640 !ruby/object:Gem::Requirement
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
95
111
  none: false
112
+ - !ruby/object:Gem::Dependency
113
+ version_requirements: !ruby/object:Gem::Requirement
96
114
  requirements:
97
115
  - - ~>
98
116
  - !ruby/object:Gem::Version
99
- version: '1.0'
117
+ version: 2.11.0
118
+ none: false
119
+ name: rspec
100
120
  type: :development
101
121
  prerelease: false
102
- version_requirements: *70327435729640
103
- - !ruby/object:Gem::Dependency
104
- name: jeweler
105
- requirement: &70327435724260 !ruby/object:Gem::Requirement
106
- none: false
122
+ requirement: !ruby/object:Gem::Requirement
107
123
  requirements:
108
124
  - - ~>
109
125
  - !ruby/object:Gem::Version
110
- version: 1.6.4
111
- type: :development
112
- prerelease: false
113
- version_requirements: *70327435724260
114
- - !ruby/object:Gem::Dependency
115
- name: awesome_print
116
- requirement: &70327435712160 !ruby/object:Gem::Requirement
126
+ version: 2.11.0
117
127
  none: false
128
+ - !ruby/object:Gem::Dependency
129
+ version_requirements: !ruby/object:Gem::Requirement
118
130
  requirements:
119
131
  - - ! '>='
120
132
  - !ruby/object:Gem::Version
121
133
  version: '0'
134
+ none: false
135
+ name: rake
122
136
  type: :development
123
137
  prerelease: false
124
- version_requirements: *70327435712160
125
- description: gem to use the SurveyGizmo.com REST API, v3+
126
- email: self@ripthejacker.com
138
+ requirement: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ none: false
144
+ description: Gem to use the SurveyGizmo.com REST API, v3+
145
+ email:
146
+ - adrien.jarthon@dimelo.com
127
147
  executables: []
128
148
  extensions: []
129
- extra_rdoc_files:
130
- - LICENSE.txt
131
- - README.md
149
+ extra_rdoc_files: []
132
150
  files:
151
+ - .document
152
+ - .gitignore
153
+ - .rspec
133
154
  - Gemfile
134
155
  - Gemfile.lock
135
156
  - LICENSE.txt
136
157
  - README.md
137
158
  - Rakefile
138
- - VERSION
139
159
  - lib/survey-gizmo-ruby.rb
140
160
  - lib/survey_gizmo/api/contact.rb
141
161
  - lib/survey_gizmo/api/email_message.rb
@@ -151,7 +171,6 @@ files:
151
171
  - spec/resource_spec.rb
152
172
  - spec/spec_helper.rb
153
173
  - spec/support/methods.rb
154
- - spec/support/model_cleanup.rb
155
174
  - spec/support/spec_shared_api_object.rb
156
175
  - spec/support/spec_shared_object_with_errors.rb
157
176
  - spec/support/test_resource_classes.rb
@@ -159,6 +178,7 @@ files:
159
178
  - spec/test_json/page.json
160
179
  - spec/test_json/question.json
161
180
  - spec/test_json/survey.json
181
+ - survey-gizmo-ruby.gemspec
162
182
  homepage: http://github.com/RipTheJacker/survey-gizmo-ruby
163
183
  licenses:
164
184
  - MIT
@@ -167,24 +187,32 @@ rdoc_options: []
167
187
  require_paths:
168
188
  - lib
169
189
  required_ruby_version: !ruby/object:Gem::Requirement
170
- none: false
171
190
  requirements:
172
191
  - - ! '>='
173
192
  - !ruby/object:Gem::Version
174
193
  version: '0'
175
- segments:
176
- - 0
177
- hash: 1680038984146331974
178
- required_rubygems_version: !ruby/object:Gem::Requirement
179
194
  none: false
195
+ required_rubygems_version: !ruby/object:Gem::Requirement
180
196
  requirements:
181
197
  - - ! '>='
182
198
  - !ruby/object:Gem::Version
183
199
  version: '0'
200
+ none: false
184
201
  requirements: []
185
202
  rubyforge_project:
186
- rubygems_version: 1.8.8
203
+ rubygems_version: 1.8.23
187
204
  signing_key:
188
205
  specification_version: 3
189
- summary: gem to use the Survey Gizmo REST API
190
- test_files: []
206
+ summary: Gem to use the SurveyGizmo.com REST API, v3+
207
+ test_files:
208
+ - spec/resource_spec.rb
209
+ - spec/spec_helper.rb
210
+ - spec/support/methods.rb
211
+ - spec/support/spec_shared_api_object.rb
212
+ - spec/support/spec_shared_object_with_errors.rb
213
+ - spec/support/test_resource_classes.rb
214
+ - spec/survey-gizmo-ruby_spec.rb
215
+ - spec/test_json/page.json
216
+ - spec/test_json/question.json
217
+ - spec/test_json/survey.json
218
+ has_rdoc:
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.9.6
@@ -1,38 +0,0 @@
1
- module SurveyGizmoSpec
2
- # global model cleanup. Mostly stolen from DataMapper.
3
- def self.cleanup_models
4
- descendants = SurveyGizmo::Resource.descendants.to_a
5
-
6
- while model = descendants.shift
7
- model_name = model.name.to_s.strip
8
-
9
- unless model_name.empty? || model_name[0] == ?#
10
- parts = model_name.split('::')
11
- constant_name = parts.pop.to_sym
12
- base = parts.empty? ? Object : SurveyGizmoSpec.full_const_get(parts.join('::'))
13
-
14
- base.class_eval { remove_const(constant_name) if const_defined?(constant_name) }
15
- end
16
-
17
- model.instance_methods(false).each { |method| model.send(:undef_method, method) }
18
-
19
- end
20
-
21
- SurveyGizmo::Resource.descendants.clear
22
- end
23
-
24
- end
25
-
26
- class Object
27
- def full_const_get(name)
28
- list = name.split("::")
29
- list.shift if list.first.blank?
30
- obj = self
31
- list.each do |x|
32
- # This is required because const_get tries to look for constants in the
33
- # ancestor chain, but we only want constants that are HERE
34
- obj = obj.const_defined?(x) ? obj.const_get(x) : obj.const_missing(x)
35
- end
36
- obj
37
- end
38
- end