diff options
author | Jochen Topf <jochen@topf.org> | 2013-01-02 19:33:54 +0100 |
---|---|---|
committer | Jochen Topf <jochen@topf.org> | 2013-01-02 19:33:54 +0100 |
commit | 387d3cfb7c150591f167bae16ca7f7128062aed8 (patch) | |
tree | 2695534b5ec3eb94a29d5e1fb9e2a352f9c32a80 /web/lib/api.rb | |
parent | 4ddaaeb4d6acb9d48be3ca48cc18daff7191fa8d (diff) | |
download | taginfo-387d3cfb7c150591f167bae16ca7f7128062aed8.tar taginfo-387d3cfb7c150591f167bae16ca7f7128062aed8.tar.gz |
Move paging parameter handling into new class
Diffstat (limited to 'web/lib/api.rb')
-rw-r--r-- | web/lib/api.rb | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/web/lib/api.rb b/web/lib/api.rb new file mode 100644 index 0000000..28fe786 --- /dev/null +++ b/web/lib/api.rb @@ -0,0 +1,111 @@ + +class API + + @@paths = {} + + attr_accessor :version, :path, :parameters, :paging, :filter, :sort, :result, :description, :example, :ui + + def self.paths + @@paths + end + + def initialize(version, path, doc) + @version = version + @path = path + @doc = doc + + doc.each_pair do |k,v| + instance_variable_set("@#{k}".to_sym, v) + end + + @@paths[version] = {} unless @@paths[version] + @@paths[version][path] = self + end + + def complete_path + '/api/' + version.to_s + '/' + path + end + + def show_paging + paging || 'no' + end + + def show_parameters + return '<span class="empty">none</span>' unless parameters + list = [] + parameters.keys.sort{ |a,b| a.to_s <=> b.to_s }.each do |p| + list << "<tt>#{p}</tt> — #{parameters[p]}" + end + list.join('<br/>') + end + + def show_filter + return '<span class="empty">none</span>' unless filter + list = [] + filter.keys.sort{ |a,b| a.to_s <=> b.to_s }.each do |f| + list << "<tt>#{f}</tt> — #{filter[f][:doc]}" + end + list.join('<br/>') + end + + def show_example + return '' if example.nil? + params = [] + example.each_pair do |k,v| + params << "#{k}=#{v}" + end + if params.empty? + return complete_path + else + return complete_path + '?' + params.join('&') + end + end + + def show_ui + return '' if example.nil? + ui + end + + def show_sort + return '<span class="empty">none</span>' unless sort + sort.map{ |s| "<tt>#{s}</tt>" }.join(', ') + end + + def show_result + return '<span class="empty">unknown</span>' if result.nil? + return result if result.is_a?(String) + '<pre>' + JSON.pretty_generate(result).gsub(/"(STRING|INT|FLOAT|BOOL)"/, '\1') + '</pre>' + end + +end + +class APIParameters + + attr_reader :page, :results_per_page + + def initialize(p) + if p[:rp].nil? || p[:rp] == '0' || p[:rp] == '' || p[:page].nil? || p[:page] == '0' || p[:page] == '' + @page = 0 + @results_per_page = 0 + else + if p[:rp] !~ /^[0-9]{1,3}$/ + raise ArgumentError, 'results per page must be integer between 0 and 999' + end + if p[:page] !~ /^[0-9]{1,4}$/ + raise ArgumentError, 'page must be integer between 0 and 9999' + end + @page = p[:page].to_i + @results_per_page = p[:rp].to_i + end + end + + def do_paging? + @results_per_page != 0 + end + + def first_result + @results_per_page * (@page - 1) + end + +end + |