class VersionOne::Query

Constants

REQUIRED_FIELDS

Public Class Methods

issues() click to toggle source
# File lib/version-one/query.rb, line 49
def self.issues
  Query.new 'Issue'
end
new(_asset_type, _client=nil) click to toggle source
# File lib/version-one/query.rb, line 6
def initialize(_asset_type, _client=nil)
  @asset_type = _asset_type
  @select = []
  @filter = []
  @order = []
  @cache = nil
  @asof = nil
  @limit = nil
  @offset = nil
  @client = VersionOne::Client.new
end
primary_work_items() click to toggle source
# File lib/version-one/query.rb, line 33
def self.primary_work_items
  Query.new 'PrimaryWorkitem'
end
projects() click to toggle source
# File lib/version-one/query.rb, line 41
def self.projects
  Query.new 'Scope'
end
requests() click to toggle source
# File lib/version-one/query.rb, line 53
def self.requests
  Query.new 'Request'
end
sprints() click to toggle source
# File lib/version-one/query.rb, line 45
def self.sprints
  Query.new 'Timebox'
end
stories() click to toggle source
# File lib/version-one/query.rb, line 37
def self.stories
  Query.new 'Story'
end

Public Instance Methods

active() click to toggle source
# File lib/version-one/query.rb, line 142
def active
  where('IsInactive' => 'false')
end
all() click to toggle source
# File lib/version-one/query.rb, line 170
def all
  find(nil)
end
asof(date) click to toggle source
# File lib/version-one/query.rb, line 160
def asof(date)
  dup do
    @asof = date
  end
end
cache(key, options={}) click to toggle source
# File lib/version-one/query.rb, line 174
def cache(key, options={})
  dup do
    options[:namespace] ||= 'VersionOne'
    @cache = {
        :key => key,
        :options => options
    }
  end
end
dup(&block) click to toggle source
# File lib/version-one/query.rb, line 18
def dup(&block)
  q = Query.new(@asset_type)

  [:@select, :@filter, :@order, :@asof, :@limit, :@offset, :@cache, :@client].each do |sym|
    val = instance_variable_get(sym)
    unless val.nil?
      val = val.dup if val.is_a? Array
      q.instance_variable_set(sym,  val)
    end
  end

  q.instance_eval(&block)
  q
end
each(&block) click to toggle source
# File lib/version-one/query.rb, line 188
def each(&block)
  to_a.each(&block)
end
find(what) click to toggle source
# File lib/version-one/query.rb, line 69
def find(what)
  url = to_url(what)
  find_by_url(url)
end
find_by_url(url) click to toggle source
# File lib/version-one/query.rb, line 57
def find_by_url(url)
  xml = @client.get(url, cache: @cache)

  if xml.name == 'Error'
    msg = 'VersionOne Error: %s (%s)' % [xml.find_first('Message').content, xml.attributes['href']]
    raise msg
  else
    VersionOne::Asset.from_xml(xml)
  end

end
first() click to toggle source
# File lib/version-one/query.rb, line 166
def first
  limit(1).all.first
end
for_project_and_children(project) click to toggle source
# File lib/version-one/query.rb, line 128
def for_project_and_children(project)
  project_id = case project
                 when Asset
                   project.id
                 when Integer
                   "Scope:#{project}"
                 when /^(Scope:)?(\d+)(:\d+)?$/
                   ($1 || 'Scope:') + $2
                 else
                   raise ArgumentError, 'Invalid project argument'
               end
  where('Scope.ParentMeAndUp' => project_id)
end
limit(size) click to toggle source
# File lib/version-one/query.rb, line 156
def limit(size)
  dup { @limit = size }
end
offset(index) click to toggle source
# File lib/version-one/query.rb, line 152
def offset(index)
  dup { @offset = index }
end
order(attrib, dir=:asc) click to toggle source
# File lib/version-one/query.rb, line 146
def order(attrib, dir=:asc)
  raise ArgumentError unless attrib.is_a? String
  attrib = '-' + attrib if dir == :desc
  dup { @order << attrib }
end
select(*fields) click to toggle source
# File lib/version-one/query.rb, line 108
def select(*fields)
  dup do
    @select = @select + fields
  end
end
to_a() click to toggle source
# File lib/version-one/query.rb, line 184
def to_a
  all
end
to_url(what=nil) click to toggle source
# File lib/version-one/query.rb, line 74
def to_url(what=nil)
  what = what.id.to_s if what.is_a?(Asset)

  what = case what
           when NilClass
             what
           when Integer
             what.to_s
           when /^[A-Z]+((?::\d+)+)$/i
             $1.gsub(':', '/')
           else
             :bad
         end

  raise ArgumentError, 'Invalid parameter type' if what == :bad

  url = ['rest-1.v1/Data', @asset_type, what].compact.join('/')

  query = [
      select_query,
      filter_query,
      page_query,
      order_query,
      asof_query
  ].compact.join('&')

  if query && !query.empty?
    url << '?'
    url << query
  end

  url
end
where(criteria) click to toggle source
# File lib/version-one/query.rb, line 114
def where(criteria)
  criteria = case criteria
              when String
                [criteria]
              when Hash
                criteria.map{|k,v| "#{k}='#{v.to_s}'"}
              else
                raise ArgumentError
  end
  dup do
    @filter.concat criteria
  end
end

Private Instance Methods

asof_query() click to toggle source
# File lib/version-one/query.rb, line 257
def asof_query
  if @asof.nil?
    nil
  else
    'asof=' + @asof.xmlschema
  end
end
filter_query() click to toggle source
# File lib/version-one/query.rb, line 233
def filter_query
  if @filter.empty?
    nil
  else
    'where=' + uri_escape(@filter.collect{|s| "(#{s})"}.join(';'))
  end
end
order_query() click to toggle source
# File lib/version-one/query.rb, line 249
def order_query
  if @order.empty?
    nil
  else
    'sort=' + uri_escape(@order.join(','))
  end
end
page_query() click to toggle source
# File lib/version-one/query.rb, line 241
def page_query
  if @limit
    "page=#{@limit},#{@offset || 0}"
  else
    nil
  end
end
select_query() click to toggle source

def http_get(uri)

xml = nil

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request_path = uri.path
request_path += '?' + uri.query unless uri.query.blank?
Rails.logger.debug("Uri path = #{request_path}")

http.start do
  request = Net::HTTP::Get.new(request_path)
  request.basic_auth(VersionOne.user, VersionOne.password)
  response = http.request(request)

  xml = response.body
  Rails.logger.debug(xml)
end

xml

end

def cache_store

Rails.cache

end

def can_cache?

@cache && cache_store

end

# File lib/version-one/query.rb, line 224
def select_query
  if @select.empty?
    nil
  else
    REQUIRED_FIELDS.each {|f| @select << f unless @select.include?(f) }
    'sel=' + uri_escape(@select.join(','))
  end
end
uri_escape(s) click to toggle source
# File lib/version-one/query.rb, line 265
def uri_escape(s)
  @uri_parser ||= URI::Parser.new
  @uri_parser.escape(s, /[^A-za-z0-9\-()']/)
end