Completed
Push — master ( 788bd2...10ae0b )
by John
53s
created

Client.getUrlForAssets()   A

Complexity

Conditions 4

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 4
dl 0
loc 10
rs 9.2
1
require 'faraday'
2
require 'versionone_sdk/update'
3
require 'versionone_sdk/parser_xml_assets'
4
5
module VersiononeSdk
6
  class Client
7
    DEFAULT_PROTOCOL = 'https'
8
    DEFAULT_HOSTNAME = 'localhost'
9
    DEFAULT_PORT = 443
10
11
    attr_accessor :oFaraday
12
    attr_accessor :sInstance
13
14
    def initialize(opts = {})
15
      @sProtocol   = opts[:protocol] || DEFAULT_PROTOCOL
16
      @sHostname   = opts[:hostname] || DEFAULT_HOSTNAME
17
      @iPort       = opts.key?(:port) && opts[:port] \
18
                   ? opts[:port].to_i : DEFAULT_PORT
19
      sUsername    = opts[:username] || ''
20
      sPassword    = opts[:password] || ''
21
      # VersionOne provides a mechanism for generating an access token
22
      sAppAuth     = opts[:access_token] || ''
23
      @sInstance   = opts[:instance] || ''
24
      @dTypePrefix = {'B' => 'Story', 'E' => 'Epic'}
25
      @sUrl        = buildUrl(@sProtocol, @sHostname, @iPort)
26
      @oFaraday    = Faraday::Connection.new url: @sUrl
27
      @oFaraday.ssl.verify = opts[:ssl_verify].to_s.match(/false/i) \
28
                   ? false : true
29
      if sAppAuth.empty?
30
        @oFaraday.basic_auth(sUsername, sPassword)
31
      else
32
        # could also patch Faraday to have a method similar to basic_auth
33
        @oFaraday.headers["Authorization"]  = "Bearer #{sAppAuth}"
34
      end
35
      @oUpdate     = VersiononeSdk::Update.new self
36
    end
37
38
    def getAsset(xAssetId1, xAssetId2 = nil)
39
      xAssetId1.strip!
40
41
      if xAssetId1 =~ /^([^:]+):([0-9]+)$/
42
        sAssetType = $1
43
        sAssetOid  = $2.to_i
44
        return self.getAssetForTypeAndOid(sAssetType, sAssetOid)
45
46
      elsif xAssetId1 =~ /^([a-zA-Z])-[0-9]+$/
47
        sAssetTypeAbbr = $1.upcase
48
        sAssetType     = @dTypePrefix.key?(sAssetTypeAbbr) \
49
          ? @dTypePrefix[ sAssetTypeAbbr ] : ''
50
        xAssetId1.upcase!
51
        return self.getAssetForTypeAndNumber(sAssetType, xAssetId1)
52
53
      elsif !xAssetId2.nil?
54
        if xAssetId2.is_a?(String) && xAssetId2 =~ /^[0-9]+$/
55
          xAssetId2 = xAssetId2.to_i
56
        end
57
58
        if xAssetId2.is_a?(Integer)
59
60
          if xAssetId1     =~ /^[a-zA-Z]$/
61
            xAssetId1.upcase!
62
            sAssetTypeAbbr = xAssetId1
63
            sAssetType     = @dTypePrefix.key?(sAssetTypeAbbr) \
64
              ? @dTypePrefix[ sAssetTypeAbbr ] : ''
65
            sAssetNumber   =  xAssetId1 + '-' + xAssetId2.to_s
66
            sAssetNumber.upcase!
67
            return self.getAssetForTypeAndNumber(sAssetType, sAssetNumber)
68
          elsif xAssetId1 =~ /^[a-zA-Z].+$/
69
            return self.getAssetForTypeAndOid(xAssetId1, xAssetId2)
70
          end
71
        end
72
      end
73
74
      raise RuntimeError, "E_UNKNOWN_ASSET_ID [#{xAssetId1}][#{xAssetId2.to_s}]"
75
    end
76
77
    def getAssetForTypeAndOid(sAssetType = nil, sAssetOid = nil)
78
      sUrl    = self.getUrlForAssets( sAssetType, sAssetOid )
79
      puts(sUrl)
80
      oRes    = @oFaraday.get sUrl
81
      oParser = VersiononeSdk::ParserXmlAssets.new({:url => @sUrl})
82
      aDoc    = oParser.getDocForAssetXml( oRes.body )
83
    end
84
85
    def getAssetForTypeAndNumber(sAssetType = nil, sAssetNumber = nil)
86
      sUrl    = self.getUrlForAssetTypeAndNumber( sAssetType, sAssetNumber )
87
      oRes    = @oFaraday.get sUrl
88
      oParser = VersiononeSdk::ParserXmlAssets.new({:url => @sUrl})
89
      aDocs   = oParser.getDocsForAssetsXml( oRes.body )
90
      return aDocs[0]
91
    end
92
93
    def getAssets(sAssetType = nil, xIds = nil)
94
      oRes    = self.getAssetsXml(sAssetType,xIds)
95
      oParser = VersiononeSdk::ParserXmlAssets.new({:url => @sUrl})
96
      aDocs   = oParser.getDocsForAssetsXml( oRes.body )
97
      return aDocs
98
    end
99
100
    def getAssetsXml(sAssetType = nil, xIds = nil)
101
      sUrl = self.getUrlForAssets(sAssetType)
102
      oRes = @oFaraday.get sUrl
103
      return oRes
104
    end
105
106
    def getUrlForAssetTypeAndNumber(sAssetType = nil, sAssetNumber = nil)
107
      aUrl = [ @sUrl, @sInstance, 'rest-1.v1/Data',sAssetType + %Q!?where=Number="#{sAssetNumber}"!]
108
      sUrl = aUrl.join('/')
109
      return sUrl
110
    end
111
112
    def getUrlForAssets(sAssetType = nil, sAssetOid = nil)
113
      aUrl = [@sUrl, @sInstance, 'rest-1.v1/Data',sAssetType]
114
      if sAssetOid.is_a?(Integer)
115
        aUrl.push sAssetOid
116
      elsif sAssetOid.kind_of?(String) && sAssetOid =~ /^[0-9]+$/
117
        aUrl.push sAssetOid
118
      end
119
      sUrl = aUrl.join('/')
120
      return sUrl
121
    end
122
123
    def updateAsset(sAssetType=nil,sAssetOid=nil,sName=nil,xxValues=nil,yTagType=nil)
124
      return @oUpdate.updateAsset(sAssetType, sAssetOid, sName, xxValues, yTagType)
125
    end
126
127
    private
128
129
    def buildUrl(sProtocol = DEFAULT_PROTOCOL, sHostname = DEFAULT_HOSTNAME, iPort = DEFAULT_PORT)
130
      if sHostname.nil?
131
        sHostname = 'localhost'
132
      elsif sHostname.is_a?(String)
133
        sHostname.strip!
134
        if sHostname.length < 1
135
          sHostname = 'localhost'
136
        end
137
      else
138
        raise ArgumentError, 'E_HOSTNAME_IS_NOT_A_STRING'
139
      end
140
      if iPort.nil?
141
        iPort = 80
142
      elsif iPort.is_a?(String) && iPort =~ /^[0-9]+$/
143
        iPort = iPort.to_i
144
      elsif ! iPort.kind_of?(Integer)
145
        raise ArgumentError, 'E_PORT_IS_NOT_AN_INTEGER'
146
      end
147
      sBaseUrl = "#{sProtocol}://#{sHostname}"
148
      sBaseUrl.sub!(/\/+\s*$/,'')
149
      sBaseUrl += ':' + iPort.to_s if iPort != 80
150
      return sBaseUrl
151
    end
152
  end
153
end
154