Completed
Push — master ( 8234f0...788bd2 )
by John
59s
created

Client.initialize()   B

Complexity

Conditions 3

Size

Total Lines 24

Duplication

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