survey-gizmo-ruby 0.7.1 → 0.9.6

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.
data/Gemfile CHANGED
@@ -1,15 +1,17 @@
1
- source "http://rubygems.org"
1
+ source :rubygems
2
2
 
3
- gem "activesupport", '>= 3.0.1'
3
+ gem "activesupport", '~> 3.0'
4
4
  gem 'i18n'
5
- gem 'virtus', '~> 0.0.5'
5
+ gem 'virtus'
6
6
  gem 'httparty'
7
+ gem 'addressable', :require => "addressable/uri"
7
8
 
8
9
  group :development do
9
10
  gem 'bluecloth', :require => nil
10
11
  gem "yard", "~> 0.7.0"
11
12
  gem "bundler", "~> 1.0"
12
13
  gem "jeweler", "~> 1.6.4"
14
+ gem 'awesome_print', :require => 'ap'
13
15
  end
14
16
 
15
17
  group :test do
data/Gemfile.lock CHANGED
@@ -1,24 +1,26 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activesupport (3.1.3)
4
+ activesupport (3.2.8)
5
+ i18n (~> 0.6)
5
6
  multi_json (~> 1.0)
6
- addressable (2.2.6)
7
- awesome_print (1.0.1)
7
+ addressable (2.3.2)
8
+ awesome_print (1.1.0)
9
+ backports (2.6.4)
8
10
  bluecloth (2.2.0)
9
11
  crack (0.3.1)
10
12
  diff-lcs (1.1.3)
11
13
  git (1.2.5)
12
- httparty (0.8.1)
13
- multi_json
14
+ httparty (0.9.0)
15
+ multi_json (~> 1.0)
14
16
  multi_xml
15
- i18n (0.6.0)
17
+ i18n (0.6.1)
16
18
  jeweler (1.6.4)
17
19
  bundler (~> 1.0)
18
20
  git (>= 1.2.5)
19
21
  rake
20
- multi_json (1.0.4)
21
- multi_xml (0.4.1)
22
+ multi_json (1.3.6)
23
+ multi_xml (0.5.1)
22
24
  net-http-spy (0.2.1)
23
25
  rake (0.9.2.2)
24
26
  rspec (2.11.0)
@@ -26,20 +28,22 @@ GEM
26
28
  rspec-expectations (~> 2.11.0)
27
29
  rspec-mocks (~> 2.11.0)
28
30
  rspec-core (2.11.1)
29
- rspec-expectations (2.11.2)
31
+ rspec-expectations (2.11.3)
30
32
  diff-lcs (~> 1.1.3)
31
- rspec-mocks (2.11.2)
32
- virtus (0.0.10)
33
- webmock (1.7.8)
34
- addressable (~> 2.2, > 2.2.5)
33
+ rspec-mocks (2.11.3)
34
+ virtus (0.5.2)
35
+ backports (~> 2.6.1)
36
+ webmock (1.8.11)
37
+ addressable (>= 2.2.7)
35
38
  crack (>= 0.1.7)
36
- yard (0.7.4)
39
+ yard (0.7.5)
37
40
 
38
41
  PLATFORMS
39
42
  ruby
40
43
 
41
44
  DEPENDENCIES
42
- activesupport (>= 3.0.1)
45
+ activesupport (~> 3.0)
46
+ addressable
43
47
  awesome_print
44
48
  bluecloth
45
49
  bundler (~> 1.0)
@@ -48,6 +52,6 @@ DEPENDENCIES
48
52
  jeweler (~> 1.6.4)
49
53
  net-http-spy
50
54
  rspec (~> 2.11.0)
51
- virtus (~> 0.0.5)
55
+ virtus
52
56
  webmock
53
57
  yard (~> 0.7.0)
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Survey Gizmo (ruby)
2
2
 
3
- 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 **v1**.
3
+ 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
4
4
 
5
5
  ## Installation
6
6
 
@@ -28,9 +28,9 @@ Integrate with the [Survey Gizmo API](http://developer.surveygizmo.com/resources
28
28
 
29
29
  ## Adding API Objects
30
30
 
31
- Currently, the following API objects are included in the gem: `Survey`, `Question`, `Option`, `Page`, `Response`. If you want to use something that isn't included you can easily write a class that handles it. Here's an example of the `SurveyGizmo::API::Survey` class:
31
+ Currently, the following API objects are included in the gem: `Survey`, `Question`, `Option`, `Page`, `Response`, `EmailMessage`, `SurveyCampaign`, `Contact`. If you want to use something that isn't included you can easily write a class that handles it. Here's an example of the how to do so:
32
32
 
33
- class Survey
33
+ class SomeObject
34
34
  # the base where most of the methods for handling the API are stored
35
35
  include SurveyGizmo::Resource
36
36
 
@@ -38,12 +38,12 @@ Currently, the following API objects are included in the gem: `Survey`, `Questio
38
38
  attribute :id, Integer
39
39
  attribute :title, String
40
40
  attribute :status, String
41
- attribute :type, String, :default => 'survey'
41
+ attribute :type, String
42
42
  attribute :created_on, DateTime
43
43
 
44
44
  # defing the paths used to retrieve/set info
45
- route '/survey/:id', :via => [:get, :update, :delete]
46
- route '/survey', :via => :create
45
+ route '/something/:id', :via => [:get, :update, :delete]
46
+ route '/something', :via => :create
47
47
 
48
48
  # this must be defined with the params that would be included in any route
49
49
  def to_param_options
@@ -70,6 +70,6 @@ There are several API objects that are available and not included in this gem. I
70
70
 
71
71
  # Copyright
72
72
 
73
- Copyright (c) 2011 RipTheJacker. See LICENSE.txt for
73
+ Copyright (c) 2012 RipTheJacker. See LICENSE.txt for
74
74
  further details.
75
75
 
data/Rakefile CHANGED
@@ -17,10 +17,10 @@ Jeweler::Tasks.new do |gem|
17
17
  gem.name = "survey-gizmo-ruby"
18
18
  gem.homepage = "http://github.com/RipTheJacker/survey-gizmo-ruby"
19
19
  gem.license = "MIT"
20
- gem.summary = %Q{gem to consume the Survey Gizmo API}
21
- gem.description = %Q{}
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
22
  gem.email = "self@ripthejacker.com"
23
- gem.authors = ["Kabari Hendrick"]
23
+ gem.authors = ["Kabari Hendrick", "Chris Horn"]
24
24
  gem.files = FileList['lib/**/*.rb', 'Gemfile*', '[A-Z]*', 'Rakefile', 'spec/**/*'].to_a
25
25
  # dependencies defined in Gemfile
26
26
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.1
1
+ 0.9.6
@@ -0,0 +1,49 @@
1
+ module SurveyGizmo; module API
2
+ # @see SurveyGizmo::Resource::ClassMethods
3
+ class Contact
4
+ include SurveyGizmo::Resource
5
+
6
+ # @macro [attach] virtus_attribute
7
+ # @return [$2]
8
+ attribute :id, Integer
9
+ attribute :survey_id, Integer
10
+ attribute :campaign_id, Integer
11
+ attribute :estatus, String
12
+ attribute :esubscriberstatus, String
13
+ attribute :semailaddress, String
14
+ attribute :sfirstname, String
15
+ attribute :slastname, String
16
+ attribute :sorganization, String
17
+ attribute :sdepartment, String
18
+ attribute :sbusinessphone, String
19
+ attribute :shomephone, String
20
+ attribute :sfaxphone, String
21
+ attribute :sworkphone, String
22
+ attribute :smailingaddress, String
23
+ attribute :smailingaddress2, String
24
+ attribute :smailingaddresscity, String
25
+ attribute :smailingaddressstate, String
26
+ attribute :smailingaddresscountry, String
27
+ attribute :smailingaddresspostal, String
28
+ attribute :stitle, String
29
+ attribute :surl, String
30
+ attribute :scustomfield1, String
31
+ attribute :scustomfield2, String
32
+ attribute :scustomfield3, String
33
+ attribute :scustomfield4, String
34
+ attribute :scustomfield5, String
35
+ attribute :scustomfield6, String
36
+ attribute :scustomfield7, String
37
+ attribute :scustomfield8, String
38
+ attribute :scustomfield9, String
39
+ attribute :scustomfield10, String
40
+
41
+ route '/survey/:survey_id/surveycampaign/:campaign_id/contact/:id', :via => [:get, :update, :delete]
42
+ route '/survey/:survey_id/surveycampaign/:campaign_id/contact', :via => :create
43
+
44
+ # @see SurveyGizmo::Resource#to_param_options
45
+ def to_param_options
46
+ {:id => self.id, :survey_id => self.survey_id, :campaign_id => self.campaign_id}
47
+ end
48
+ end
49
+ end; end
@@ -0,0 +1,33 @@
1
+ module SurveyGizmo; module API
2
+ # @see SurveyGizmo::Resource::ClassMethods
3
+ class EmailMessage
4
+ include SurveyGizmo::Resource
5
+
6
+ # @macro [attach] virtus_attribute
7
+ # @return [$2]
8
+ attribute :id, Integer
9
+ attribute :survey_id, Integer
10
+ attribute :campaign_id, Integer
11
+ attribute :invite_identity, Integer
12
+ attribute :_type, String
13
+ attribute :_subtype, String
14
+ attribute :subject, String
15
+ attribute :replies, String
16
+ attribute :messagetype, String
17
+ attribute :medium, String
18
+ attribute :status, String
19
+ attribute :from, Hash
20
+ attribute :body, Hash
21
+ attribute :send, Boolean
22
+ attribute :datecreated, DateTime
23
+ attribute :datemodified, DateTime
24
+
25
+ route '/survey/:survey_id/surveycampaign/:campaign_id/emailmessage/:id', :via => [:get, :update, :delete]
26
+ route '/survey/:survey_id/surveycampaign/:campaign_id/emailmessage', :via => :create
27
+
28
+ # @see SurveyGizmo::Resource#to_param_options
29
+ def to_param_options
30
+ {:id => self.id, :survey_id => self.survey_id, :campaign_id => self.campaign_id}
31
+ end
32
+ end
33
+ end; end
@@ -2,20 +2,21 @@ module SurveyGizmo; module API
2
2
  # @see SurveyGizmo::Resource::ClassMethods
3
3
  class Option
4
4
  include SurveyGizmo::Resource
5
-
5
+
6
6
  # @macro [attach] virtus_attribute
7
7
  # @return [$2]
8
8
  attribute :id, Integer
9
- attribute :title, String
10
- attribute :value, String
11
9
  attribute :survey_id, Integer
12
10
  attribute :page_id, Integer
13
11
  attribute :question_id, Integer
14
-
12
+ attribute :title, String
13
+ attribute :value, String
14
+ attribute :properties, Hash
15
+
15
16
  # routing
16
17
  route '/survey/:survey_id/surveypage/:page_id/surveyquestion/:question_id/surveyoption', :via => :create
17
18
  route '/survey/:survey_id/surveypage/:page_id/surveyquestion/:question_id/surveyoption/:id', :via => [:get, :update, :delete]
18
-
19
+
19
20
  # survey gizmo sends a hash back for :title
20
21
  # @private
21
22
  def title_with_multilingual=(val)
@@ -23,11 +24,11 @@ module SurveyGizmo; module API
23
24
  end
24
25
 
25
26
  alias_method_chain :title=, :multilingual
26
-
27
+
27
28
  # @see SurveyGizmo::Resource#to_param_options
28
29
  def to_param_options
29
30
  {:id => self.id, :survey_id => self.survey_id, :page_id => self.page_id, :question_id => self.question_id}
30
31
  end
31
-
32
+
32
33
  end
33
34
  end; end
@@ -2,7 +2,7 @@ module SurveyGizmo; module API
2
2
  # @see SurveyGizmo::Resource::ClassMethods
3
3
  class Page
4
4
  include SurveyGizmo::Resource
5
-
5
+
6
6
  # @macro [attach] virtus_attribute
7
7
  # @return [$2]
8
8
  attribute :id, Integer
@@ -11,15 +11,15 @@ module SurveyGizmo; module API
11
11
  attribute :properties, Hash
12
12
  attribute :after, Integer
13
13
  attribute :survey_id, Integer
14
-
15
-
14
+
15
+
16
16
  # routing
17
17
  route '/survey/:survey_id/surveypage', :via => :create
18
18
  route '/survey/:survey_id/surveypage/:id', :via => [:get, :update, :delete]
19
-
19
+
20
20
  # @macro collection
21
21
  collection :questions
22
-
22
+
23
23
  # survey gizmo sends a hash back for :title
24
24
  # @private
25
25
  def title_with_multilingual=(val)
@@ -27,8 +27,8 @@ module SurveyGizmo; module API
27
27
  end
28
28
 
29
29
  alias_method_chain :title=, :multilingual
30
-
31
- # @see SurveyGizmo::Resource#to_param_options
30
+
31
+ # @see SurveyGizmo::Resource#to_param_options
32
32
  def to_param_options
33
33
  {:id => self.id, :survey_id => self.survey_id}
34
34
  end
@@ -2,27 +2,28 @@ module SurveyGizmo; module API
2
2
  # @see SurveyGizmo::Resource::ClassMethods
3
3
  class Question
4
4
  include SurveyGizmo::Resource
5
-
5
+
6
6
  # @macro [attach] virtus_attribute
7
7
  # @return [$2]
8
8
  attribute :id, Integer
9
9
  attribute :title, String
10
10
  attribute :type, String
11
11
  attribute :description, String
12
+ attribute :shortname, String
12
13
  attribute :properties, Hash
13
14
  attribute :after, Integer
14
15
  attribute :survey_id, Integer
15
16
  attribute :page_id, Integer, :default => 1
16
-
17
+
17
18
  alias_attribute :_subtype, :type
18
-
19
+
19
20
  route '/survey/:survey_id/surveyquestion/:id', :via => :get
20
21
  route '/survey/:survey_id/surveypage/:page_id/surveyquestion', :via => :create
21
22
  route '/survey/:survey_id/surveypage/:page_id/surveyquestion/:id', :via => [:update, :delete]
22
-
23
+
23
24
  # @macro collection
24
25
  collection :options
25
-
26
+
26
27
  # survey gizmo sends a hash back for :title
27
28
  # @private
28
29
  def title_with_multilingual=(val)
@@ -30,8 +31,8 @@ module SurveyGizmo; module API
30
31
  end
31
32
 
32
33
  alias_method_chain :title=, :multilingual
33
-
34
- # @see SurveyGizmo::Resource#to_param_options
34
+
35
+ # @see SurveyGizmo::Resource#to_param_options
35
36
  def to_param_options
36
37
  {:id => self.id, :survey_id => self.survey_id, :page_id => self.page_id}
37
38
  end
@@ -2,22 +2,31 @@ module SurveyGizmo; module API
2
2
  # @see SurveyGizmo::Resource::ClassMethods
3
3
  class Response
4
4
  include SurveyGizmo::Resource
5
-
5
+
6
6
  # @macro [attach] virtus_attribute
7
7
  # @return [$2] the attribute +$1+ as a $2
8
- attribute :id, Integer
9
- attribute :data, String
10
- attribute :status, String
11
- attribute :survey_id, Integer
12
-
8
+ attribute :id, Integer
9
+ attribute :survey_id, Integer
10
+ attribute :contact_id, Integer
11
+ attribute :data, String
12
+ attribute :status, String
13
+ attribute :date_submitted, DateTime
14
+ attribute :is_test_data, Boolean
15
+ attribute :sResponseComment, String
16
+ attribute :variable, Hash # READ-ONLY
17
+ attribute :meta, Hash # READ-ONLY
18
+ attribute :shown, Hash # READ-ONLY
19
+ attribute :url, Hash # READ-ONLY
20
+ attribute :answers, Hash # READ-ONLY
21
+
13
22
  # routing
14
23
  route '/survey/:survey_id/surveyresponse', :via => :create
15
24
  route '/survey/:survey_id/surveyresponse/:id', :via => [:get, :update, :delete]
16
-
17
- # @see SurveyGizmo::Resource#to_param_options
25
+
26
+ # @see SurveyGizmo::Resource#to_param_options
18
27
  def to_param_options
19
28
  {:id => self.id, :survey_id => self.survey_id}
20
29
  end
21
-
30
+
22
31
  end
23
32
  end; end
@@ -2,23 +2,33 @@ module SurveyGizmo; module API
2
2
  # @see SurveyGizmo::Resource::ClassMethods
3
3
  class Survey
4
4
  include SurveyGizmo::Resource
5
-
5
+
6
6
  # @macro [attach] virtus_attribute
7
7
  # @return [$2]
8
- attribute :id, Integer
9
- attribute :title, String
10
- attribute :status, String
11
- attribute :type, String, :default => 'survey'
12
- attribute :links, Hash
13
- attribute :created_on, DateTime
14
-
8
+ attribute :id, Integer
9
+ attribute :team, Integer
10
+ attribute :_type, String
11
+ attribute :_subtype, String
12
+ attribute :status, String
13
+ attribute :forward_only, Boolean
14
+ attribute :title, String
15
+ attribute :internal_title, String
16
+ attribute :title_ml, Hash
17
+ attribute :links, Hash
18
+ attribute :theme, Integer
19
+ attribute :blockby, String
20
+ attribute :languages, Array
21
+ attribute :statistics, Array
22
+ attribute :created_on, DateTime
23
+ attribute :modified_on, DateTime
24
+
15
25
  route '/survey/:id', :via => [:get, :update, :delete]
16
26
  route '/survey', :via => :create
17
-
27
+
18
28
  # @macro collection
19
29
  collection :pages
20
-
21
- # @see SurveyGizmo::Resource#to_param_options
30
+
31
+ # @see SurveyGizmo::Resource#to_param_options
22
32
  def to_param_options
23
33
  {:id => self.id}
24
34
  end
@@ -0,0 +1,33 @@
1
+ module SurveyGizmo; module API
2
+ # @see SurveyGizmo::Resource::ClassMethods
3
+ class SurveyCampaign
4
+ include SurveyGizmo::Resource
5
+
6
+ # @macro [attach] virtus_attribute
7
+ # @return [$2]
8
+ attribute :id, Integer
9
+ attribute :name, String
10
+ attribute :_type, String
11
+ attribute :_subtype, String
12
+ attribute :__subtype, String
13
+ attribute :status, String
14
+ attribute :uri, String
15
+ attribute :SSL, Boolean
16
+ attribute :slug, String
17
+ attribute :language, String
18
+ attribute :close_message, String
19
+ attribute :limit_responses, String
20
+ attribute :tokenvariables, Array
21
+ attribute :survey_id, Integer
22
+ attribute :datecreated, DateTime
23
+ attribute :datemodified, DateTime
24
+
25
+ route '/survey/:survey_id/surveycampaign/:id', :via => [:get, :update, :delete]
26
+ route '/survey/:survey_id/surveycampaign', :via => :create
27
+
28
+ # @see SurveyGizmo::Resource#to_param_options
29
+ def to_param_options
30
+ {:id => self.id, :survey_id => self.survey_id}
31
+ end
32
+ end
33
+ end; end
@@ -1,9 +1,9 @@
1
1
  module SurveyGizmo
2
2
  class Collection
3
3
  include Enumerable
4
-
4
+
5
5
  private
6
- # @param [Class] resource
6
+ # @param [Class] resource
7
7
  # @param [Symbol] name
8
8
  # @param [Array] values in hashes
9
9
  def initialize(resource, name, values)
@@ -12,14 +12,14 @@ module SurveyGizmo
12
12
  @loaded = false
13
13
  @options = resource.collections[name]
14
14
  end
15
-
15
+
16
16
  public
17
-
17
+
18
18
  # @private
19
19
  def length
20
20
  @array.length
21
21
  end
22
-
22
+
23
23
  # @private
24
24
  def each
25
25
  lazy_load
@@ -29,13 +29,13 @@ module SurveyGizmo
29
29
  @collection.each
30
30
  end
31
31
  end
32
-
32
+
33
33
  # @private
34
34
  def method_missing(meth, *args, &blk)
35
35
  lazy_load
36
36
  @collection.send(meth, *args, &blk)
37
37
  end
38
-
38
+
39
39
  # @private
40
40
  def model
41
41
  return @model if defined?(@model)
@@ -43,31 +43,31 @@ module SurveyGizmo
43
43
  name_string = options[:target].is_a?(Symbol) ? ActiveSupport::Inflector.classify(options[:target]) : options[:target]
44
44
  @model = name_string[/::/] ? Object.const_get?(name_string) : Resource.descendants.detect{ |d| ActiveSupport::Inflector.demodulize(d.name) == name_string }
45
45
  raise NameError, "#{name_string} is not a descendant of SurveyGizmo::Resource" unless @model
46
- @model
46
+ @model
47
47
  end
48
-
49
-
48
+
49
+
50
50
  protected
51
51
  attr_accessor :options
52
-
52
+
53
53
  def lazy_load
54
54
  return if loaded?
55
55
  @collection = @array.map{|hash| load_object(hash) }
56
56
  mark_loaded
57
57
  end
58
-
58
+
59
59
  def load_object(obj_or_attributes)
60
60
  return obj_or_attributes if loaded?
61
61
  obj_or_attributes.is_a?(Hash) ? model.load(obj_or_attributes) : obj_or_attributes
62
62
  end
63
-
63
+
64
64
  def mark_loaded
65
65
  @loaded = true
66
66
  end
67
-
67
+
68
68
  def loaded?
69
69
  @loaded
70
70
  end
71
-
71
+
72
72
  end
73
73
  end
@@ -1,30 +1,42 @@
1
1
  require "set"
2
+ require "addressable/uri"
2
3
 
3
4
  module SurveyGizmo
4
5
  module Resource
5
6
  extend ActiveSupport::Concern
6
-
7
+
7
8
  included do
8
9
  include Virtus
9
10
  instance_variable_set('@paths', {})
10
11
  instance_variable_set('@collections', {})
11
12
  SurveyGizmo::Resource.descendants << self
12
13
  end
13
-
14
+
14
15
  # @return [Set] Every class that includes SurveyGizmo::Resource
15
16
  def self.descendants
16
17
  @descendants ||= Set.new
17
18
  end
18
-
19
+
19
20
  # These are methods that every API resource has to access resources
20
21
  # in Survey Gizmo
21
22
  module ClassMethods
22
-
23
+
24
+ # Convert a [Hash] of filters into a query string
25
+ # @param [Hash] filters
26
+ # @return [String]
27
+ def convert_filters_into_query_string(filters = nil)
28
+ "" unless filters && filters.size > 0
29
+ uri = Addressable::URI.new
30
+ uri.query_values = filters
31
+ "?#{uri.query}"
32
+ end
33
+
23
34
  # Get a list of resources
24
35
  # @param [Hash] conditions
36
+ # @param [Hash] filters
25
37
  # @return [SurveyGizmo::Collection, Array]
26
- def all(conditions = {})
27
- response = Response.new SurveyGizmo.get(handle_route(:create, conditions))
38
+ def all(conditions = {}, filters = nil)
39
+ response = Response.new SurveyGizmo.get(handle_route(:create, conditions) + convert_filters_into_query_string(filters))
28
40
  if response.ok?
29
41
  _collection = SurveyGizmo::Collection.new(self, nil, response.data)
30
42
  _collection.send(:options=, {:target => self, :parent => self})
@@ -33,15 +45,16 @@ module SurveyGizmo
33
45
  []
34
46
  end
35
47
  end
36
-
48
+
37
49
  # Get the first resource
38
50
  # @param [Hash] conditions
51
+ # @param [Hash] filters
39
52
  # @return [Object, nil]
40
- def first(conditions)
41
- response = Response.new SurveyGizmo.get(handle_route(:get, conditions))
53
+ def first(conditions = {}, filters = nil)
54
+ response = Response.new SurveyGizmo.get(handle_route(:get, conditions) + convert_filters_into_query_string(filters))
42
55
  response.ok? ? load(conditions.merge(response.data)) : nil
43
56
  end
44
-
57
+
45
58
  # Create a new resource
46
59
  # @param [Hash] attributes
47
60
  # @return [Resource]
@@ -51,7 +64,7 @@ module SurveyGizmo
51
64
  resource.__send__(:_create)
52
65
  resource
53
66
  end
54
-
67
+
55
68
  # Deleted the Resource from Survey Gizmo
56
69
  # @param [Hash] conditions
57
70
  # @return [Boolean]
@@ -59,11 +72,11 @@ module SurveyGizmo
59
72
  response = Response.new SurveyGizmo.delete(handle_route(:delete, conditions))
60
73
  response.ok?
61
74
  end
62
-
75
+
63
76
  # Define the path where a resource is located
64
- # @param [String] path
77
+ # @param [String] path
65
78
  # the path in Survey Gizmo for the resource
66
- # @param [Hash] options
79
+ # @param [Hash] options
67
80
  # @option options [Array] :via
68
81
  # which is `:get`, `:create`, `:update`, `:delete`, or `:any`
69
82
  # @scope class
@@ -73,19 +86,19 @@ module SurveyGizmo
73
86
  methods.is_a?(Array) ? methods.each{|m| @paths[m] = path } : (@paths[methods] = path)
74
87
  nil
75
88
  end
76
-
89
+
77
90
  # @api private
78
91
  def load(attributes = {})
79
92
  resource = new(attributes)
80
93
  resource.__send__(:clean!)
81
94
  resource
82
95
  end
83
-
96
+
84
97
  # Defines a new collection. These are child objects of the resource.
85
98
  # @macro [new] collection
86
99
  # @param [Symbol] resource_name the name of the collection, pluralized
87
100
  # @param [Class] model and optional class name if the class name does not match the resource_name
88
- # @return [Collection]
101
+ # @return [Collection]
89
102
  # the $1 collection
90
103
  # @scope instance
91
104
  def collection(resource_name, model = nil)
@@ -94,29 +107,29 @@ module SurveyGizmo
94
107
  def #{resource_name}
95
108
  @#{resource_name} ||= []
96
109
  end
97
-
110
+
98
111
  def #{resource_name}=(array)
99
112
  @#{resource_name} = SurveyGizmo::Collection.new(#{self}, :#{resource_name}, array)
100
113
  end
101
114
  EOS
102
115
  end
103
-
116
+
104
117
  # @api private
105
118
  def collections
106
119
  @collections.dup.freeze
107
120
  end
108
-
121
+
109
122
  # @api private
110
123
  def handle_route(key, *interp)
111
124
  path = @paths[key]
112
125
  raise "No routes defined for `#{key}` in #{self.name}" unless path
113
126
  options = interp.last.is_a?(Hash) ? interp.pop : path.scan(/:(\w+)/).inject({}){|hash, k| hash.merge(k.to_sym => interp.shift) }
114
- path.gsub(/:(\w+)/) do |m|
127
+ path.gsub(/:(\w+)/) do |m|
115
128
  options[$1.to_sym].tap{ |result| raise(SurveyGizmo::URLError, "Missing parameters in request: `#{m}`") unless result }
116
129
  end
117
130
  end
118
131
  end
119
-
132
+
120
133
  # Updates attributes and saves this Resource instance
121
134
  #
122
135
  # @param [Hash] attributes
@@ -128,7 +141,7 @@ module SurveyGizmo
128
141
  self.attributes = attributes
129
142
  self.save
130
143
  end
131
-
144
+
132
145
  # Save the instance to Survey Gizmo
133
146
  #
134
147
  # @return [Boolean]
@@ -142,21 +155,21 @@ module SurveyGizmo
142
155
  end
143
156
  end
144
157
  end
145
-
158
+
146
159
  # fetch resource from SurveyGizmo and reload the attributes
147
160
  # @return [self, false]
148
161
  # Returns the object, if saved. Otherwise returns false.
149
162
  def reload
150
163
  handle_response SurveyGizmo.get(handle_route(:get)) do
151
- if _response.ok?
164
+ if _response.ok?
152
165
  self.attributes = _response.data
153
166
  clean!
154
167
  else
155
168
  false
156
169
  end
157
- end
170
+ end
158
171
  end
159
-
172
+
160
173
  # Deleted the Resource from Survey Gizmo
161
174
  # @return [Boolean]
162
175
  def destroy
@@ -165,13 +178,13 @@ module SurveyGizmo
165
178
  _response.ok? ? destroyed! : false
166
179
  end
167
180
  end
168
-
181
+
169
182
  # The state of the current Resource
170
183
  # @api private
171
184
  def new?
172
185
  @_state.nil?
173
186
  end
174
-
187
+
175
188
  # @todo This seemed like a good way to prevent accidently trying to perform an action
176
189
  # on a record at a point when it would fail. Not sure if it's really necessary though.
177
190
  [:clean, # stored and not dirty
@@ -184,84 +197,135 @@ module SurveyGizmo
184
197
  @_state = state
185
198
  true
186
199
  end
187
-
200
+
188
201
  # Inquire about the method state if $1
189
202
  define_method("#{state}?") do
190
203
  @_state == state
191
204
  end
192
-
205
+
193
206
  private "#{state}!"
194
207
  end
195
-
208
+
196
209
  # Sets the hash that will be used to interpolate values in routes. It needs to be defined per model.
197
210
  # @return [Hash] a hash of the values needed in routing
198
211
  def to_param_options
199
212
  raise "Define #to_param_options in #{self.class.name}"
200
213
  end
201
-
214
+
202
215
  # Any errors returned by Survey Gizmo
203
216
  # @return [Array]
204
217
  def errors
205
218
  @errors ||= []
206
219
  end
207
220
 
221
+ # @return [Hash] The raw JSON returned by Survey Gizmo
222
+ def raw_response
223
+ _response.response if _response
224
+ end
225
+
208
226
  # @visibility private
209
227
  def inspect
210
228
  attrs = self.class.attributes.map do |attrib|
211
229
  value = attrib.get!(self).inspect
212
230
 
213
- "#{attrib.instance_variable_name}=#{value}"
231
+ "#{attrib.instance_variable_name}=#{value}" if attrib.respond_to?(:instance_variable_name)
214
232
  end
215
233
 
216
234
  "#<#{self.class.name}:#{self.object_id} #{attrs.join(' ')}>"
217
235
  end
218
-
236
+
219
237
  # This class normalizes the response returned by Survey Gizmo
220
238
  class Response
221
239
  def ok?
222
240
  @response['result_ok']
223
241
  end
224
-
242
+
225
243
  # The parsed JSON data of the response
226
244
  def data
227
245
  @_data ||= (@response['data'] || {})
228
246
  end
229
-
247
+
230
248
  # The error message if there is one
231
249
  def message
232
250
  @_message ||= @response['message']
233
251
  end
234
252
 
253
+ attr_reader :response
254
+
235
255
  private
256
+ def cleanup_attribute_name(attr)
257
+ attr.downcase.gsub(/[^[:alnum:]]+/,'_').gsub(/(url|variable|standard|shown)/,'').gsub(/_+/,'_').gsub(/^_/,'').gsub(/_$/,'')
258
+ end
259
+
260
+ def find_attribute_parent(attr)
261
+ case attr.downcase
262
+ when /url/
263
+ "url"
264
+ when /variable.*standard/
265
+ "meta"
266
+ when /variable.*shown/
267
+ "shown"
268
+ when /variable/
269
+ "variable"
270
+ when /question/
271
+ "answers"
272
+ end
273
+ end
274
+
236
275
  def initialize(response)
237
276
  @response = response.parsed_response
277
+ return unless @response['data'].class == Hash
278
+ @_data = @response['data']
279
+
280
+ # 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]
296
+ end
297
+
298
+ @_data.delete(key)
299
+ end
238
300
  end
239
301
  end
240
302
 
241
- protected
242
303
 
304
+ protected
305
+
243
306
  def attributes_without_blanks
244
307
  self.attributes.reject{|k,v| v.blank? }
245
308
  end
246
-
309
+
247
310
  private
311
+ # The response object from SurveyGizmo. Useful for viewing the raw data returned
248
312
  attr_reader :_response
249
-
313
+
250
314
  def set_response(http)
251
315
  @_response = Response.new(http)
252
316
  end
253
-
317
+
254
318
  def handle_route(key)
255
319
  self.class.handle_route(key, to_param_options)
256
320
  end
257
-
321
+
258
322
  def handle_response(resp, &block)
259
323
  set_response(resp)
260
324
  (self.errors << _response.message) unless _response.ok?
261
325
  self.errors.clear if !self.errors.empty? && _response.ok?
262
326
  instance_eval(&block)
263
327
  end
264
-
328
+
265
329
  def _create(attributes = {})
266
330
  http = SurveyGizmo.put(handle_route(:create), :query => self.attributes_without_blanks)
267
331
  handle_response http do
@@ -270,9 +334,9 @@ module SurveyGizmo
270
334
  saved!
271
335
  else
272
336
  false
273
- end
337
+ end
274
338
  end
275
339
  end
276
-
340
+
277
341
  end
278
342
  end
@@ -10,24 +10,28 @@ require "survey_gizmo/resource"
10
10
  require "survey_gizmo/collection"
11
11
 
12
12
  require "survey_gizmo/api/survey"
13
+ require "survey_gizmo/api/survey_campaign"
13
14
  require "survey_gizmo/api/question"
14
15
  require "survey_gizmo/api/option"
15
16
  require "survey_gizmo/api/page"
17
+ require "survey_gizmo/api/contact"
16
18
  require "survey_gizmo/api/response"
19
+ require "survey_gizmo/api/email_message"
17
20
 
18
21
  module SurveyGizmo
19
22
  include HTTParty
20
-
23
+ debug_output $stderr if ENV['GIZMO_DEBUG']
24
+
21
25
  format :json
22
-
26
+
23
27
  URLError = Class.new(RuntimeError)
24
-
28
+
25
29
  # The base uri for this version of the API is $1
26
- base_uri 'https://restapi.surveygizmo.com/v1'
27
-
30
+ base_uri 'https://restapi.surveygizmo.com/v3'
31
+
28
32
  @@options = {}
29
33
  mattr_accessor :options
30
-
34
+
31
35
  # Setup the account credentials to access the API
32
36
  # @param [Hash] opts
33
37
  # @option opts [#to_s] :user
@@ -38,5 +42,5 @@ module SurveyGizmo
38
42
  self.options = opts
39
43
  default_params({"user:pass" => opts.values_at(:user, :password).join(':')})
40
44
  end
41
-
45
+
42
46
  end
@@ -47,7 +47,7 @@ describe "Survey Gizmo Resource" do
47
47
  end
48
48
 
49
49
  describe SurveyGizmo::API::Survey do
50
- let(:create_attributes){ {:title => 'Spec', :type => 'survey', :status => 'In Design'} }
50
+ let(:create_attributes){ {:title => 'Spec', :_type => 'survey', :status => 'In Design'} }
51
51
  let(:get_attributes) { create_attributes.merge(:id => 1234) }
52
52
  let(:update_attributes){ {:title => 'Updated'} }
53
53
  let(:first_params){ {:id => 1234} }
data/spec/spec_helper.rb CHANGED
@@ -14,7 +14,7 @@ RSpec.configure do |config|
14
14
  config.include SurveyGizmoSpec::Methods
15
15
 
16
16
  config.before(:each) do
17
- @base = 'https://restapi.surveygizmo.com/v1'
17
+ @base = 'https://restapi.surveygizmo.com/v3'
18
18
  end
19
19
 
20
20
  config.after(:suite) do
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe "SurveyGizmo" do
4
4
  it "should have a base uri" do
5
- SurveyGizmo.base_uri.should == 'https://restapi.surveygizmo.com/v1'
5
+ SurveyGizmo.base_uri.should == 'https://restapi.surveygizmo.com/v3'
6
6
  end
7
7
 
8
8
  it "should allow basic authentication configuration" do
@@ -89,17 +89,18 @@ describe "SurveyGizmo" do
89
89
  end
90
90
 
91
91
  it "can handle nested collections" do
92
+ pending("Needs to be changed to work with suite. Right now it only passes in isolation.")
92
93
  SurveyGizmoSpec::ResourceTest.collection :generic_resources
93
- @array2 = [
94
+ @generic_resource_list = [
94
95
  {:id => 1, :title => 'Generic Test 5'},
95
96
  {:id => 2, :title => 'Generic Test 6'},
96
97
  {:id => 3, :title => 'Generic Test 7'}
97
98
  ]
98
99
 
99
- @array << {:id => 99, :generic_resources => @array2}
100
+ @array << {:id => 99, :generic_resources => @generic_resource_list}
100
101
  obj = described_class.new(:id => 1, :resources => @array)
101
102
  obj.resources.first.should be_instance_of(SurveyGizmoSpec::ResourceTest)
102
- obj.resources.last.generic_resources.first.should be_instance_of(SurveyGizmoSpec::GenericResource)
103
+ obj.resources.detect{|r| r.id == 99 }.generic_resources.first.should be_instance_of(SurveyGizmoSpec::GenericResource)
103
104
  end
104
105
  end
105
106
  end
metadata CHANGED
@@ -1,30 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: survey-gizmo-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.9.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Kabari Hendrick
9
+ - Chris Horn
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2012-08-22 00:00:00.000000000 Z
13
+ date: 2012-10-09 00:00:00.000000000Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: activesupport
16
- requirement: &70264289751960 !ruby/object:Gem::Requirement
17
+ requirement: &70327435758280 !ruby/object:Gem::Requirement
17
18
  none: false
18
19
  requirements:
19
- - - ! '>='
20
+ - - ~>
20
21
  - !ruby/object:Gem::Version
21
- version: 3.0.1
22
+ version: '3.0'
22
23
  type: :runtime
23
24
  prerelease: false
24
- version_requirements: *70264289751960
25
+ version_requirements: *70327435758280
25
26
  - !ruby/object:Gem::Dependency
26
27
  name: i18n
27
- requirement: &70264289751200 !ruby/object:Gem::Requirement
28
+ requirement: &70327435756840 !ruby/object:Gem::Requirement
28
29
  none: false
29
30
  requirements:
30
31
  - - ! '>='
@@ -32,21 +33,21 @@ dependencies:
32
33
  version: '0'
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *70264289751200
36
+ version_requirements: *70327435756840
36
37
  - !ruby/object:Gem::Dependency
37
38
  name: virtus
38
- requirement: &70264289750360 !ruby/object:Gem::Requirement
39
+ requirement: &70327435748540 !ruby/object:Gem::Requirement
39
40
  none: false
40
41
  requirements:
41
- - - ~>
42
+ - - ! '>='
42
43
  - !ruby/object:Gem::Version
43
- version: 0.0.5
44
+ version: '0'
44
45
  type: :runtime
45
46
  prerelease: false
46
- version_requirements: *70264289750360
47
+ version_requirements: *70327435748540
47
48
  - !ruby/object:Gem::Dependency
48
49
  name: httparty
49
- requirement: &70264289749540 !ruby/object:Gem::Requirement
50
+ requirement: &70327435746040 !ruby/object:Gem::Requirement
50
51
  none: false
51
52
  requirements:
52
53
  - - ! '>='
@@ -54,10 +55,21 @@ dependencies:
54
55
  version: '0'
55
56
  type: :runtime
56
57
  prerelease: false
57
- version_requirements: *70264289749540
58
+ version_requirements: *70327435746040
59
+ - !ruby/object:Gem::Dependency
60
+ name: addressable
61
+ requirement: &70327435744300 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: *70327435744300
58
70
  - !ruby/object:Gem::Dependency
59
71
  name: bluecloth
60
- requirement: &70264289725700 !ruby/object:Gem::Requirement
72
+ requirement: &70327435742600 !ruby/object:Gem::Requirement
61
73
  none: false
62
74
  requirements:
63
75
  - - ! '>='
@@ -65,10 +77,10 @@ dependencies:
65
77
  version: '0'
66
78
  type: :development
67
79
  prerelease: false
68
- version_requirements: *70264289725700
80
+ version_requirements: *70327435742600
69
81
  - !ruby/object:Gem::Dependency
70
82
  name: yard
71
- requirement: &70264289724740 !ruby/object:Gem::Requirement
83
+ requirement: &70327435741380 !ruby/object:Gem::Requirement
72
84
  none: false
73
85
  requirements:
74
86
  - - ~>
@@ -76,10 +88,10 @@ dependencies:
76
88
  version: 0.7.0
77
89
  type: :development
78
90
  prerelease: false
79
- version_requirements: *70264289724740
91
+ version_requirements: *70327435741380
80
92
  - !ruby/object:Gem::Dependency
81
93
  name: bundler
82
- requirement: &70264289724080 !ruby/object:Gem::Requirement
94
+ requirement: &70327435729640 !ruby/object:Gem::Requirement
83
95
  none: false
84
96
  requirements:
85
97
  - - ~>
@@ -87,10 +99,10 @@ dependencies:
87
99
  version: '1.0'
88
100
  type: :development
89
101
  prerelease: false
90
- version_requirements: *70264289724080
102
+ version_requirements: *70327435729640
91
103
  - !ruby/object:Gem::Dependency
92
104
  name: jeweler
93
- requirement: &70264289723040 !ruby/object:Gem::Requirement
105
+ requirement: &70327435724260 !ruby/object:Gem::Requirement
94
106
  none: false
95
107
  requirements:
96
108
  - - ~>
@@ -98,8 +110,19 @@ dependencies:
98
110
  version: 1.6.4
99
111
  type: :development
100
112
  prerelease: false
101
- version_requirements: *70264289723040
102
- description: ''
113
+ version_requirements: *70327435724260
114
+ - !ruby/object:Gem::Dependency
115
+ name: awesome_print
116
+ requirement: &70327435712160 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *70327435712160
125
+ description: gem to use the SurveyGizmo.com REST API, v3+
103
126
  email: self@ripthejacker.com
104
127
  executables: []
105
128
  extensions: []
@@ -114,11 +137,14 @@ files:
114
137
  - Rakefile
115
138
  - VERSION
116
139
  - lib/survey-gizmo-ruby.rb
140
+ - lib/survey_gizmo/api/contact.rb
141
+ - lib/survey_gizmo/api/email_message.rb
117
142
  - lib/survey_gizmo/api/option.rb
118
143
  - lib/survey_gizmo/api/page.rb
119
144
  - lib/survey_gizmo/api/question.rb
120
145
  - lib/survey_gizmo/api/response.rb
121
146
  - lib/survey_gizmo/api/survey.rb
147
+ - lib/survey_gizmo/api/survey_campaign.rb
122
148
  - lib/survey_gizmo/collection.rb
123
149
  - lib/survey_gizmo/resource.rb
124
150
  - lib/survey_gizmo/survey_gizmo.rb
@@ -148,7 +174,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
148
174
  version: '0'
149
175
  segments:
150
176
  - 0
151
- hash: -1188549938639229754
177
+ hash: 1680038984146331974
152
178
  required_rubygems_version: !ruby/object:Gem::Requirement
153
179
  none: false
154
180
  requirements:
@@ -157,8 +183,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
183
  version: '0'
158
184
  requirements: []
159
185
  rubyforge_project:
160
- rubygems_version: 1.8.10
186
+ rubygems_version: 1.8.8
161
187
  signing_key:
162
188
  specification_version: 3
163
- summary: gem to consume the Survey Gizmo API
189
+ summary: gem to use the Survey Gizmo REST API
164
190
  test_files: []