zendesk_api 0.1.11 → 0.2.1

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.
Files changed (153) hide show
  1. data/.gitignore +3 -0
  2. data/.travis.yml +1 -3
  3. data/Gemfile +24 -0
  4. data/Gemfile.lock +75 -10
  5. data/Procfile +1 -0
  6. data/Rakefile +10 -3
  7. data/Readme.md +65 -0
  8. data/bin/zendesk +26 -0
  9. data/config.ru +6 -0
  10. data/config/mongoid.yml +81 -0
  11. data/lib/zendesk_api/actions.rb +2 -2
  12. data/lib/zendesk_api/collection.rb +15 -4
  13. data/lib/zendesk_api/console/base.rb +12 -0
  14. data/lib/zendesk_api/console/console.rb +144 -0
  15. data/lib/zendesk_api/console/extensions.rb +183 -0
  16. data/lib/zendesk_api/console/options.rb +41 -0
  17. data/lib/zendesk_api/resource.rb +12 -1
  18. data/lib/zendesk_api/resources.rb +28 -8
  19. data/lib/zendesk_api/server/base.rb +119 -0
  20. data/lib/zendesk_api/server/docs/account_settings.md +145 -0
  21. data/lib/zendesk_api/server/docs/activity_stream.md +121 -0
  22. data/lib/zendesk_api/server/docs/attachments.md +73 -0
  23. data/lib/zendesk_api/server/docs/autocomplete.md +29 -0
  24. data/lib/zendesk_api/server/docs/categories.md +193 -0
  25. data/lib/zendesk_api/server/docs/custom_roles.md +88 -0
  26. data/lib/zendesk_api/server/docs/forum_subscriptions.md +139 -0
  27. data/lib/zendesk_api/server/docs/forums.md +229 -0
  28. data/lib/zendesk_api/server/docs/group_memberships.md +229 -0
  29. data/lib/zendesk_api/server/docs/groups.md +212 -0
  30. data/lib/zendesk_api/server/docs/introduction.md +159 -0
  31. data/lib/zendesk_api/server/docs/job_statuses.md +86 -0
  32. data/lib/zendesk_api/server/docs/locales.md +124 -0
  33. data/lib/zendesk_api/server/docs/macros.md +287 -0
  34. data/lib/zendesk_api/server/docs/organizations.md +253 -0
  35. data/lib/zendesk_api/server/docs/problems.md +117 -0
  36. data/lib/zendesk_api/server/docs/requests.md +256 -0
  37. data/lib/zendesk_api/server/docs/satisfaction_ratings.md +136 -0
  38. data/lib/zendesk_api/server/docs/search.md +106 -0
  39. data/lib/zendesk_api/server/docs/sharing_agreements.md +57 -0
  40. data/lib/zendesk_api/server/docs/side_loading.md +125 -0
  41. data/lib/zendesk_api/server/docs/suspended_tickets.md +182 -0
  42. data/lib/zendesk_api/server/docs/tags.md +36 -0
  43. data/lib/zendesk_api/server/docs/ticket_audits.md +657 -0
  44. data/lib/zendesk_api/server/docs/ticket_export.md +121 -0
  45. data/lib/zendesk_api/server/docs/ticket_fields.md +277 -0
  46. data/lib/zendesk_api/server/docs/ticket_import.md +65 -0
  47. data/lib/zendesk_api/server/docs/ticket_metrics.md +125 -0
  48. data/lib/zendesk_api/server/docs/tickets.md +622 -0
  49. data/lib/zendesk_api/server/docs/topic_comments.md +221 -0
  50. data/lib/zendesk_api/server/docs/topic_subscriptions.md +140 -0
  51. data/lib/zendesk_api/server/docs/topic_votes.md +154 -0
  52. data/lib/zendesk_api/server/docs/topics.md +335 -0
  53. data/lib/zendesk_api/server/docs/triggers.md +199 -0
  54. data/lib/zendesk_api/server/docs/user_identities.md +279 -0
  55. data/lib/zendesk_api/server/docs/users.md +400 -0
  56. data/lib/zendesk_api/server/docs/views.md +505 -0
  57. data/lib/zendesk_api/server/helper.rb +104 -0
  58. data/lib/zendesk_api/server/html_renderer.rb +98 -0
  59. data/lib/zendesk_api/server/models/user_request.rb +16 -0
  60. data/lib/zendesk_api/server/models/zlib_json.rb +13 -0
  61. data/lib/zendesk_api/server/public/config.rb +26 -0
  62. data/lib/zendesk_api/server/public/favicon.ico +0 -0
  63. data/lib/zendesk_api/server/public/images/glyphicons-halflings-white.png +0 -0
  64. data/lib/zendesk_api/server/public/images/glyphicons-halflings.png +0 -0
  65. data/lib/zendesk_api/server/public/images/spinner.gif +0 -0
  66. data/lib/zendesk_api/server/public/images/zendesk_developers_bg.png +0 -0
  67. data/lib/zendesk_api/server/public/images/zendesk_developers_header.png +0 -0
  68. data/lib/zendesk_api/server/public/javascripts/application.js +186 -0
  69. data/lib/zendesk_api/server/public/javascripts/bootstrap-alert.js +90 -0
  70. data/lib/zendesk_api/server/public/javascripts/bootstrap-button.js +96 -0
  71. data/lib/zendesk_api/server/public/javascripts/bootstrap-carousel.js +169 -0
  72. data/lib/zendesk_api/server/public/javascripts/bootstrap-collapse.js +157 -0
  73. data/lib/zendesk_api/server/public/javascripts/bootstrap-dropdown.js +100 -0
  74. data/lib/zendesk_api/server/public/javascripts/bootstrap-modal.js +218 -0
  75. data/lib/zendesk_api/server/public/javascripts/bootstrap-popover.js +98 -0
  76. data/lib/zendesk_api/server/public/javascripts/bootstrap-scrollspy.js +151 -0
  77. data/lib/zendesk_api/server/public/javascripts/bootstrap-tab.js +135 -0
  78. data/lib/zendesk_api/server/public/javascripts/bootstrap-tooltip.js +275 -0
  79. data/lib/zendesk_api/server/public/javascripts/bootstrap-transition.js +61 -0
  80. data/lib/zendesk_api/server/public/javascripts/bootstrap-typeahead.js +285 -0
  81. data/lib/zendesk_api/server/public/sass/screen.scss +102 -0
  82. data/lib/zendesk_api/server/public/sass/styles.scss +5 -0
  83. data/lib/zendesk_api/server/public/stylesheets/developer.screen.css +836 -0
  84. data/lib/zendesk_api/server/public/stylesheets/screen.css +129 -0
  85. data/lib/zendesk_api/server/public/stylesheets/styles.css +6208 -0
  86. data/lib/zendesk_api/server/templates/footer.haml +13 -0
  87. data/lib/zendesk_api/server/templates/header.haml +20 -0
  88. data/lib/zendesk_api/server/templates/index.haml +68 -0
  89. data/lib/zendesk_api/server/templates/layout.haml +44 -0
  90. data/lib/zendesk_api/server/templates/param.haml +4 -0
  91. data/lib/zendesk_api/server/templates/search.haml +23 -0
  92. data/lib/zendesk_api/server/templates/sidebar.haml +7 -0
  93. data/lib/zendesk_api/version.rb +1 -1
  94. data/spec/{association_spec.rb → core/association_spec.rb} +1 -1
  95. data/spec/{client_spec.rb → core/client_spec.rb} +1 -1
  96. data/spec/{collection_spec.rb → core/collection_spec.rb} +1 -1
  97. data/spec/{configuration_spec.rb → core/configuration_spec.rb} +1 -1
  98. data/spec/{create_resource_spec.rb → core/create_resource_spec.rb} +1 -1
  99. data/spec/{data_resource_spec.rb → core/data_resource_spec.rb} +1 -1
  100. data/spec/{inflection_spec.rb → core/inflection_spec.rb} +1 -1
  101. data/spec/{lru_cache_spec.rb → core/lru_cache_spec.rb} +1 -1
  102. data/spec/{middleware → core/middleware}/request/etag_cache_spec.rb +1 -1
  103. data/spec/{middleware → core/middleware}/request/retry_spec.rb +1 -1
  104. data/spec/{middleware → core/middleware}/request/test.jpg +0 -0
  105. data/spec/{middleware → core/middleware}/request/upload_spec.rb +1 -1
  106. data/spec/{middleware → core/middleware}/response/callback_spec.rb +1 -1
  107. data/spec/{middleware → core/middleware}/response/deflate_spec.rb +1 -1
  108. data/spec/{middleware → core/middleware}/response/gzip_spec.rb +1 -1
  109. data/spec/{middleware → core/middleware}/response/parse_iso_dates_spec.rb +1 -1
  110. data/spec/{read_resource_spec.rb → core/read_resource_spec.rb} +1 -1
  111. data/spec/{rescue_spec.rb → core/rescue_spec.rb} +1 -1
  112. data/spec/{resource_spec.rb → core/resource_spec.rb} +1 -1
  113. data/spec/{search_spec.rb → core/search_spec.rb} +1 -1
  114. data/spec/{spec_helper.rb → core/spec_helper.rb} +5 -5
  115. data/spec/{trackie_spec.rb → core/trackie_spec.rb} +1 -1
  116. data/{live → spec/live}/Readme.md +0 -0
  117. data/{live → spec/live}/activity_spec.rb +1 -1
  118. data/{live → spec/live}/audit_spec.rb +1 -1
  119. data/{live → spec/live}/bookmark_spec.rb +1 -1
  120. data/{live → spec/live}/category_spec.rb +1 -1
  121. data/{live → spec/live}/collection_spec.rb +1 -1
  122. data/{live → spec/live}/crm_spec.rb +1 -1
  123. data/{live → spec/live}/custom_role_spec.rb +1 -1
  124. data/{live → spec/live}/forum_spec.rb +1 -1
  125. data/{live → spec/live}/forum_subscription_spec.rb +1 -1
  126. data/{live → spec/live}/group_membership_spec.rb +1 -1
  127. data/{live → spec/live}/group_spec.rb +1 -1
  128. data/{live → spec/live}/identity_spec.rb +1 -1
  129. data/{live → spec/live}/locale_spec.rb +1 -1
  130. data/{live → spec/live}/macro_spec.rb +1 -1
  131. data/{live → spec/live}/mobile_device_spec.rb +1 -1
  132. data/{live → spec/live}/organization_spec.rb +1 -1
  133. data/{live → spec/live}/request_spec.rb +1 -1
  134. data/{live → spec/live}/satisfaction_rating_spec.rb +1 -1
  135. data/{live → spec/live}/setting_spec.rb +1 -1
  136. data/{live → spec/live}/suspended_ticket_spec.rb +1 -1
  137. data/{live → spec/live}/ticket_field_spec.rb +1 -1
  138. data/{live → spec/live}/ticket_metrics_spec.rb +1 -1
  139. data/{live → spec/live}/ticket_spec.rb +1 -1
  140. data/spec/live/topic_comment_spec.rb +24 -0
  141. data/{live → spec/live}/topic_spec.rb +1 -1
  142. data/{live → spec/live}/topic_subscription_spec.rb +1 -1
  143. data/{live → spec/live}/topic_vote_spec.rb +1 -1
  144. data/{live → spec/live}/upload_spec.rb +1 -1
  145. data/{live → spec/live}/user_spec.rb +1 -1
  146. data/{live → spec/live}/view_spec.rb +1 -1
  147. data/spec/macros/resource_macros.rb +1 -1
  148. data/spec/server/app_spec.rb +140 -0
  149. data/spec/server/helper_spec.rb +97 -0
  150. data/spec/server/html_renderer_spec.rb +130 -0
  151. data/spec/server/spec_helper.rb +43 -0
  152. metadata +198 -77
  153. data/live/topic_comment_spec.rb +0 -13
@@ -0,0 +1,104 @@
1
+ module ZendeskAPI::Server
2
+ module Helper
3
+ def full_url
4
+ [params["url"], @path].compact.join("/")
5
+ end
6
+
7
+ def coerce_path(path)
8
+ if path =~ %r{(https?://)?(\w+)(\.zendesk\.com)?(/api/v2)?/(.*)}
9
+ if $1 == "http://"
10
+ @error = "Please enter a valid https URL"
11
+ path
12
+ elsif !$2 || $2.empty?
13
+ @error = "Please enter a valid subdomain"
14
+ path
15
+ else
16
+ params["url"] = "https://#{$2}.zendesk.com/api/v2"
17
+ $5
18
+ end
19
+ else
20
+ @error = "Please enter a valid URL"
21
+ path
22
+ end
23
+ end
24
+
25
+ def execute_request
26
+ unless @method && client.connection.respond_to?(@method)
27
+ @error = "The input you entered was invalid"
28
+ return
29
+ end
30
+
31
+ begin
32
+ response = client.connection.send(@method, @path) do |request|
33
+ request.params = @url_params.inject({}) do |accum, h|
34
+ accum.merge(h["name"] => h["value"])
35
+ end
36
+
37
+ if @method != :get && @json && !@json.empty?
38
+ request.body = JSON.parse(@json)
39
+ end
40
+
41
+ set_request(request.to_env(client.connection))
42
+ end
43
+ rescue Faraday::Error::ConnectionFailed => e
44
+ @error = "The connection failed"
45
+ rescue Faraday::Error::ClientError => e
46
+ set_response(e.response) if e.response
47
+ rescue JSON::ParserError
48
+ @error = "The JSON you attempted to send was invalid"
49
+ rescue URI::InvalidURIError, ArgumentError
50
+ @error = "Please enter a valid URL"
51
+ else
52
+ set_response(:body => response.body,
53
+ :headers => response.env[:response_headers],
54
+ :status => response.env[:status])
55
+ end
56
+ end
57
+
58
+ def map_headers(headers)
59
+ headers.map do |k,v|
60
+ name = k.split("-").map(&:capitalize).join("-")
61
+ "#{name}: #{v}"
62
+ end.join("\n")
63
+ end
64
+
65
+ def set_request(request)
66
+ @html_request = <<-END
67
+ HTTP/1.1 #{@method.to_s.upcase} #{request[:url]}
68
+ #{map_headers(request[:request_headers])}
69
+ END
70
+
71
+ request_headers = request[:request_headers].dup
72
+ request_headers.delete("Authorization")
73
+
74
+ @user_request_hash = { :url => request[:url].to_s, :request_headers => request_headers }
75
+
76
+ if @method != :get && @json && !@json.empty?
77
+ parsed_json = CodeRay.scan(@json, :json).span
78
+ @html_request << "\n\n#{parsed_json}"
79
+ end
80
+ end
81
+
82
+ def set_response(response)
83
+ @html_response =<<-END
84
+ HTTP/1.1 #{response[:status]}
85
+ #{map_headers(response[:headers])}
86
+
87
+
88
+ #{CodeRay.scan(JSON.pretty_generate(response[:body]), :json).span}
89
+ END
90
+
91
+ @user_response_hash = { :status => response[:status], :headers => response[:headers], :body => response[:body] }
92
+ end
93
+
94
+ def client(params = params)
95
+ @client ||= ZendeskAPI::Client.new do |c|
96
+ params.each do |key, value|
97
+ c.send("#{key}=", value)
98
+ end
99
+
100
+ c.allow_http = App.development?
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,98 @@
1
+ # Modified from DoubleDoc
2
+ # https://github.com/staugaard/double_doc/blob/master/lib/double_doc/html_renderer.rb
3
+ module ZendeskAPI::Server
4
+ class HtmlRenderer
5
+ def self.markdown
6
+ @markdown ||= Redcarpet::Markdown.new(RedcarpetRenderer, :fenced_code_blocks => true, :no_intra_emphasis => true, :tables => true)
7
+ end
8
+
9
+ def self.render(text)
10
+ markdown.render(text)
11
+ end
12
+
13
+ def self.generate_id(text)
14
+ text.strip.downcase.gsub(/[\s,]+/, '-')
15
+ end
16
+
17
+ class RedcarpetRenderer < Redcarpet::Render::HTML
18
+ attr_reader :headers
19
+
20
+ def icons
21
+ <<-END
22
+ <i class=\"header-icon icon-plus\"></i>
23
+ <i class=\"header-icon icon-minus hide\"></i>
24
+ END
25
+ end
26
+
27
+ def header(text, level)
28
+ top_level = [2, 3].include?(level)
29
+ id = HtmlRenderer.generate_id(text)
30
+
31
+ @headers ||= []
32
+ @headers << id if top_level
33
+
34
+ "<h#{level} id=\"#{id}\">
35
+ #{icons if top_level}
36
+ #{text}
37
+ </h#{level}>"
38
+ end
39
+
40
+ def block_code(code, language)
41
+ # CodeRay doesn't know HTTP
42
+ language = "json" if language == "http"
43
+
44
+ mod = {}
45
+
46
+ json = nil
47
+
48
+ if language
49
+ if code.start_with?("curl")
50
+ if code =~ %r[(https://{subdomain}.zendesk.com/api/v2/.*.json(\?(\w+={.+})+ )?)]
51
+ example = true
52
+
53
+ mod["class"] = "example"
54
+ mod["data-url"] = $1.strip
55
+
56
+ # This grabs the -d parameter
57
+ # ...
58
+ if code.include?(" -d ")
59
+ str_begin = code.index(/['"]/, code.index(" -d "))
60
+
61
+ chars = code[str_begin..-1].chars.to_a
62
+ str_end = nil
63
+
64
+ chars[1..-1].each_with_index do |char, i|
65
+ if char == chars[0] && chars[i - 1] != "\\"
66
+ str_end = i
67
+ break
68
+ end
69
+ end
70
+
71
+ mod["data-json"] = code.slice(str_begin + 1..(str_begin + str_end)) if str_end
72
+ end
73
+
74
+ if code =~ /-X (PUT|POST|GET|DELETE)/
75
+ mod["data-method"] = $1
76
+ end
77
+ end
78
+ end
79
+
80
+ code = CodeRay.scan(code, language).html(:wrap => nil)
81
+ end
82
+
83
+ mod = mod.inject([]) {|str,(k,v)| str.push("#{k}='#{v}'")}.join(" ")
84
+
85
+ if example
86
+ <<-END
87
+ <button class="btn example" title="Fill in the form with this example">
88
+ <i class="icon icon-pencil"></i>
89
+ </button>
90
+ <pre #{mod}>#{code}</pre>
91
+ END
92
+ else
93
+ "<pre>#{code}</pre>"
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,16 @@
1
+ require 'zendesk_api/server/models/zlib_json'
2
+
3
+ module ZendeskAPI::Server
4
+ class UserRequest
5
+ include Mongoid::Document
6
+
7
+ field :method, :type => Symbol
8
+ field :url, :type => String
9
+ field :path, :type => String
10
+ field :json, :type => String
11
+ field :url_params, :type => Array
12
+
13
+ field :request, :type => ZlibJSON
14
+ field :response, :type => ZlibJSON
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ module ZendeskAPI::Server
2
+ class ZlibJSON < Hash
3
+ class << self
4
+ def demongoize(serialized_object)
5
+ JSON.parse(Zlib.inflate(serialized_object.to_s)).symbolize_keys
6
+ end
7
+
8
+ def mongoize(input_hash)
9
+ Moped::BSON::Binary.new(:generic, Zlib.deflate(input_hash.to_json))
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,26 @@
1
+ require 'bootstrap-sass'
2
+ # Require any additional compass plugins here.
3
+
4
+
5
+ # Set this to the root of your project when deployed:
6
+ http_path = "/"
7
+ css_dir = "stylesheets"
8
+ sass_dir = "sass"
9
+ images_dir = "images"
10
+ javascripts_dir = "javascripts"
11
+
12
+ # You can select your preferred output style here (can be overridden via the command line):
13
+ # output_style = :expanded or :nested or :compact or :compressed
14
+
15
+ # To enable relative paths to assets via compass helper functions. Uncomment:
16
+ # relative_assets = true
17
+
18
+ # To disable debugging comments that display the original location of your selectors. Uncomment:
19
+ # line_comments = false
20
+
21
+
22
+ # If you prefer the indented syntax, you might want to regenerate this
23
+ # project again passing --syntax sass, or you can uncomment this:
24
+ # preferred_syntax = :sass
25
+ # and then run:
26
+ # sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
@@ -0,0 +1,186 @@
1
+ function search(query) {
2
+ query = query.split("#");
3
+
4
+ $.post("/search", { query: query[0] }, function(data) {
5
+ $("#search-results").html(data);
6
+
7
+ $("#search-results h2, h3").nextUntil("h3").addClass("hide");
8
+ $("#search-results h2, h3").children("i.icon-minus").addClass("hide");
9
+ $("#search-results h2, h3").children("i.icon-plus").removeClass("hide");
10
+
11
+ if(query[1]) {
12
+ var header = $("#search-results #" + query[1]);
13
+
14
+ if(header.children("i.icon-minus").hasClass("hide"))
15
+ header.click();
16
+
17
+ // document.getElementById(query[1]).scrollIntoView(true);
18
+ }
19
+ }).error(function() {
20
+ // TODO
21
+ });
22
+ }
23
+
24
+ function toggle_json_editor() {
25
+ var method = $("#method-select option:selected").val();
26
+ $("#json").toggle(method == "POST" || method == "PUT");
27
+ }
28
+
29
+ $(document).ready(function() {
30
+ var dirty = false;
31
+
32
+ $('#search input').keyup(function() {
33
+ var value = $(this).val();
34
+ dirty = value != "";
35
+
36
+ setTimeout(function() {
37
+ if(dirty) {
38
+ dirty = false;
39
+ search($('#search input').val());
40
+ }
41
+ }, 750);
42
+ });
43
+
44
+ $('#clear-search').click(function() {
45
+ $('#search input').val("");
46
+ search("help");
47
+ });
48
+
49
+ $("#search-results h2, h3").nextUntil("h3").addClass("hide");
50
+
51
+ $("#search-results h2, h3").live("click", function() {
52
+ $(this).nextUntil("h3").toggleClass("hide");
53
+ $(this).children().toggleClass("hide");
54
+
55
+ query = $('#search input').val();
56
+ query = query.split("#");
57
+ $('#search input').val(query[0] + "#" + this.id);
58
+ });
59
+
60
+ $("#search-results a").live("click", function(event) {
61
+ event.preventDefault();
62
+
63
+ query = $(this).attr("href");
64
+ query = query.replace(/\.(html|md)/, "");
65
+
66
+ $('#search input').val(query);
67
+
68
+ search(query);
69
+ });
70
+
71
+ if(window.location.hash == "#response" || window.location.hash == "#request") {
72
+ $('#response .tab').addClass('hide');
73
+ $('#response ul.nav-pills li').removeClass('active');
74
+
75
+ var tab = window.location.hash + "-tab";
76
+ $(tab).removeClass("hide");
77
+ $(tab + "-link").parent('li').addClass('active');
78
+ } else if(window.location.hash == "#documentation") {
79
+ $('.frame.tab').addClass('hide');
80
+ $('#navigation ul.nav-pills li').removeClass('active');
81
+
82
+ $('#help-tab').removeClass('hide');
83
+ $('#help-tab-link').parent("li").addClass('active');
84
+ }
85
+
86
+ $('#response .tab-link').click(function() {
87
+ var elem = $(this);
88
+
89
+ $('#response .tab').addClass("hide");
90
+ $('#response ul.nav-pills li').removeClass('active');
91
+
92
+ $('#' + this.id.replace(/-link/, '')).removeClass("hide");
93
+ elem.parent('li').addClass('active');
94
+
95
+ event.preventDefault();
96
+ });
97
+
98
+ $('#possible-params').click(function(event) {
99
+ $(this).children('i').toggleClass('hide');
100
+ $('#possible-params-text').toggleClass('hide');
101
+
102
+ event.preventDefault();
103
+ });
104
+
105
+ $('#navigation .tab-link').click(function() {
106
+ var elem = $(this);
107
+
108
+ $('.frame.tab').addClass("hide");
109
+ $('#navigation ul.nav-pills li').removeClass('active');
110
+
111
+ $('#' + this.id.replace(/-link/, '')).removeClass("hide");
112
+ elem.parent('li').addClass('active');
113
+ });
114
+
115
+ $('#json').keydown(function() {
116
+ $('#input p.error').html('');
117
+ });
118
+
119
+ $('#json').keyup(function() {
120
+ var value = $('#json').val();
121
+
122
+ $('#json').removeClass('invalid');
123
+
124
+ if(value == '') {
125
+ $('#json').removeClass('invalid', 'valid');
126
+ return;
127
+ }
128
+
129
+ try {
130
+ JSON.parse(value);
131
+ $('#json').addClass('valid');
132
+ } catch(e) {
133
+ $('#json').addClass('invalid');
134
+ }
135
+ });
136
+
137
+ $('button.example').live("click", function() {
138
+ var element = $(this).next();
139
+
140
+ var url = element.data("url");
141
+ url = url.split("?");
142
+
143
+ $("#path").val(url[0]);
144
+
145
+ if(url[1]) {
146
+ var params = url[1].split("&");
147
+ var param, inputs;
148
+
149
+ for(var i = 0; i < params.length; i++) {
150
+ param = params[i].split("=");
151
+ $("#add-param").click();
152
+ inputs = $("#params div:last input");
153
+
154
+ if(inputs.length == 2) {
155
+ $(inputs[0]).val(param[0]);
156
+ $(inputs[1]).val(param[1]);
157
+ }
158
+ }
159
+ }
160
+
161
+
162
+ var method = element.data("method") || "GET";
163
+
164
+ $("#method-select").val(method);
165
+ $("#method-select").trigger("change");
166
+
167
+ var json = element.data("json");
168
+
169
+ if(json) {
170
+ $("#json").val(JSON.stringify(json));
171
+ } else {
172
+ $("#json").val("");
173
+ }
174
+
175
+ window.location.hash = "";
176
+ $("#throw-tab-link").click();
177
+ });
178
+
179
+ $("#method-select").change(toggle_json_editor);
180
+ toggle_json_editor();
181
+
182
+ $(".remove-param").live("click", function(event) {
183
+ event.preventDefault();
184
+ $(this).parent("div").remove();
185
+ });
186
+ });