From f0c0024c021db98d6e9741dd350291fd69cfea43 Mon Sep 17 00:00:00 2001 From: Brian French Date: Wed, 19 Feb 2025 22:50:31 -0500 Subject: [PATCH 01/12] Add ssl options for faraday --- README.md | 3 +++ lib/netbox_client_ruby.rb | 1 + lib/netbox_client_ruby/connection.rb | 2 +- spec/netbox_client_ruby/netbox_spec.rb | 3 +++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ad2fdec..c8514b0 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,10 @@ NetboxClientRuby.configure do |config| config.netbox.auth.rsa_private_key.password = '' config.netbox.pagination.default_limit = 50 config.faraday.adapter = Faraday.default_adapter + # https://lostisland.github.io/faraday/#/customization/request-options config.faraday.request_options = { open_timeout: 1, timeout: 5 } + # see: https://lostisland.github.io/faraday/#/customization/ssl-options + config.faraday.ssl_options = { verify: true } config.faraday.logger = :logger # built-in options: :logger, :detailed_logger; default: nil end ``` diff --git a/lib/netbox_client_ruby.rb b/lib/netbox_client_ruby.rb index 544a342..a93bf0c 100644 --- a/lib/netbox_client_ruby.rb +++ b/lib/netbox_client_ruby.rb @@ -65,6 +65,7 @@ module NetboxClientRuby setting :adapter, default: :net_http setting :logger setting :request_options, default: { open_timeout: 1, timeout: 5 } + setting :ssl_options, default: { verify: true } end def self.circuits diff --git a/lib/netbox_client_ruby/connection.rb b/lib/netbox_client_ruby/connection.rb index 8fbbe2a..1d58585 100644 --- a/lib/netbox_client_ruby/connection.rb +++ b/lib/netbox_client_ruby/connection.rb @@ -28,7 +28,7 @@ def self.netbox_config private_class_method def self.build_faraday(request_encoding: :json) config = NetboxClientRuby.config - Faraday.new(url: config.netbox.api_base_url, headers: headers) do |faraday| + Faraday.new(url: config.netbox.api_base_url, headers: headers, ssl: config.faraday.ssl_options) do |faraday| faraday.request request_encoding faraday.response config.faraday.logger if config.faraday.logger faraday.response :json, content_type: /\bjson$/ diff --git a/spec/netbox_client_ruby/netbox_spec.rb b/spec/netbox_client_ruby/netbox_spec.rb index 68a1f4e..9c8512f 100644 --- a/spec/netbox_client_ruby/netbox_spec.rb +++ b/spec/netbox_client_ruby/netbox_spec.rb @@ -14,6 +14,7 @@ config.faraday.adapter = :net_http_persistent config.faraday.logger = :detailed_logger config.faraday.request_options = { open_timeout: 3, timeout: 15 } + config.faraday.ssl_options = { verify: true } end expect(NetboxClientRuby.config.netbox.auth.token) @@ -34,6 +35,8 @@ .to be :detailed_logger expect(NetboxClientRuby.config.faraday.request_options) .to eq(open_timeout: 3, timeout: 15) + expect(NetboxClientRuby.config.faraday.ssl_options) + .to eq(verify: true) end { From bd199abb120cd422a602593f277511586d4030da Mon Sep 17 00:00:00 2001 From: Brian French Date: Tue, 25 Feb 2025 00:47:50 -0500 Subject: [PATCH 02/12] Adding Contacts. --- README.md | 2 + lib/netbox_client_ruby/api/tenancy/contact.rb | 15 ++ .../api/tenancy/contact_group.rb | 14 ++ .../api/tenancy/contact_groups.rb | 20 +++ .../api/tenancy/contacts.rb | 20 +++ netbox-client-ruby-0.10.3.gem | Bin 0 -> 63488 bytes spec/fixtures/tenancy/contact-group_1.json | 5 + spec/fixtures/tenancy/contact-groups.json | 12 ++ spec/fixtures/tenancy/contact_1.json | 9 ++ spec/fixtures/tenancy/contact_2.json | 9 ++ spec/fixtures/tenancy/contact_3.json | 14 ++ spec/fixtures/tenancy/contacts.json | 39 +++++ .../api/tenancy/contact_group_spec.rb | 135 ++++++++++++++++ .../api/tenancy/contact_spec.rb | 151 ++++++++++++++++++ .../api/tenancy/contacts_groups_spec.rb | 59 +++++++ .../api/tenancy/contacts_spec.rb | 56 +++++++ .../api/tenancy/tenant_group_spec.rb | 12 +- .../api/tenancy/tenant_spec.rb | 14 +- 18 files changed, 573 insertions(+), 13 deletions(-) create mode 100644 lib/netbox_client_ruby/api/tenancy/contact.rb create mode 100644 lib/netbox_client_ruby/api/tenancy/contact_group.rb create mode 100644 lib/netbox_client_ruby/api/tenancy/contact_groups.rb create mode 100644 lib/netbox_client_ruby/api/tenancy/contacts.rb create mode 100644 netbox-client-ruby-0.10.3.gem create mode 100644 spec/fixtures/tenancy/contact-group_1.json create mode 100644 spec/fixtures/tenancy/contact-groups.json create mode 100644 spec/fixtures/tenancy/contact_1.json create mode 100644 spec/fixtures/tenancy/contact_2.json create mode 100644 spec/fixtures/tenancy/contact_3.json create mode 100644 spec/fixtures/tenancy/contacts.json create mode 100644 spec/netbox_client_ruby/api/tenancy/contact_group_spec.rb create mode 100644 spec/netbox_client_ruby/api/tenancy/contact_spec.rb create mode 100644 spec/netbox_client_ruby/api/tenancy/contacts_groups_spec.rb create mode 100644 spec/netbox_client_ruby/api/tenancy/contacts_spec.rb diff --git a/README.md b/README.md index c8514b0..736e1ff 100644 --- a/README.md +++ b/README.md @@ -194,6 +194,8 @@ Not all objects which the Netbox API exposes are currently implemented. Implemen * Tenancy: * Tenant: `NetboxClientRuby.tenancy.tenants` * Tenant Groups: `NetboxClientRuby.tenancy.tenant_groups` + * Contact: `NetboxClientRuby.tenancy.contacts` + * Contact Groups: `NetboxClientRuby.tenancy.contact_groups` * Virtualization: * Cluster Types: `NetboxClientRuby.virtualization.cluster_types` * Cluster Groups: `NetboxClientRuby.virtualization.cluster_groups` diff --git a/lib/netbox_client_ruby/api/tenancy/contact.rb b/lib/netbox_client_ruby/api/tenancy/contact.rb new file mode 100644 index 0000000..9ec6e91 --- /dev/null +++ b/lib/netbox_client_ruby/api/tenancy/contact.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module NetboxClientRuby + module Tenancy + class Contact + include Entity + + id id: :id + deletable true + path 'tenancy/contacts/:id/' + creation_path 'tenancy/contacts/' + object_fields group: proc { |raw_data| ContactGroup.new raw_data['id'] } + end + end +end diff --git a/lib/netbox_client_ruby/api/tenancy/contact_group.rb b/lib/netbox_client_ruby/api/tenancy/contact_group.rb new file mode 100644 index 0000000..d7038ac --- /dev/null +++ b/lib/netbox_client_ruby/api/tenancy/contact_group.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module NetboxClientRuby + module Tenancy + class ContactGroup + include Entity + + id id: :id + deletable true + path 'tenancy/contact-groups/:id/' + creation_path 'tenancy/contact-groups/' + end + end +end diff --git a/lib/netbox_client_ruby/api/tenancy/contact_groups.rb b/lib/netbox_client_ruby/api/tenancy/contact_groups.rb new file mode 100644 index 0000000..3e56fb7 --- /dev/null +++ b/lib/netbox_client_ruby/api/tenancy/contact_groups.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module NetboxClientRuby + module Tenancy + class ContactGroups + include Entities + + path 'tenancy/contact-groups/' + data_key 'results' + count_key 'count' + entity_creator :entity_creator + + private + + def entity_creator(raw_entity) + ContactGroup.new raw_entity['id'] + end + end + end +end diff --git a/lib/netbox_client_ruby/api/tenancy/contacts.rb b/lib/netbox_client_ruby/api/tenancy/contacts.rb new file mode 100644 index 0000000..392158e --- /dev/null +++ b/lib/netbox_client_ruby/api/tenancy/contacts.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module NetboxClientRuby + module Tenancy + class Contacts + include Entities + + path 'tenancy/contacts/' + data_key 'results' + count_key 'count' + entity_creator :entity_creator + + private + + def entity_creator(raw_entity) + Contact.new raw_entity['id'] + end + end + end +end diff --git a/netbox-client-ruby-0.10.3.gem b/netbox-client-ruby-0.10.3.gem new file mode 100644 index 0000000000000000000000000000000000000000..c506907f7251836daeac1fc17844cc7bdc2bd4df GIT binary patch literal 63488 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ªl;xi}!VVQMUfxLy*fyOZ*KtpscpW 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'*NJKryAsn*Q@HYcK8Nd`fmrG zf7RUq1wP0q_`rDOZ(t7f5qOXXRL)qIIl8JK#|vtmNJj8*;GxJ@Wzb>C6~MnJAPNsa zGfxI?T;S!Mw@3Z)o^`@n1!H$>lC*gjJdGf`8-tbbpi!ZW^DJv{Y!Kj1b|7RRbB71x z{|DwUA0il?NgRqg@wln4vm1G)y)PjedB)srFf#1fx@qz13y%F)b17W*zyf<|P8k=c zixf~9$@P%mDk7+==Pt!g&_KKXd^mFJ%2B#$6pC8bLvBlGJErxMF?aCwPc~Q{)5)Pz z2bqyQlfXgfm~LrSv>j8v9FQi<3@bw-Zl9W?^jX#y-Fue+cN~^fsV_0p%3o*$-N;z6 zAc8c$iT%V5fH<@}bg;ZQ8kSk*_-n(NTr0x7G%A-qq+%wJN$KX)^c?s`Fq*1m)tlCcrEH%cpOkutai=Vx#JH4wU;&W)I%-ft|?)Iud~8 zMzjY&e;Uxkh3HRrE=hs-s^xC~iJSr$#Oa)r_^}3#J-IpqO$rVI8!FGVudwf4K%8H$ zw zeta;$S1!`0Zy!K>=M!jJnlA1Qo3C$+ropp?81QLRw!CDK<}!8CSYi~%m@_Uz@N_?Qmmy?W~IrCzItJl6Z|CsEPtY?+$d zLSS(}%g*=Zu4@7gcu>vnZ|>s2UQ#doheCeoiG0^kTIDwbD|ua9v0ZULEAE<}acoz8 zh=C)Js?LX({h$Qi`Xk-*hfHvF!}=*+G%V8qdKCD%{YF+^q&5ZQtL=Q)7%E`?iT9}W z3++R)L(Z!W6fiRtuvP?4$pjc)fpQbFeGtn*&-D7%GelA?1S&yKSmH-VJ;3Lkh*}g>^(z7oGg*>ChVL*;0 zqCYFv9zpw+iD|Z-jon}}=vmc+I49wbhDo`DCFq#tVlh$y?iwE7W^dfScD$d$bH%dF z`31D{PF9c)*xlv=kD7oxD_G^J5n@<_(Dd2!saS5=aJ^=Y<$rI=EgrG`<3*N1#-6C(EXFLD=uF z&tzFS0MjixV8gNxkdROpbwayr%gqrZH^QWb2dIv9A6&9*BSRYWN!L@C`@=j6scd%h z0}P#>&=JVcc%{#ub(!l({Ks}eN1*AOJ5KQNn`?FHI6lADC(@x_94PT1Z3+pRld{9U ze7;rioWNyi84?pPA@U;+ru8S^It&{4^#9s>tDw4qr(YEJ;1Jw`I|O%vySuvtcM0s^ zunF!2cPF^Jy9akR1b2tM5BGi#r_Ome_vO1)=i%SAYE7-0s-B*n>Z$JE^yy z{gOC>A1|tq<(cJbCDHSlSO24NomIez27{SkgzKH z*&)ii(B`^PU&b`VxQH=_onF0{sC=C|W?N8iO0-uGoB@Be?i`o$Mwvci9Z%n;vADru zZDrQie~itkL`@;hZ9E0b9*{$Qdl3384e5Y@v4K~rtbOVkQ#wG5IasCnZe>%Sf~V6I z?Aq8=q(VTg#hrXqJZY?|Z+eB{hIi@XYPzd=AdgyHj}rZ&#zS;oRHLpj_rmu^PFBhq z1ID!F!;v?;HFTB$9efz;xLSdqLhP82X zCHiWzDgLLwb=$YLpz%$Grw4h%57OcW9uX7RrGUILL%NLNSmOpGs&#_HKp1HuEol%C z=BemX{o?q`<%d%V0hu__<%#QhUvSD=>2JSwLEC-!y^vfren{nqRn~$4IIG)sbv=da zLFzZTuQP~s5K^tm6-ees0N2)XW3mQZpM)5=QKAU<41x0Y{4}gSiXz=cON2KhZ=nwNFTFM9Ds^dPSd-`WQ1KZ6x?GtO+Y13BD5>XQj!A+<5Q| zip}DgbZ?}?yLNhdi(<;d>)~OOKVuG_C5PT;B*|(3=C~>Dmbz01n>-Od0UkR|0L1k^ zMXPLx@SVOlR2F}M$G!|bOv9&1ck_o@V!s!mQZbh!CI$|CRdV4BpgLI32ppJnCTm!nIwl@G;o$@}g7}%u#;tsNs#I7m1D|B0C z7Z)zCIvk&yL%ulCqwN?U@e$B^I~ID%`>9v<6NG4`Oxp$`x#lI;&Y0y?1*6wxW-HI7 zXUxQE%cfg1X%bW^Kf_hZ$Vh(pF%!o+bI}67C6xW6JptMmxV!^}R27M|@pwO|p7u!k z3Y^QqM5c?0sot(dJSsyB(LKPgEr~zHgfL~HpBRj5x-nCad*_$k$JOT7u)pHRX;)w$ z_jkt5)DN#e_2)WY?C)b!;hW=#fOcWVn0D@nD}Fb*i(OA&PUW0?H-T3w!;bKgXn z{KT!VZnrBe_?K?CBVM=tcOi1lYANUf3xYZmUtj9@wv@I@=iusVCmpY|g_^RBC<<4A zvJ7hVNk`4ZxIa4H7J4LdAlQQdHH_Du4>WiYq7atf(m)PUTk$yyVPh15Xc0?AC+tbQ zr2*fZvEVASz*^@n;QiP!K#zFdxP%%Nc5-X~F49W#P0t)d{KKuu+cU-h7y6OtqX`&< z9>g_v5=#n?m4WmcKqjdV9ua|fMne89-}FTNyKJ0=Tu%dv?O5j}PzI_Y+=Xsng=O^T z?FR`kfc{fr;t?7$7@Irw^)+YS#-1?CB}|(aRX5o;F1M9xX!#8_EfPM3{>W$yb@;0$ z3k)>t4JRa^zQcF~`*OSr$F*jVuSN`99sXTtfloa14<-c3Cqev)zX5 z?gI!PD8VyZCjfhd68Tcz&+$H7JOV){6^%tvWuBM~`aUa)sK9Scek|y^GYSXxw#%^} zcoeLtOC@A^=e-ACABXG!!a54*2{gTqPrgFr)p>(`4dYFQC~xI`VC(}kkkmjvh-<`w z$uuGLmqNiqB5Zv)e-On7{JFw;+>B(K4e|UqHV`=Z5F$Gs;82Dx{Eo9dhtMEe{W!9P zyQK(D>so`PYBWKz2f&xv36Sa%fVQl+`vY6`(4(VwS;L$2AB>GaaL5Nfb^oy@PNNW> z`kr-j054A{2qe0VaZ&}P586Jw1f;M1zi7y<@IZbQ#9XB%!MycQaBl4yJYve5-3HJ%H#2s_=<<0| zV9!RVon^={O%tFOKzt(4GcNu0yP^u>@95+vj5I3|qSFyGVSmDJi855gl^GDUeRNmL; zFK;El6l=>Pax}|R=n2QF8BuA#%?Fz{$Bkz27*86ZLW{ff+y!vp9)3Y5Z zjGAW%D@pfaF>iyXTv4?TQDSfIRaDf)J;35%YkVrzfx01YaLxpDwPa_ zK_E-++}Zm9j=&$P`s#zWa#+e`em{OyiHbRzif8zQ|I31>j%6}QDGwHp?;toJ8jipL zwO=V4hfohI(7Wlt9PPlZSiiw5%ag~73YAs60&bpbi@kfcM~o=@Zz8clr@YXL$2ish*DVsW(uouFf%lUq`8}r`d~Dw$Dltf<0UjFS^Ew1prj7Twlz`fJ zj9ds%=g2lHT!1La`xnIb%Ac$-{*%Hw-t=PwM#J+6A$;hfJ<@s}$6rY$(Rya0d_g5G zJWt*7!dRDlI$6A)VzUNU$uS4X!zo+NDceXZJpxAplywfvHIC%k!zl6y$}D8!I!mIu zWap@GHRBnb@n;VK2)(pilHDh~m%wI2Hhgz%z=Hw7uvlNIq9n^nj%0M%?CZ1PGybF# z=P=tujMj)#TTG&4Ji9!K6s%qX~KF$vW@Sl#4jE3zZ;{riHnOu zBg!^}#RrYvC^5_w$mBU%($ZQDtT7Qk)0$j6q)oxuR%8@BBh0ku)oFS|X3&_v}|sYmm0;2G6GvZAee~?Ga!$b7u##?f5F{X_h*5Xfx9z00A$( zj(Iz8^}Jo&3sNKW9AayaC0^ZfR^R(GbRjA&a>U5Gg+0Tx#MqRZxDQO2j4Zfd2f>Bz z96t4cqhWy#a|bZi+~i0N%Y}d0qT;x5HtwQ&+eRdBiZhtWmJcmuPv1Q}rfEI+UOw~W zZYQL{-up4`&oQ;L zcl4R6o{zH^WFY(d%OAj;d{;6FqiK`yctQ$CesdGNU$=hAvpV*omYq#jb^tegCGWwh z`%B$C!i!DN9iEE!1JTsB-b}$R?B9hY>UWQoL)#pP*-7rX*@N?M2)B{W^Q&luHR;D* zu?v|XeXjC0IS}063>{MLB|64AgW0uCXcY4ik~#ftc>}G2&?Z{#_ zO7{Y8#tw&X+c-mWLPm~9=s#3}ef;S?Ygc}Qo(kNGTut7O`LUkP#l1!9_23_9BN9!S6CYi^Hq06)ebZhw?`U!1KyOfa~ zS7XU64-C2(%HK=ea8|2+-MGaEB;y?}wa_N9`y&=y( z@PmBxhl=REO@eaqZI$AZdUijRkR%i!X%Ua3-f<5w14~C;O#8CUaYx7Ln%Itc{B!P?WYI=El9c+c9DwUgqmPi~_33n?;5gz3k={ruJWj3+!7 z;iFUD^S%AOw5^ZAhu#*HtEQAvwu5tOb&lb6oWy2 zzbe#}I9s1#87OH1-#{<}#xkUQ#z55)|A%8S`~xS%U`oey914C}_A=4pp5G_496SH& zl3UTq?N1S{`^p8Kwy0I*G$1OLjNPtwOyF}&WHf%?#OR9(f@vFW`Y<1e+3=kXHK^NY zxJN8i>5fI5lSbkPOo$c|VTrBkQlU(n@j$YJ9E4413xMrHOUD=zo_0oPBTvJoo1OCN z->}Jdm$DK#xRQan&0vV!_0&`>-|&fp4x)(K(yVP4`Qn6iggFM%0X!@4u<2|;WA> z^a=7f1OY6Jy^6N~7Uc&1(Yq5eG8m?O5xozPa{pn7N=ILU7&?8^e_*|bm9DfG&w3L# zo;#hc@+n36>I;ojK|ao#CaV$aWU{bEY<(^cS5QJgczD0fk6nbKlo7~g+YdU+iZJ-( zuS0k8g=Yb+S5G}<8YL$Q6GXb$Oq2lo>#1Fm)u)T_8!Ww~a+O#=m!q$;^)X2ap}YiT z5-2Tta!%7wHp;2=iZS%csTsszcz5%xm&J6dRe{jf;WCw9cHq*!-41Nw3QQ9Zn)LXRp z8H^KjZ>9qmUWVJ(fK&zZS?=;)N~EKPVML;X}YrCSb8q7Hl8VnOoQ`p(@-(!owT6mxHvN;5#{_ zM`n}nUwg};*v6_9`@v?V@PT=G25QetIWL5k^-Sw`?GGjm6JO>1h71s9g0JIrr*V$# z7!<`AU!TA#eh#0QD}Z^w`1G1SLNhJ8NcE8Ca?81vc}lAjWEOEIC9(chDBgiB+;4HH zgQ5G<^KdS}ziTb19neg>WAR@OWb6vk1)2DvMe%Uxa|jihGMkN`vI)DTQWLALzx_S&c22f$LFV;HpM{kK%sCd*ct_^O zdOPe`;5Wc45EF3lY}OxVznqbYYIA{90P5fdO}Rz7PrO5Xzk_sDpZW>bt)&FqFD>oj zQ)hQxGuMAJCxlP{D4P>QBh#1@8$klD?}lx$;wPgShC>rH*d&%&{ZLhNinz7^81POu zr>deF{Z(*VQIs>9$E!)UXIy-;D6jMMBESD=zapZ|ApiO+Y3Wnlrb-9{oScHvaF}B0 zU!7Yh#RlJdhIG>Et08AYv}!`_k7S?%qDZGAi_yi5Zn$Ok$rh>EM2y?E75a+SQU%%Q zx&fusktg$RLoKm`v^Cg1LOXM0O<3>61$icy#$bkvRpLhUsI*E@fWU(fiu>@_d=btA z%qemTzq*hfnQDjhgNaJm4+Lco5L9+KN-65s%3yG~WD69Q zqcOb^InnrrR67|CL_{0nQAX-91B>$Ofaz~~VV{89M`-@e7|xDtO*X@VIw8iS-XZKY!6=7o;jL0#mLnMga3m0MBlC#p5KUZ zZ!!;1@!O|sDYPScSkVGn`I`Vl-7Sp|?kn@R74Hk{6A$ZYr#Pi_mqRvxokosC>m_>< z4$|Q|xnIvjYa6B7*_;3-=N-tK{H~_u zYg&$TT58Be3?))*rrzSt7mtjy$U1EzuODjO;8QxkA?g(Rom#zPEAj<35YJ3p)*=Z5 zN=7(a*6fhj0=u2XKIJYhi;mkJ`L(Cl%qWTm9@Dhfh;&+lty!mK>H}M89?#isza!EK z!FHq4em{>Vcj~>a48>cnnbi?Tan|zrWKbIq^0XXQnsae*@Tw~7O&#y@79EI*_696&!6#daSz znH0VG+Pm!|w5rRS5YBzvp7u9v+84J>!(lp_uUz43h$gf&#o>7gd9p=7XxVr5JZ*UY zFUy;rxBG=v!V+VOM*5gkLt`X}_URU{T1SnqD-HbUO!daoHNztu^_#pFfZVQyZFCY^ zd3Edmcry`Oy53)xh|#M;9wGIOhV8#lU5tklQ}Bfr>sU(D9CCH62*=8epG9I7!tHA&t6k>X4MsyOo5&BwF9 zT+h6`te|jEyYQvx$gX=#18;i^PG06#r8JvIb6ixFPPKX0CL(qH$mWHcRv7Yh+%~aG zG4RfQ)qBS8u1hsJ?N>psj>g&$IhpL*HW?S0+G{8V^wG>{8RxS24Me*LaLn?*Nj#p_ zoP=Ly^!o~R%)j{}C~y8a{JEUg6+#NxgyG-aIU);u-m?Msx82$q3NYL*SE~8Gt*2qj z8wo(JFD^^nF(7L$Wivw%kJ}rjFvt&X2;DpwLIp;Ys=K@vg&^JlvKqABca^`Vb$kb1 z9D}!WQ*Yf<_Z9YXn)itDM3949CTcmYH?^P0_@8D>j+`O;&+CwtfL9h^T=b-SV3$aD zCWIW2072|mJMaf@Lq2Vb9u0}U7d2H<8h&I-2%qP*(B~O^$=-29)iALZi}s|oH=32^ z;@L%Q+1WLU+K3diYJhh%nAk4Rr#Fq7{Kl~#k79HE>3jev1I|-b8uzCSp`t_8cyD9Q zE{uS{yW7`Nm!uJgZK8Z}{p8XriL}p`##Kouk9L75Q9k`rbX2GKVEmZ|0zC4WNAllZ ziS=F_0X~o9GFO{%ENpZQ4~^b_;nAnB3uu6+mbY5SbN(IhrnBI0HFTphKLm@9=12QQ z#RNUhAn7D{^sU9OsSK2=ThJi(g6lcqMk0F?=!uS zM{pd3fk#|Oz%>v+^r?mSoP=`xg=S2e1pgXKjuDMlsuci3Po+POkkuXHu>FpUffhC&+l93`a0 zE&fH9IP0Z73aVg(xqde)^mN+Cu}(I|6bIRosbF{awcBxX5$$0+#<+6?&J-Obw6@~U!gKpxgc?dgDMI(qC#De|N`##M zl1_c0rOIUxOf#ZHw!KYl%%6yuKJj@bEp6n1{JhRwgMR#iW@n%cC;j-VxCHklUWX_f zkr-w@N?TMvJzhO_nRq$#UO}3L5UO-Ok|Co!_ri}6@mTdIaT6~$F_{RqG=mN?(yURm zThh{G1Y4?9VJX80v;0~2n9ioqYfhbEEU=mdoRM{CKA zB!D+t^B?xU&5*sZ=_1h;q2+O06xqzc>NIi`12IdpvcyHHgQ3bFwN_VaBK3FW?n_#mNKOl?z@3s>~N;& z>)>>HT|xz20XF0L`R)tnKRARAg*A8C`)7+u&0$t(i3|uQm2C2`;Z_@Y(EF+J5|9|Z zm@vILMa;AVko6}N#7}29p}(Gzag)Y-S=Ri-{RjJuNnu*7H#3G(+a@QAo*);RK`SIz z_T`v4;;U8BC}=C?j($pqi=4#&3;V|P_ergk(0=qS=vb?dELGpg?1*Oyajnm(jMKlo zxvek=yo*)`8OiCeEyCCBVMe=rG|vmiOlMmIJJC|sr0ne4Fy`O)(k(FmmS#lhj1B?` za01Xa{yedACAtXGorNf1fA6N#9^^nF)_^IY$4nfgAfO3?#vt|*cR7wFfXZnvlS0qr zJi8I&YUmReOGKbUBS}#3-Lxp9F>xLV`3OR9B^;LZaY}vvBn}(bM^ld9(8sX9 z6J(i1TTeWJ<4dTw>ssg+ev_z0eHr5G2MV!cXE3Lz;$qI}TfLz>su9aG+s+bc`UhI` z2&n70iQk}Y|2iCSlyeo9jML}=niuiG_SAme_6*gt*|8WyktJepD_8z7`pL-` zcz=W&XQkb>>(JBe;u^8y=G<%SpmM(5P@Lh+O`p17wPw4odqrBI)V=xyorOs3VrChQ zelv5FN5ModKwj#qU!oT}`eFb*R_T$6?wSFLj`>7uUq~X)Fbj&Q;`C&u|C+2NXO1}E z*3-04qW^^5awg{k;LpV(LJj6h`FVtulS+{rW00>-wWT^DBXTtO=hrmF;GC~1C-J#7 z7R6XQJMn$Lt67ppJE@neADmPjAM`6 z*xw+9d9s{YvG1C8_n@x4;s+pfrb|w9@VB20r;@N^#jlWNTb%x2+IR%&%AX1Z9=iCt zmyu<-&U-Q??8(V#Ja)FdLw-U*Q;`;GI9pQ)p7BBBK29|W`BDc(9h}I_gbY-|1gJ@5 z0n}E*i|Q27+=-4a)J@}Jb)oBcydqD0QeST!OEjx8r|@xWO4q|25?LnMEt5A@CJR8O zO>xqyx*!ewf!%6{&mkUDz>=kLFNbVb?F974h6HmqgP(bAZ(h&FE~*ZPBo(dD()TtyPIyc^<6DXnw$O2>jf52Q2?ETA_FTZPjl3(j zK5OMItMNeGgn{cQ6;`kMzzv>m?U@rLuDlhhtq3jk4j1;`o8WJ<^tXm0o3PP287?P{ zsrZ!%`4)YNq>H#S`wn8f3gIZKq!pyl%_RO&wQ4A3yuI=o3$8RuU)nK#wQ83!mQBMT zD4F9Aflz+vN28_db zEl36@JFut|cccFn<_^b9tZ0WWkq$N+{325$^I{!CEfJk&)ev{_w8bgry`s*rp~Ua* zqZJM5p zM(g1FKHRGQM)-EM!!Je0j=2+wZd7W`trzidDq{I2y+>08Qu=LE#7rfs6G;;SK}6Zh_s z351#p;uP8w*ue4?cuz>k@u9A)e!4lQcdZNOxO40_zE`FlQ8nM@k?JNs?a6rGF2;SG zIs+i}_3D5DcOPE=_5mYs$3k$|Tho6oa#2^2>15Z;d!o6&rs=g@`yYod4GM#pj5+e| z3+`1LA9U7afnEGp+jQgJ=E-=f_$B!%163r)yGVIx7W*mHf&Ar@!Czjm<{@ZmaQct@ z9vMMIB-qcr8GOe1ig1~mRdxx>1g6=^UVWt+juTf7;|>AwTs)T2P3DOcjPhUlLmx&5 zkumKFo}^%u4}=ZKXIaF|+-!r$F&IbmXcEc^3joC-pRxlEdjKI0vDzb*5reX;L~Un%U3Ls~eR zhBLLaG8@^YdhzJ!fX3^ORTFZiWo%xo6D(j?B)^=R>OxymbY7p`Ip6ifspv6-Q7yv zZ$vKAYz}J>C`KLdGfM{*eloqasSi&8IbV+4%?c-c)j~MVXdXTAK*2pa zXvT!>V^{O9gVyRtrPMOlMxOoD)FLpBC63%>)oho&6%V>P71zLnA9+-2*dUZ@yaMz4IO;x)N>8!|C&9ok8e63(8Mv7|}B9q6Ufcrupj&smkPr7UX zxagKqqOIq*B=^-@Xo}dr*L|5>T8Im6Y#{|zt}7hnl6g9kx3@ZrJ_2)iEEn^^E9RpS zTzJB9S+}VzlxMRNyp(qEQE~K?HSpS(cO`KwzJ=$MC*RcD17=G{fK?|L><=Ex9Ikuc zvrA_1atQ0H-;NVl6(ep80Y7_75x;2Vh;Y0dHLux`^q}TlE zLve8Na&vQYemopd>>OM?96V4I?Eedw|DQfQ-960QK1A}iwX$;fKaBDJ)&E~}`=68h zKd}10sf#=s2}-T9*#-vIDxRqsR}4+^y~>=2J%^ViNcU_Nm!&Q?CESW-B=mOjwys^)Ip;TUH^yQetqePG2@$ zlLfTVIaBrce4p`|PDPU}!@fpdfj-hPeaR)BdjKP}@Rl`>AhK9Fss;(>J}qe(9JlaQ za~X3&9U6^)VVnc$b5Dh0K(G+}J(+&izNt~B}!^fe-FOICPqnZ}#N zc8rM2V=4;4bS~8`S3}5VR9|p@wosklCaX(K$phi>oMZBrWj=!><+Wnw&bd%ToeH>x z&@nC7({aT*hChzaP2acBDq%xYelf9@o_p4;i1!=aKfyNH5mzlj|KGG?|B>ZC8u*U} L{-c5a9u52t^YDMB literal 0 HcmV?d00001 diff --git a/spec/fixtures/tenancy/contact-group_1.json b/spec/fixtures/tenancy/contact-group_1.json new file mode 100644 index 0000000..310dd12 --- /dev/null +++ b/spec/fixtures/tenancy/contact-group_1.json @@ -0,0 +1,5 @@ +{ + "id": 1, + "name": "Customer", + "slug": "customer" +} diff --git a/spec/fixtures/tenancy/contact-groups.json b/spec/fixtures/tenancy/contact-groups.json new file mode 100644 index 0000000..a2e9802 --- /dev/null +++ b/spec/fixtures/tenancy/contact-groups.json @@ -0,0 +1,12 @@ +{ + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "name": "Customer", + "slug": "customer" + } + ] +} diff --git a/spec/fixtures/tenancy/contact_1.json b/spec/fixtures/tenancy/contact_1.json new file mode 100644 index 0000000..d9d8196 --- /dev/null +++ b/spec/fixtures/tenancy/contact_1.json @@ -0,0 +1,9 @@ +{ + "id": 1, + "name": "contact1", + "email": "contact1@customer.test", + "group": null, + "description": "", + "comments": "", + "custom_fields": {} +} diff --git a/spec/fixtures/tenancy/contact_2.json b/spec/fixtures/tenancy/contact_2.json new file mode 100644 index 0000000..8e57759 --- /dev/null +++ b/spec/fixtures/tenancy/contact_2.json @@ -0,0 +1,9 @@ +{ + "id": 2, + "name": "contact2", + "email": "contact2@customer.test", + "group": null, + "description": "", + "comments": "", + "custom_fields": {} +} diff --git a/spec/fixtures/tenancy/contact_3.json b/spec/fixtures/tenancy/contact_3.json new file mode 100644 index 0000000..5cbb39d --- /dev/null +++ b/spec/fixtures/tenancy/contact_3.json @@ -0,0 +1,14 @@ +{ + "id": 3, + "name": "tenant3", + "email": "contact3@customer.test", + "group": { + "id": 1, + "url": "http://localhost/api/tenancy/contact-groups/1/", + "name": "Customer", + "slug": "customer" + }, + "description": "", + "comments": "", + "custom_fields": {} +} diff --git a/spec/fixtures/tenancy/contacts.json b/spec/fixtures/tenancy/contacts.json new file mode 100644 index 0000000..a74e005 --- /dev/null +++ b/spec/fixtures/tenancy/contacts.json @@ -0,0 +1,39 @@ +{ + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 3, + "name": "contact3", + "email": "contact3@customer.test", + "group": { + "id": 1, + "url": "http://localhost/api/tenancy/contact-groups/1/", + "name": "Customer", + "slug": "customer" + }, + "description": "", + "comments": "", + "custom_fields": {} + }, + { + "id": 1, + "name": "contact1", + "email": "contact1@customer.test", + "group": null, + "description": "", + "comments": "", + "custom_fields": {} + }, + { + "id": 2, + "name": "contact2", + "email": "contact2@customer.test", + "group": null, + "description": "", + "comments": "", + "custom_fields": {} + } + ] +} diff --git a/spec/netbox_client_ruby/api/tenancy/contact_group_spec.rb b/spec/netbox_client_ruby/api/tenancy/contact_group_spec.rb new file mode 100644 index 0000000..50263fe --- /dev/null +++ b/spec/netbox_client_ruby/api/tenancy/contact_group_spec.rb @@ -0,0 +1,135 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe NetboxClientRuby::Tenancy::ContactGroup, faraday_stub: true do + let(:contact_group_id) { 1 } + let(:base_url) { '/api/tenancy/contact-groups/' } + let(:request_url) { "#{base_url}#{contact_group_id}/" } + let(:response) { File.read("spec/fixtures/tenancy/contact-group_#{contact_group_id}.json") } + + subject { NetboxClientRuby::Tenancy::ContactGroup.new contact_group_id } + + describe '#id' do + it 'shall be the expected id' do + expect(subject.id).to eq(contact_group_id) + end + end + + describe '#name' do + it 'should fetch the data' do + expect(faraday).to receive(:get).and_call_original + + subject.name + end + + it 'shall be the expected name' do + expect(subject.name).to eq('Customer') + end + end + + describe '.delete' do + let(:request_method) { :delete } + let(:response_status) { 204 } + let(:response) { nil } + + it 'should delete the object' do + expect(faraday).to receive(request_method).and_call_original + subject.delete + end + end + + describe '.update' do + let(:request_method) { :patch } + let(:request_params) { { 'name' => 'noob' } } + + it 'should update the object' do + expect(faraday).to receive(request_method).and_call_original + expect(subject.update(name: 'noob').name).to eq('Customer') + end + end + + describe '.reload' do + it 'should reload the object' do + expect(faraday).to receive(request_method).twice.and_call_original + + subject.reload + subject.reload + end + end + + describe '.save' do + let(:name) { 'foobar' } + let(:slug) { name } + let(:request_params) { { 'name' => name, 'slug' => slug } } + + context 'update' do + let(:request_method) { :patch } + + subject do + entity = NetboxClientRuby::Tenancy::ContactGroup.new contact_group_id + entity.name = name + entity.slug = slug + entity + end + + it 'does not call PATCH until save is called' do + expect(faraday).to_not receive(request_method) + expect(faraday).to_not receive(:get) + + expect(subject.name).to eq(name) + expect(subject.slug).to eq(slug) + end + + it 'calls PATCH when save is called' do + expect(faraday).to receive(request_method).and_call_original + + expect(subject.save).to be(subject) + end + + it 'Reads the answer from the PATCH answer' do + expect(faraday).to receive(request_method).and_call_original + + subject.save + expect(subject.name).to eq('Customer') + expect(subject.slug).to eq('customer') + end + end + + context 'create' do + let(:request_method) { :post } + let(:request_url) { base_url } + + subject do + entity = NetboxClientRuby::Tenancy::ContactGroup.new + entity.name = name + entity.slug = slug + entity + end + + it 'does not POST until save is called' do + expect(faraday).to_not receive(request_method) + expect(faraday).to_not receive(:get) + + expect(subject.name).to eq(name) + expect(subject.slug).to eq(slug) + end + + it 'POSTs the data upon a call of save' do + expect(faraday).to receive(request_method).and_call_original + + expect(subject.save).to be(subject) + end + + it 'Reads the answer from the POST' do + expect(faraday).to receive(request_method).and_call_original + + subject.save + + expect(subject.id).to be(1) + expect(subject.name).to eq('Customer') + expect(subject.slug).to eq('customer') + end + end + end +end diff --git a/spec/netbox_client_ruby/api/tenancy/contact_spec.rb b/spec/netbox_client_ruby/api/tenancy/contact_spec.rb new file mode 100644 index 0000000..026c805 --- /dev/null +++ b/spec/netbox_client_ruby/api/tenancy/contact_spec.rb @@ -0,0 +1,151 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe NetboxClientRuby::Tenancy::Contact, faraday_stub: true do + let(:contact_id) { 1 } + let(:base_url) { '/api/tenancy/contacts/' } + let(:request_url) { "#{base_url}#{contact_id}/" } + let(:response) { File.read("spec/fixtures/tenancy/contact_#{contact_id}.json") } + + subject { NetboxClientRuby::Tenancy::Contact.new contact_id } + + describe '#id' do + it 'shall be the expected id' do + expect(subject.id).to eq(contact_id) + end + end + + describe '#name' do + it 'should fetch the data' do + expect(faraday).to receive(:get).and_call_original + + subject.name + end + + it 'shall be the expected name' do + expect(subject.name).to eq('contact1') + end + end + + describe '.group' do + it 'should be nil' do + expect(subject.group).to be_nil + end + + context 'Contact with Group' do + let(:contact_id) { 3 } + + it 'should be a ContactGroup object' do + contact_group = subject.group + expect(contact_group).to be_a NetboxClientRuby::Tenancy::ContactGroup + expect(contact_group.id).to eq(1) + end + end + end + + describe '.delete' do + let(:request_method) { :delete } + let(:response_status) { 204 } + let(:response) { nil } + + it 'should delete the object' do + expect(faraday).to receive(request_method).and_call_original + subject.delete + end + end + + describe '.update' do + let(:request_method) { :patch } + let(:request_params) { { 'name' => 'noob' } } + + it 'should update the object' do + expect(faraday).to receive(request_method).and_call_original + expect(subject.update(name: 'noob').name).to eq('contact1') + end + end + + describe '.reload' do + it 'should reload the object' do + expect(faraday).to receive(request_method).twice.and_call_original + + subject.reload + subject.reload + end + end + + describe '.save' do + let(:name) { 'foobar' } + let(:slug) { name } + let(:request_params) { { 'name' => name, 'slug' => slug } } + + context 'update' do + let(:request_method) { :patch } + + subject do + entity = NetboxClientRuby::Tenancy::Contact.new contact_id + entity.name = name + entity.slug = slug + entity + end + + it 'does not call PATCH until save is called' do + expect(faraday).to_not receive(request_method) + expect(faraday).to_not receive(:get) + + expect(subject.name).to eq(name) + expect(subject.slug).to eq(slug) + end + + it 'calls PATCH when save is called' do + expect(faraday).to receive(request_method).and_call_original + + expect(subject.save).to be(subject) + end + + it 'Reads the answer from the PATCH answer' do + expect(faraday).to receive(request_method).and_call_original + + subject.save + expect(subject.name).to eq('contact1') + expect(subject.email).to eq('contact1@customer.test') + end + end + + context 'create' do + let(:request_method) { :post } + let(:request_url) { base_url } + + subject do + entity = NetboxClientRuby::Tenancy::Contact.new + entity.name = name + entity.slug = slug + entity + end + + it 'does not POST until save is called' do + expect(faraday).to_not receive(request_method) + expect(faraday).to_not receive(:get) + + expect(subject.name).to eq(name) + expect(subject.slug).to eq(slug) + end + + it 'POSTs the data upon a call of save' do + expect(faraday).to receive(request_method).and_call_original + + expect(subject.save).to be(subject) + end + + it 'Reads the answer from the POST' do + expect(faraday).to receive(request_method).and_call_original + + subject.save + + expect(subject.id).to be(1) + expect(subject.name).to eq('contact1') + expect(subject.email).to eq('contact1@customer.test') + end + end + end +end diff --git a/spec/netbox_client_ruby/api/tenancy/contacts_groups_spec.rb b/spec/netbox_client_ruby/api/tenancy/contacts_groups_spec.rb new file mode 100644 index 0000000..3720b84 --- /dev/null +++ b/spec/netbox_client_ruby/api/tenancy/contacts_groups_spec.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe NetboxClientRuby::Tenancy::ContactGroups, faraday_stub: true do + let(:expected_number_of_items) { 1 } + let(:expected_singular_type) { NetboxClientRuby::Tenancy::ContactGroup } + + let(:response) { File.read('spec/fixtures/tenancy/contact-groups.json') } + let(:request_url) { '/api/tenancy/contact-groups/' } + let(:request_url_params) do + { limit: NetboxClientRuby.config.netbox.pagination.default_limit } + end + + context 'unpaged fetch' do + describe '#length' do + it 'shall be the expected length' do + expect(subject.length).to be expected_number_of_items + end + end + + describe '#total' do + it 'shall be the expected total' do + expect(subject.total).to be expected_number_of_items + end + end + end + + describe '#reload' do + it 'fetches the correct data' do + expect(faraday).to receive(:get).and_call_original + subject.reload + end + + it 'caches the data' do + expect(faraday).to receive(:get).and_call_original + subject.total + subject.total + end + + it 'reloads the data' do + expect(faraday).to receive(:get).twice.and_call_original + subject.reload + subject.reload + end + end + + describe '#as_array' do + it 'return the correct amount' do + expect(subject.to_a.length).to be expected_number_of_items + end + + it 'returns single instances' do + subject.to_a.each do |element| + expect(element).to be_a expected_singular_type + end + end + end +end diff --git a/spec/netbox_client_ruby/api/tenancy/contacts_spec.rb b/spec/netbox_client_ruby/api/tenancy/contacts_spec.rb new file mode 100644 index 0000000..4b1ae31 --- /dev/null +++ b/spec/netbox_client_ruby/api/tenancy/contacts_spec.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe NetboxClientRuby::Tenancy::Contacts, faraday_stub: true do + let(:response) { File.read('spec/fixtures/tenancy/contacts.json') } + let(:request_url) { '/api/tenancy/contacts/' } + let(:request_url_params) do + { limit: NetboxClientRuby.config.netbox.pagination.default_limit } + end + + context 'unpaged fetch' do + describe '#length' do + it 'shall be the expected length' do + expect(subject.length).to be 3 + end + end + + describe '#total' do + it 'shall be the expected total' do + expect(subject.total).to be 3 + end + end + end + + describe '#reload' do + it 'fetches the correct data' do + expect(faraday).to receive(:get).and_call_original + subject.reload + end + + it 'caches the data' do + expect(faraday).to receive(:get).and_call_original + subject.total + subject.total + end + + it 'reloads the data' do + expect(faraday).to receive(:get).twice.and_call_original + subject.reload + subject.reload + end + end + + describe '#as_array' do + it 'return the correct amount' do + expect(subject.to_a.length).to be 3 + end + + it 'returns single instances' do + subject.to_a.each do |element| + expect(element).to be_a NetboxClientRuby::Tenancy::Contact + end + end + end +end diff --git a/spec/netbox_client_ruby/api/tenancy/tenant_group_spec.rb b/spec/netbox_client_ruby/api/tenancy/tenant_group_spec.rb index 7665024..596888a 100644 --- a/spec/netbox_client_ruby/api/tenancy/tenant_group_spec.rb +++ b/spec/netbox_client_ruby/api/tenancy/tenant_group_spec.rb @@ -3,16 +3,16 @@ require 'spec_helper' RSpec.describe NetboxClientRuby::Tenancy::TenantGroup, faraday_stub: true do - let(:region_id) { 1 } + let(:tenant_group_id) { 1 } let(:base_url) { '/api/tenancy/tenant-groups/' } - let(:request_url) { "#{base_url}#{region_id}/" } - let(:response) { File.read("spec/fixtures/tenancy/tenant-group_#{region_id}.json") } + let(:request_url) { "#{base_url}#{tenant_group_id}/" } + let(:response) { File.read("spec/fixtures/tenancy/tenant-group_#{tenant_group_id}.json") } - subject { NetboxClientRuby::Tenancy::TenantGroup.new region_id } + subject { NetboxClientRuby::Tenancy::TenantGroup.new tenant_group_id } describe '#id' do it 'shall be the expected id' do - expect(subject.id).to eq(region_id) + expect(subject.id).to eq(tenant_group_id) end end @@ -67,7 +67,7 @@ let(:request_method) { :patch } subject do - entity = NetboxClientRuby::Tenancy::TenantGroup.new region_id + entity = NetboxClientRuby::Tenancy::TenantGroup.new tenant_group_id entity.name = name entity.slug = slug entity diff --git a/spec/netbox_client_ruby/api/tenancy/tenant_spec.rb b/spec/netbox_client_ruby/api/tenancy/tenant_spec.rb index 9aaadff..399e106 100644 --- a/spec/netbox_client_ruby/api/tenancy/tenant_spec.rb +++ b/spec/netbox_client_ruby/api/tenancy/tenant_spec.rb @@ -3,16 +3,16 @@ require 'spec_helper' RSpec.describe NetboxClientRuby::Tenancy::Tenant, faraday_stub: true do - let(:region_id) { 1 } + let(:tenant_id) { 1 } let(:base_url) { '/api/tenancy/tenants/' } - let(:request_url) { "#{base_url}#{region_id}/" } - let(:response) { File.read("spec/fixtures/tenancy/tenant_#{region_id}.json") } + let(:request_url) { "#{base_url}#{tenant_id}/" } + let(:response) { File.read("spec/fixtures/tenancy/tenant_#{tenant_id}.json") } - subject { NetboxClientRuby::Tenancy::Tenant.new region_id } + subject { NetboxClientRuby::Tenancy::Tenant.new tenant_id } describe '#id' do it 'shall be the expected id' do - expect(subject.id).to eq(region_id) + expect(subject.id).to eq(tenant_id) end end @@ -34,7 +34,7 @@ end context 'Tenant with Group' do - let(:region_id) { 3 } + let(:tenant_id) { 3 } it 'should be a TenantGroup object' do tenant_group = subject.group @@ -83,7 +83,7 @@ let(:request_method) { :patch } subject do - entity = NetboxClientRuby::Tenancy::Tenant.new region_id + entity = NetboxClientRuby::Tenancy::Tenant.new tenant_id entity.name = name entity.slug = slug entity From 6ee5cff35743344da90f52c5e01767072f198768 Mon Sep 17 00:00:00 2001 From: Brian French Date: Tue, 25 Feb 2025 01:29:50 -0500 Subject: [PATCH 03/12] Add contacts to the Tenancy module --- lib/netbox_client_ruby/api/tenancy.rb | 4 ++++ spec/netbox_client_ruby/api/tenancy_spec.rb | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/netbox_client_ruby/api/tenancy.rb b/lib/netbox_client_ruby/api/tenancy.rb index 8545644..708de6d 100644 --- a/lib/netbox_client_ruby/api/tenancy.rb +++ b/lib/netbox_client_ruby/api/tenancy.rb @@ -5,6 +5,8 @@ module Tenancy { tenants: Tenants, tenant_groups: TenantGroups + contacts: Contacts, + contact_groups: ContactGroups }.each_pair do |method_name, class_name| define_method(method_name) { class_name.new } module_function(method_name) @@ -13,6 +15,8 @@ module Tenancy { tenant: Tenant, tenant_group: TenantGroup + contact: Contact, + contact_group: ContactGroup }.each_pair do |method_name, class_name| define_method(method_name) { |id| class_name.new id } module_function(method_name) diff --git a/spec/netbox_client_ruby/api/tenancy_spec.rb b/spec/netbox_client_ruby/api/tenancy_spec.rb index 25319f1..8c6e97c 100644 --- a/spec/netbox_client_ruby/api/tenancy_spec.rb +++ b/spec/netbox_client_ruby/api/tenancy_spec.rb @@ -5,7 +5,9 @@ RSpec.describe NetboxClientRuby::Tenancy do { tenant_groups: NetboxClientRuby::Tenancy::TenantGroups, - tenants: NetboxClientRuby::Tenancy::Tenants + tenants: NetboxClientRuby::Tenancy::Tenants, + contact_groups: NetboxClientRuby::Tenancy::ContacttGroups, + contacts: NetboxClientRuby::Tenancy::Contacts }.each do |method, klass| describe ".#{method}" do subject { described_class.public_send(method) } From 5efa35873a99fd7d3888a7e64a50bd3652e3e009 Mon Sep 17 00:00:00 2001 From: Brian French Date: Thu, 27 Feb 2025 14:19:44 -0500 Subject: [PATCH 04/12] Delete netbox-client-ruby-0.10.3.gem --- netbox-client-ruby-0.10.3.gem | Bin 63488 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 netbox-client-ruby-0.10.3.gem diff --git a/netbox-client-ruby-0.10.3.gem b/netbox-client-ruby-0.10.3.gem deleted file mode 100644 index c506907f7251836daeac1fc17844cc7bdc2bd4df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63488 zcmeFYRd5|a(2Pz z~9KaKy-x&5!n{kPBm zzuF~^f&){nY_W!bT-Mui{>z01ST!y#wIWYA zPjK58dUW1Vz4s>kIK^g9gsLC<`0^P&SiL*#H$ejhU-{&w-%*ckogyz4&5y#kajLd^ zOq|M0;!D-TaC4!CcB$oW^{E%)Eey8v^LCY+p}y{=~WE_ibGX0KddxO*V{es_P*kMuXKsaK%(`aKre+N-1Bn|-A_ zbG3NFZ=6|s-AhHQjyFUaZ&V-e>vB#^VNdxt_Dsy~ap*Nd&4Z3YIJ*tpfIn7$OIc5Y z7BLxq2jKTZ9#%ixrC&ja__%QN1a7tkNM@Lt-a8bgrUN7CI?*WFAT>%#Z|@7~X;ZRV z4i2|>w~EL=kBhv6dF$s;DyLBkTBLzpKg$_X=1ae^Zqnpr%>$w zN#gEf4oE{Q{sFHg)XAD)fLguV59vsahmc=`9K z`n=&-IVJP@lt4Dd1y@RPJUX68u9L)U2FUzTN7a}r-F%5u${6l(T#3IfxyX;q`o*JS zci{Lc=idhArY6n;gjG>Vb)2UE#3LVSjq9Fj$yk*HjUPc3WtmtlH_F)wCAQOF?LsQ- ziMbBI5Y;Y-#b)!EhRDxNT%sK7lH(m%%bp8E?sWyaqmIHPiruzMRwY2jx)IuxyK~im zJVIQK(>J9XLaGj4hk=znxBC^2K8f1Zp3&s}LHLX4;bYGlTo(p@!TuHdCPbjkcT85D zBQ~l^OQEOsZRa9lt-P!br>Ff76zTY?Mgl<^Z-)DGk?=BJlFZ@0?W9MBv(rtH9_{pb zw~t~Gj;jtia6fECMdTO;Q%vO?`%4};3_)4ORS992y1ootq!NzrxC_YGK)pB@5b9k0)i)*0u0>pjD)*apA?ASF*l;O@; zGaNNmk=W7nn1#-};S{uPjr_&h;AkjMF@~H$8+Ax@hKv2OMXZc8a?=TpKKqO8{tXmE zkO~4bm;Sk+P4Ryh8U73V{~_T2HT-AgVq@cG`S1A8&dvS*F!trZuc!Zycq4GiCb%8))7Xu$kG0H0vtEEYEilcVPiPaH}Y&6~x6ucS}jQ)5T1 z#W4Rm_qkqoh*M;KSgtQvfy`HKr`@SL#=yED;c(C|dv7|z&@+eKt(iBEr2ATw#ss15)5}{ zzO}c(6JgXx*r&kmcD}Z!(3i$A0KouvUPmv}b52TQ8)A1Ipw+;`9@J5TZ27UOiP$In z7XS;( zzYAci%~S%sSB0r|3)i6Ct$>|Yevau=-8I?89jhZ@e>PbL%Dtva^2caO1R>)+xUIYZr>#J7_er z(0Ma2#3TH6R`RrARGu243zbkt6??|62fQ_^V-1;0+q*L#QEJXG+yF;o=w$W!u)8-B z(_^dv=dJ%cc@w;9jzWAWeCS6lL11`beNqaJ@65mloH2wj;uW;q;YXB8#v8cJj&5~d z_)7^k2FEYb=21cfZ}Q?NNK_Tzg_L=4D_CL*woC8l6?bX05TN1{=#Kon*@7WB9QdBT@AQEE%?x%M%*G>ZyRLzBDON40pFD} zI@qlnBc6HiEcZe>$}qoH^cgS-ks+NCzI;7LH=e=rqpvUea(sy+yb=hhu?^{!fnV^y z!Q=*8Z;iLB8Z!qlh;zYAB^XGicTrP-{Tq=rsAM3MJ>~3S@SZkuIk@L9lOPdbNcTZ- z!RPA2oz?=i;D!Wnc|>2KQn+ML^zG%4!>AMdF@y3(QrZEmTr>fncHu*S1aN-`xMq5p z2eq=?t`dMa6@5u^?iXPvLM@skaqFt5MKc#;Evy&;6mYa^hYp54daH7d|l! zsHSV%Af&dl2H&HkzRIWS+s=WG518waRd*bS0bliYOX$^(a1Ir#sCF{wcSHCL&Jj#~ zdmMxnY6|Fkl5S6)Ur0l*R?p}4+qKN3H;h{6t>OfSe?5>jOXSgeCbO_a|JfPwa zq-OOG1K4f4Oxln9{jaaD-dYq@C@>U9>#OyfEq+3RUcn$sfVY>cEpfL{J;?8K@djWl zs0wWS%^^^hC-;Uiuv8viSu+NG!t06f0P1KS@E@^gR7 z3G{tlJy_fU0PfeLKWUJQG?`U-F$ON1f{YG4|FH4Du3T$xM$)(wSC zRu_$uB;kFj*N`y)b_3dssiQXn#mzxuEp!cENI%j*=#^Y-9Erk;Y}-y5JlKjhElR{1(yGV?%odEDtZ@LMNj# zP)(qtRc9sRE`b)(h1cW5BiF8qpNMk1`7XbaxC$6H3B2pWF@l)Y`p9?fFMVx}C{`?x zCYEd#tGtUa;8#sr`uaoqzL{q{P)gKT)>q=$OQ0zCi)`7rb)(k664BfJRxypwDj|pM zfEaugGvMvF`JVO``V|R@L`1jiyP0!H4#5Q-Tyvq643CS(2HGF!iP$}} zR&LJuN{U-_B+z_Dy-|Oz%^I=(0K^M_d|&|fVDqX^0H=9HPkb(2XjYMVGeE}WiD=Nu z$rlJ#50n87l=g-mbO#G@ZM6X@b$gJZ7Ofi;!7AaX2yOP z=XoJZ%)#{niYat`Dpf+D_2Yep z`^38TbYmv1H?kJ69Z7r{Z+vCI* zGy#u?u%*rqCcpKzcllY%tTb~Lm-9~%KuzbfHsS#c8tGvIR41(KW0Ghg`}4+}Hk!T! zAQI6?iPY27*&8Qc@*5tM-f=@_1oWp zFDQ87--#jzz>tj&S!^}d{32?;ra$p%q+nSEm`tzK@Go{_zYw)q-h}JXfj84B!gs6p zwO^dm25wpy+)q*zgT$(CBp*oGQz?){boW@;_#$oh;3ZP4CpAu8eZ~cg>$0#Upszfz z^72l8N!Mxd_PjLe**In9*pK<}Q}y-U8p{K~^t%91c#K$KBhb^Wyz7yQ#inyY{q+tB zMgkCs<6~kwu{h2ysoh-QhA`OU*6`Z}kz0-FbNH9jH{!s~#s|Kcyx|y}Dc7zJ_2Ur8 zxkbTSmYS%K&Ln&4^iF>prgV`=S1yuQ?Suo0u-yb#IX6M7w5D;*lsEYkYhA2hz2Wq3EEm}c<{;?%eV;LNSIMZJ zh(}?ROSqH$HM-DCa)~hXDlDK=qKb2xenY*KD6wZl;+AD7T%y^6-~%klZfn>KmL@;c z;%zRQzhfD>I{xQjL^;h6b?YinEp-Ud+bYWhTCoEvoT4)kd#61KE|27O%9!C(AJcKa zwvara=W613@ zyvK8l(;1P+dxd@&yz-<2M2hG0*UvZa+lSMOq%`U@;j60vcQ@bP9KF2!+Of&2(kK6% zztbhar)|{B3kdXbMVjsfYbg7tE?b;_v^G|m`D2bwKs~lMoOoi`TbkL}Or1X+&C@IP zlNQ%HH!t90tK@!beG&()p3ayU(puWMSD;ieL}k{PD5q;f-H5Q8@BKO5BnLd@;X72( zCarLQcXV7`H~DMtNgD3!58T;VCFa?^6CxSkAiN@=i<@g#8DUPILB1GE?#^FPPlypb zQV5^2(PV@Qy@VdP;N2T;oKaTMqv5-G`F!ZS6OH$Pui2<@P#0h(F3zZn@0z(Rj{&%f z>}g}Q4{&_-{RE`Hf|8+5XJrF|l)fbdy|o(K(A_|hcgs5S&EZtjZediD~VZ>WH+#mmDN#$cn|^meDo{(jX4CfswN1~1)CQb*(gl1 ze(HJ0%ch;Ts}>kgeK<{LwY$P1_Q(bXjBBRYE6*|8+^ldq?X6B=MV~l6BM}TE@hW!K zCpHsiQP5IJB&ep}OWn{Y(9w4H^>fdfAD*xD6Y-^~WOctT$@*qc1TiR7RkNXU=Q@hc zqRpPMS;EyhqFvWWNvC%2N%`QNT#tMjf7N-)=^WVb2`Wo8#AZvLCQ;ThhK*&M(Hhrr zTEX3IVwr;-a3+KS$_j}R=8*DPeAM1i?tz=2Yh1bbAn!3^TL1JyNA-C|T3 zlGskTafV>86rm3X3RVvcvcC2M#$cEP=0e&W0vEB1zFxPQ{8`fx9A{l{Ustkyksbd0 zlcM*?3RcYp$ox&Aq-XChc#OqixOc#!u@78uLJ7zF3{}UqG|=DVn%?rItdaYKf-?88 z>&B{JH8&i5{j@h-T0M$QncoDNiw?m_!> ztxs=E{Tcxo{fiu;aCDaocEGM&-KD}7;Ix~9zAGf{jPyWKH?tUo*=OGsTK7B15C&$*gDc;29l*rv<*E4pEt}v6 z?lP>VTVV31GABnKVpImeyOO^VNq8eq;%8l3a4czf3#>eqTj4`a&Kp>>q@Rhu+B@i3 zJh(4xRu}(u+~pb5I>%wrlHl;f)@%?5BEnJH{nd5OM-^zN0OI+t;q=bOVZ5>Iek#Ea z2U1{FKjz(XjTeUD^qEA#1)PEPP(8X#oo$gaJKo>Z%QYzzQC>y8;&uk(&ZYFeGWK7Z zH+Cf%^?Er^ncT7n@kmS-r5EPXOg1H!JNGS2Mnk8$lVzd(*Q?eH{|Q1*U56A zm{zgyzBqPe+)t$x!pibM&zIy}-8IAQt3~cke~#1!>)g)t0fKvb(1@ICNcz~n!n-{BVes%m6U+jG&xNYP79V4z&}rK7xd&yJqjD(s0< zlYc$IjQLCpv%fD2(UVtj@vP#pz((>i0w2(i`bYR?c5VF zqWxiJjE|t!36YO=EHDo>x|lnoadmeBGu4QU@7%Mxf>Dq}Ky?_G`i@$G<1K3omwGg4 zGwMKm9np|-o2w>njQM>wWvxuQHkK80L;waZqi=AH=TvBzG!3~GV&=M0$SEnn!y68w zob;Zfw2`_&CK`X%9vb1=&?Ur0JT%-=Ak3C73R}3vl2kT{$5cr#phf+DSz^;5Qvgge z)`>*T(lOj*Zqbawv`r}Vi8k7`W0Q{T?W zr5)RfqT}f<6UKVnFP}T*33ujnhpvch#BV`I5}6p!Ou$inbjkKE{m$mwOE^;Xu{LY* z69-OPIJo2`d%t*gno(o-KdmJEt{us!BnQlOEK>+g24gU;*%%1+%HP&nza^~t^yPoc zAry~CXO3w66R9j1C36h@{Roj&7n1~n{zRk#VGspPMvVS*jV$vvXB_5oiuPb8N>q)e zSx7EA=Zm2>dl_bX*Mp6Qst&V2Cl10n3?6$}#vY{~?Nk3Xz;n%z+#*#|Zr1^$KiDAb zQk@39zUx4Rqo6mNKj~$7*9S!kOrr<+bGn0YGZzCFyu8aFov^@N6%)t5MZHG&H?0U8 z#B~>8Oix)Kt^-!+0xc)_=Qbi)`Xl{pt*OWJZ&fFnY{3E-E-fWLd9kK4&<*Gb00Mw! zK_TUDLzJQKq_q4aEB&rp16k7sgiLE(Tu8)-;XP)HeXY@mBSZ4V-(jUKZVmb#gG5nt z2G@Q(gtm>re@~E^3f^;Q&{UG9ZxE=vrBVgq`3xVRs_y=*Hy*-QnhpF`fB5_Qn@h`2 z6J=bAqjOP~-Z4QDA@1&*Ut35mJ+&1^5j7)}y?&hw1aXANOUo*>%Oy zv@ynHVy#BhE6&GF)nwf@1Rl-XvR+OP=)wn6){w%a84SLh>?Di8vfpbm+iZG`t(6J8 z#jB~l>4W#^2(l%fh8|x}3^zc1h@M`GE41}`b>&AxN%v{eAdxvr>^2n!VjEp2nejMZ zj2!(5miIoYqVm=NKa@_ECM`61bY>EUW`1K~)B5x@vmV8c&cM-ekg*&bPz6beoh#FH zVV<&n8z#h>L;FA`UjP$4>Nn<1vWF|WK---O7*{zTVx|3NCNcODV=~c5K--2QzR8LV z9M4LLlC`!di_IS1c?)~B&m8|<*@tWmjXpJraw_!PKXA}F$^~5yAJO=nd*#D!z~AdB zwnn-MA`kOxvH@^~Jj$dMvU zbBm9`^vfGmpa~`24@44@IYp>zPDSNXIlo}G3g6JT{f%vya8TNE`R1eDh7{WU!@)A1 zP#BKR#7oS3bKFluhKmwYOEJYZx+-NCX?w5=Oz2GM*@30yPDY7@76twrb0FFjWpTz; z{606+Ryoc~pbHz|=;tcG#=|4VjXy8J7#c=6x&(AVHSNXiYFGnEYA-Gsq*9u7)PWk8 zbXAUXE1^cBdo9YifI*J4YSH^E`BQ>hK^PTko1>u!5z+wbPpF`gGR9N0M5GMqMl_o1 z3+cd+K+OpkTV#OxS@Kt))}*DdSj@FKx$%76c&T3~3Dyq`OVHcTgHLO@g|ZV50LanM z%sI)DndujIQWIL6MG7HlpFsWbMXw;a5+tNTqW^E|8}FX&DJ(CgyZ|ExisHIzHT;Q0 z6qgI8{O{Ut&_V*$mrGNULXclUimkx6puD0kp`B2b4a%K6<$P;glJZI~VX#rS&~56U z-Zo7XmARlSs|}3UdLKI0UVUnj0XXF@k}Y(oj|lcP89J6b;AzNCe_fa%9fh6g*|Y~v za!J#W)sN2HF>YdV87FY}@G1^0;H%_VQt3PRQ+%TmRLmiJy}`~c*y5jZ0^tq_>uEM$ zws8)fh?Lhh+7#?8Dy*g;QA=uLaKIDws?2>F;KOonHgE=Od`NeTwiB))%Y;N>N4Ivc z2jhzUF%)OgSkT+96DJn*RN1@L!|l|QS3AW`{eT11W|{Gwgp}75{sV;v!vjm*NzWQ~ z_Way3>-(1d{8k$ef*1E(h3%`j0gPpX@KK&--}2&iKee-EhbN>>Jx%!C2441@?qgq_ z;4C3tz{rK~gS@Rz2xotNClU%j2@hYJW!mFikK~tt!mUMPku~D|G;lfJ1Hp-&mhpou zi!XX{k5At7P%S_puR8cp$V-^(bEyK`e7s8Phl#EGu8ACGOrgJhP`YrNE{G(DWw`=D zwqQBN@eT}Z!yz_akq^Tb+hGM4I35=QLRtu}#V0Ud#qinN=2bUv@;z1LH+MF^d)=dr zQZHi*KMKZJs{36yylSX+%YO&0Dz=d!j;}NB1qoAEP_66u|8`XF?rX_gwjrH48WQN+ zZ>pze@cP zc$oB`@jW-8{(yeVQ?>H4aT)@Ajsid~pZ9O;mF6G!ucPw2F=Z2r7W*EH6Vo`o^&@~$ zc}zBYCFc}->f%b4nPtu0?YY5UbNo9$Se(!7P)4qs;z(oi#uPChMGOuZwi}DDwwQzH zPhEX?4qmo|j=?~?2gQ)I1_#}=xbuyIsT8K-Gq114G!I)Ff*NwIHu-1M2#7U#&E>V{uX~M z$kc;58pKJ@4zv%QeaaIWepOB#a}jjh*?OJW(C^flaXmTAimL6|{Q5Y*nP&?0e=xO{ zu4!o?X962-#@lbrW4v+&CO`%Y)qq;{K6+<9cL+glYXI=KSguXr z^r7S~1!BSC$XBG>t`vq)4kaq;7+{<*B7aWsY_3!n{nCyKLOE#rHEMbRdGUs(I*>1k zZ;C4sX4G$S+ahl%oLAs>6&>;fF#q!SE}eLdgMnKf&hsHjiKe29xKFi4O5}4*5TJExb%543;r8k3(TP^|(DOZ2!R-hrM6Cii;`{FCrN^8?g&zDKMF zx0{^pZmqnIO$rNabOY~V%n`Q)%}%UeA(Y7mY>)OnJvqZ;YaYEmzTwe!jyG3z1vm){`;UWpZ(%85d}P^-Y#RU{`M$Cvo<-_2F>I<@Ex<_;pd{;@NLUk8t7%hMOpb5?<4b`;v{>RJd%+6m_ zLjv}d#`}B28Z(_mth>|;TYO0A6I&IXBZhwK0+f13i?RN`lKm1TJuj6m5e$bfoFkMp|!>g?QS%aNR6ZmDZ}SpHKQ$H43T zWB>m2Gx3=_Mu?Xe`ggH$z!wI<%dfPHkM|3BdX#l=*gqdP5PBj#r;k+~Ylkb$XcH0d z10JxVfn`~#rp~&~AhDBmtXm*LMvM5pWhYefe7QSgQsYsGG!<5(u}GeQ^Q{=dXcZ>j z@%#=~Jhe5od95P>(4o`FGi&}Q2zwAvBug~rJ<~&kWxwx32BiB@y|eU z?RYxbm};%JOv_e+tL26dl2(do1!GvVjr5y<6%q|NePgy_gd~%G6CQ<*BcrR3qtecb zG+vZ0kLgd|x^xaf*7JI zUMf9LD5IxZFZ>W)l2hu+7}+r+2xl{sRs_CCPF$0k_I&p9^VlvKcTErmDV0~R;=&Eg zo1cq9Q{2_>=_$qupJkQpdQONhUXCw0HAn8tyNji+{9Iu_j)`I%F>hBxr2e+#vdugM zn&TJs_4s^=XMGhhR?00_w@~U4dCL`2vR0ULT2%a)i%i2=JN_BO5V}Jp`7><9re1-7 zp34 ztawfb7O^<)Bfs>)wX4snz8hSD)4XQ z4>cjlIRnEJiiMQr%)*?7H|!w!OSYJ4)x!tUF5Q-H>EpEqB(H)cr%glf8_Qf}k@5>D z(fFAzVwEjFNug2bgs5+JqD}<3T#Xu-wZ6`U30shBRtt0H>=Qp5wVqZJ@Jibln}vg` z*#wBbTAe(zT}~cKnHW~!wI@=zVSl}a!qbkcI5QH5dsvIw`5!XOoeWXa1H>le`F-R) zW-zBS%#Ky?B!Eb@xsZ{)8eiMYQ+WIy-^;a#qIP8JmvcAto^gExjyn)hbav_M*dnK6 z^G#NrCN+!CT6lS=Ur_5Z1a>y|Z^ZEvPO5a{5s5NuysRwBFEMSSl@!YJ6OVd%)9_%_T*GaO+Omc=^sPG%L>G7|jgCscQFLQAqJ3N&=C!7p)OP<4S7Jb2e#35yL5&bw2S#L>Emp}&0`EM|jw<=6 zW-skJ=vaMesi-08%8Jjkc`a;fDRbQ-zw!$1-~t5+Zak>)6Xjp6*Y_a@>2Nx6is|=^ zu4f`mqLyk>>}aW2&PMgz$N{TPNO=q9N=Ia=FGHOoR3+C07kjOmMP-cJnevw8U#<4~ zT0`fc?^rd^eN~<<{Q`d8$Rip7T#1a^YaUOfP%eU7$z9OhTkrk;Li2QB27Hys3XXTB zxed{uF7A|7TE$$gt4e6=mDBeV$me`@iJA!%oGYknF*IS7^e_5c6L}{KbCiP;b`x2H zmNC2>1=IX;e7>nKc~eLbCkAraGM`B6V=4Aqp1_ezi{YuvOBvBb+vQL+msEA^+^A@Bi=4;L2v zB;sG_QZJrtBnXhRK8EeGESr7X1Wp%B}8gq3<2hB1wHp+2sbygWVuOwqbh`YXvr@=A&F1E zC%+yViAqCBice+_7hZaOcR}xyLU%o1q;1~t>gT1ELS?3X_Jdf-J~rj9$FeM@7ZS?% zxPAF3q~)&>OF6rT3oD;VJS%8ay=PP39}bmFNf=)o*K9h<4t|T`-R}GJ)>jOvT;1R6 zjWCYLkGmIJ;Dvp3YwwvJwY8Un1hjm*W9cj;y)9}F3XuS8yuklOpU4Weajrblu{$z zPK7JF<^_QGfT!y;i{AwP7O9O}4GMvVUgomRsa9^g^o*5H6z&ijBOgc6SpBLt$QOel3w`XUrKEKp&E@!-SD6b6EXQT z)wdkA7PK#P1^Lgm6FM>f2*aS#*0}?onoeOC11t@QAvAnDwVb6>%7ZdXHYyrma~uOG z-BxcXwzk$X{|=egms)YRt}JLxdTIKFRw8Lynu61!95m%lq!k(-NRhBT--$k?0hU-| zj@N5`Ju&^*=j_%M*I z48IK9xUUOsrHm%2eaf{Q2juKlWY_8Q>e()J{RW~CDns!sP9{X31Tyy7u1cxT6;7J1 zC!6$_nz!jHV;-)zocQ1h?v3$|Ze z;MEha6Fjjf6-Qs65^ZI9uX%O$pBb|gLKgswFH|LIyS7818)f`{UVFxsWp?I z_Kr(8J575Vua#~n{taaEYi9qDQ%i|CFy&5hV>5(>KAwcK|~y>%EreeJbU3-uk% zP^O1SySv9A7I=Wm{9eqoBM|q4eTJ}{O9P{nB)( zh1(6~JPxHE)`*`azf=+)_zrB|D>c0DIhb?W!at>inw`f^DmZhR53%Ihk`2TVYBq@@ z4BIW!ND^!IuvYB-_Y97(^CuC1MEzdobwO9A8&Qw6J z<<%npkxDSLkOgajL*}sV@NJ+un#%jPy4o`OFnEd?&Zn|4dY=lKH9iG4^qnUTW42q5@S>(yhfIF|B)wNOmDIk6 z9(SEc3>Hv!`ru+-ziIJOT`(|odh+CV4W~p7G>g+2(5-y8A7$2ZrSBLKScAApmru=u zK<;dMDNfOo9Hl5HFc{UC<<(+oGxUzQBc7>SP!y8FkbhW9@Z#s_G=Q%_V(GUt`|Y7! zrY~;c*kt`Hqxz3OE~&Lsr_w+j@eJ4z3~|xhIH6bJDvBa=_=nt}IZwmKF)aSo!rDT%b{4)F2P?;B$JNT54B{1@-h4vh zF_jeF-x_hW&2V0#@MUflpOjM`jxE(@$ z)*)r9AAfO;Q`Q{^#*AkKyjdOpu6>(WrlQj1Tm#a`srrdK6{L(<^KKb)8_9Z}QmcC( zJ7CWzd3o7bZ9}*d;{Z3aFd>dEt0?SRCBK~wJdiyVnv?NTWUY9NkZ~j9W-$&qPrdW zz@&p{2;`byUZZJ;O>pF{rn>HZm|GihOIrFBYXY4Y3Yt~lmrK147`UADi`?70Q&B>a zcb;LzO2ZjDh!0Lpk@V~?=XD#03@N@DOP{oevPV0f-z%C7=3!aDB)g!XZLpDB3oOKqJ!N3H!@UqTCvCmKI zAziJp8K(Q$_jf?`%2fxOUK$ZeYssi7sJ*JWazM+mH+_e2GA(5CDu{^Z;v#iAXRhnS z%vf@Bt55tVkShI-LYLe zW&(i*nJFjCd2VqH9;St$s9a+Ujr|0>jNKm>mN$zB1d1p>dl?Sk*g7rB$LmwKPDl81 z^I~-VmT${vDN%Ubr1~8_OiAf; zpvz6dXg-3@ns$EtluwfFgE3QOHXz?aw{Hrz>L#rO#dtMGX4CUD!F|J*@R}#Qo-1Xw zf}Clea}+Tu|A+}U8+=L*l6#Y3BUVy!VVNmiY}EkU3IA!D&{@^Z-KW4`{;iPDi$>P4 zl|E9&aKrRJArHmA#TYMe`%|ujyg!SD0|GKHopTsN{dzA|N*EH?E*zb@bEq zW*=c|k{pGicxu%)6gB2&{l+TfD`mFpa5}-_J)OI4oEAXooV{NzJl1P|hfs2lHVS5F z^(8d4iQZ@!r~av*_l`NuNO#PlpPXdx^IdwS4TEvh+K)uV)*VmsRl<|Mt4}sOmuzw3 zzy%YpWkX%R(upi@mXJ9CER{b}|K)t+WvBI$6nFWGJJ5Z^moGSRtczxWilph&o_1`> zux*&c{={jIU)>*r!On@qPqHJ+S+R`8D5NbNLtK^l~BTYfxkqT-M9>oOv=W! zJM$!3P~2k{=#j>FAVV3Rp`{Ca$yW zx)C2{9rrQx1DXDFaQ{xge5}IZh*vRHxF`I0ovOviSNdMgnAx}oe!z%X1cm-1gMC~# zPoI}X*(hwA<77*bWm0#JzU`!R{~NBGtnoS7b<=7@v+=rPMlIc^ds z?3wf2nrXzV<{M_aDr~qNbARHI+rPIWmqknLG%HTlJ<^3BT*A2j$|dKIEPN+l2@uqd z9Y}1Pmlwghl^e|?v2lI4DJzq63>>i#4Qrj}c-5p=lF$H1rAaRC&Rb139JDoT*pN5! z(vzf{xplP)?dmljL=Qw;uohfK~e zIECS6#O6n{4XXHXac8nJfDJlSCi%gDl*_v4RCy5ZyT>|tGY-@JXe8u+rcl$JqMx}) zZ};yyh}thj9wuaSa|^0~Ot4j1!<{~1`)=T@{>_y57_tBiHL3g3?_50(EZ$AaF6hwm zJ(k4r76Pw50g3nJSc-(|+qu-bA9D`!Rq>U-cDVZkz_P|Tp8s5u5B?`C4>;YoGc}N+ z_e|xw_!etIiv7qz?dBF~-%}k9S%2KVr>ayqGaJ;8+mf_bIh#*mu-9ZpPchxGxIcC} zx16HfY0urNqil=KjurW0^}!3t`KT%;N8jW)K`!j zs@~ylb3U638lobKLXZ5`ME|2Uh+uV$FrudwtyERcVT) zHB#9jy8S;kc_B5Xi_Z&K{?U`#I0h=D-j~6P@WXSu|FmBdjeu_Thg30z^jujrOE$~D zy8fU&w)2k>3}&8adH%DhmfHQiydKs_x7)eq3=h|AxF+ryH@d-mJx@y1M!j?m@zg7r z%XYa?^6j0`cc~DvNAWw|k!{wEA`9_^(a;D{-g3ldbIs%o1I?gk7(L}}$_l30^xn(0 z;fL1{?P_{^!rM~!iJBtfN&b)EUjKAU2D4D5Ay+=GVGZ`U5jgdL=0EK%$jotz0Z9k( zSR*6v`hQbL#<=uJ#W?Zn>l+nB1?nlh*varKnr) zWEhmJ{=?bY+w%$>fK=Y+W3!e+u%wd6nbC`1INZgy4F^@UJGoh){T;QLNAfxF4tT02=&=#u0Qk)3K@KK zb8UZ`IIp}8{T9IOm9;ul#8s0s7cR zVTOA#bDzQRZv^jY*zxLA4vAsSXCd%5jHKxW&`@cn2FG)ZENj~T&5jHj{LE%xum8anoAg-hzY28kfE0$Nc&nzN2)8iU^Ew${t?aLc&jSf4OCGIl;Jn-D`A1zicL85KI)t_M(Yhno2E% zr^t-R$oC}A6X~rtfp@})bWyA&(1kl1QLEEDk@|cH<;{ugCszBLsY__+p zjddR?P%8^8i%xUc%Wt@PLAIARUeYtDxB_n$OK6$EXj`%{M}{^_asFFn`atbLtM z28NNhq-B&W5KZfs(g-|&-@~k0usBFvnOTVsCyzP20rjnK6HQZM+zo6SG0;)+!W_x_ z6YUpjXcWCA48a{KJX_Dh4(xxUS_5~;Qy}@0&-knZRZ-Sre4@7EF9stM3v>TtDJ`@_*KtjpQqvT0oxCq;^zivOL=LR*(xbIP%9 z$+&{v8u9h3B=E-icZ-krWIiFn3?pV(|9w%B{iWSQi(pQ=37#(<$x`2jDIs`Ef~kji zDMo?yY2+U6L*vQv&e>FFQv$KI2tH&@#69xcA!FG2iv1y{2Qg{u9U)YAC%mCp5PyHB z(ym!C?5o>LR-L5`2Rge8)lFwYw2Bi0k{RbwZ`Snx0E9q$zo``Ytt4r(NfjdnWbW;B z7fz)c*-A8lKw|+ro0`Scw-c%1vGBBNL%?_*6F!KjLUZ>P zIwo}=@##?VK*ICJ?kzeabT7ei`{RMcCQaR6Xe4tVk#W#{AdzWP_ZFFuxsS*!^R=VI zoElBuTLlui`>WzXmC%~_O$FbCk-waI?qb@RxIz=#2$`U7Et>6Lz3V2nDr@VW!g4xW zOFg;vyV!ItZ0LUSQX*Rm3&b}MAuDa?exec@%_Ma{bh`GI-^vzJ$`qQ(2toMzx+~Er z@hv1Gh|L7?md@ODqR5$CWen&BUZN*kBUBns?SCr8c$@P{eO0T|iR0 z0yo?&I{SiB8(T;x;y05n^4I>tpWiK=byvcPO>7~XfZj|r%xQMI*?rHpu!Ud=b~Cwd z-K%Tgf8Ui*octCNG1RTZ={z*cv~v#u8-`@$+A3#02cRwn?G*VYa>=Mo#EI{s?M9r0 zd}DFMdzovCvku&u_n{kE812S_P`oBm1YXdM2uQdw|A5qp`7XA<63WflufOdjU1r~j z2%LChDdaoan+PJ^Ox~qXQbXGdn7K^5mayc`<4&X_lpBj9-054J|86$=Q{=ajq{&8q zd{1XLf&k&>BE(lwRxzKt>9B1PQskQml6!SuGjTfc%sEYLFIEFzU3@!S_Y!Wi#9eip z*%tEB%bOlRT-wk*r4{cRsxNGOB~Eu@#!YM|VCr6%x}xzbN4k=W)89rY`2vk9iG=$j z+7?D2-9(Ped%>Cn zPGaTWwxtqjH<2b=leS8Vf(oc@3slfd6WK~jcWx(UH(j!Gl+g(0aRp7P@8@~Cbpt+Us8g^`|m(>+q3 z?wRt<`PnNajHccSc=>z39zSBWla_gt>ah?$xvA_aQmLQjtS9L0@hns>ij}&TzBdUU zOx+xPYrW^rN^z!B1v6ylth zGj2EGzo(OilLvp?vBah&NY=IpJP=!#fLZe*@Gxe8eBGWw+9v=0D)V>J11V>=!@`MII6$)_ejt5}QuoSgQ%#IBxOMnfHdI zH3*fV!>VFS^d)PBzSqPS=zB(;zSl*{5PB;o5PSDVyag7F1E7&=NPtZmOu)@ly8?L9 zegbYKM#759^v2Xg*iV2NNEVWSar;Ohhmv_DklZ*D$WhX-SluS_;h{g1j+NBz0obwB zu~Oi?XNeewD)p=s2Jc!DhL+~1r)eT90HWuxflx9B0BGd2j(~E*0BB~FkW^*rX}Y9~ z2WsQ(@doKW9wjdD2Qz!E16ew@PzhnF~^@Pov;#04UHIvuFu2LL9y5ebqfl?lL- z!;pX(2O_YMWk5-4arAUe<|TOrxMnU_DfBdh5(O)l)f9y^*Aj(64*#+7>AK8)VsV3E zKJOxGnsWhrl+U+_o#tA=POM!lGSSoN2q!*+Kwq-_G(2N5g(7)@Gz#M@g_4Af{FG8p zr{fy`4M0-3D8lh*EdiB6MG=&TYYC_jCgPcSg%&&L>2y>Q>K_2C94@B7ITsR!95$vf zI5QH)D3>4M+YZusZaJvP zB7-)vjB#j@8wPFW@E}Mql9>^hxAK{iaMRog=!1MNCG<4A0(vqu;NkP0PR9iNH@uWa z1OA@z!a$?}fP=91D9Biqn&7iH}ht|^#C(uIk96E9Pcx0<*P&Xfv zfqE?Yb^e~ub18`AxH$-);!==7dXT+x?s|qUjIr>k zaSjhjPcRIbnWP(Ns+!N0gq&ti#MkoqlM>k%OK={jOa408u2bn}fwT%pywuHV2XMm_MLG(uaVOFP35Xw-do7XDoyBZzh5p!b%xt-S$k4 zEtKIegfQiGG7c0klW{mpUM1sj@gftlGNHWhinNvpz8*jsmp8NF<86^9zz=PDtHVTFN4RBiL;`| z_L3peq|Qn{&4(zGv&z9@>|_xoXO)ARDR6 zCFHRAxMrE@ogo2Q*da;~tn@~afFNubB?!W@AUVydkmIa9i>+xVCtML&UinMG^OZgs zMPA%Xq432#8D*Tyl0r`t_bemL8GV705loZ##EoRh=BJ{waPqTZhUL>S52 z3t)^70aEhz0wil(fK0qSJrv8x_blq`#gnoKE_wP424f_RBzgG^65}b2ByBs*yt%?E zTJ)?j-(E<{Tp&Vv?>|i$=?$n9TC!Onp^a2wbS7E&BqSQBY=q|d$_T2-gR}%4 z57Z)pE|1j`LOfoJ2u6yT-ar%hKnOF-0|H6SBb=3O8sVf?5pEz4K=0kV-awB>ANYwt z!_3gb;Dm99fsQhR4g(cN90tmKI}ATJjsP5z?3gKVc(*3Q74pM?1oW|*PAs4;8De$; z1J!ae3^=r$X21~ioKypjAm{IL7;cbi zk;R|`OK6vepz=~s8eU={Mj2)KNKhnhViaMprg?R}0d;-sCuU&C!*T+~tvZ2}2jB#f z8*&1vr`zR>j>Og(o4UNTlfjS~iIL14ZW1J!rx?k~Fh;hl24j&gmM|eN@ucBpt~kmt zk138K^Tbg`nH3C{1K1m?;tB?PiYVi}6$}AOUcpEZ5n|T2M(SH+o`cL4%TTraXna#+* zhy#Onct5ZG&IdWCnT)&j)%)p8x5H~kw+3HoD*pNM`O#$k>ZjHDug;He7usYrI3JJx8eBa0zkaufjC1p=9$3(5Umfjhs-migrg3Ph zeN`Q5+Th>83ZovWW!dY|zyHhq;J~EJ?N9tAyo+LNb*$+6p*23#2mOILvh*Qf*ZxNA zOjEm`iXXQkUyNN(m?UF1&%VsPDz9ahGZ*^F%x|ARn!Y-%6}~g~^AT>@tx+d=ZloqRKYNiK#6R#F=siWa0&P!;Gf?9rA7CABI0-y5>hG~TnKM?BbZe=H zYlnt)s9Jp!qHBGOJsj7dD1-+8*Q55N;)}lW4O;HsgTJrzzH)*4-c$Tx^p(qNFPQc; z^1m0rjpEOg=S&HJ+4O4&30R$c81Z7kr&O5%))bzC-bo4gaP8tZ0&{^W3LdMbzdx|8 ze%krKY*sUWPf0FR+*8DhVfGYOr8x63j$*a)fAlmR^ls|5W`GJ|rqWzzpr&q=g@*-% zTcr#f$8dprq(yd`f#kF>2htq<_sqq z=Q8ZGo`(Oide>33K0G+My}j*o0F?}7&%r4vV@>Owfs1t_(6rY3lk%K$sAy>Q$xprN z`=oCKY~}N0E@G6^_4(yJ)E&Yj_>S~)hdm{}<1M4=;2mfs>izw+XJDd!5bA~=|2Blz z1I)Qkehx9WKKVJq?0Ers)Ko)!skakN#g*&?jWLz5(Iu-FB1@tJBNpFmB3hDb*t%fC z9gbPC8U_dDHyn1zdgCusLk^1H9@8v$poTAW1J41U_hjwEI0&}*1VVop8F`2zhB!<} zR=6N7^qwMI7PP0Z+dnWc@|I3;XM1Zi^?Q&Gkzj)2l9RvjpuDFfM-}(@G|Ntk@58f+ z%~_{E0?!Y;=q~jQjA93^j}J8%$1GLVN9dr>-T7wW1j;!`;7*knRF!H^#f@0-%)JGk zPb2P?{7aAj1&#C!5?+nap=bme{=xqb?Xh^AP!DypZ&{;}O4xYq1n9Tp<~7`o#=pK$ zLVt-Vdcpgtf4jog@&COL2CiELCUe+Hf$?iMaQna!4fr&jvZSS1vPv~$jrv32X-HUl ze(fy;h3Jfm)`Netb`1JJm)b!`TPC+*^hZO@G7W6x;?|2M*GVf(jX=^QM289c8rL#5 zF)VGuG+}-?GHCQHH$iAiO$;(kXrzfzK@+-mh}u&7#&~R)W3dyxSp}(XWQtld#IK=| z=B1BQ+jU$ycWrwQOgzf-((#1Io!UjN8&?wJ>?MuJj6=2X5EWrH6R>^Xp1t3+{%9-7 zqNSwMs;362OGMiiid3h`P6+&kAAp~vrNZh?5Wat3ERwKkC_x^rryKG&G?-}hqC3TM=P~Th$!!Iu8 zL72SSEU%DIGDIgcTR(t#g14$U2{ibpVRJzCY1kCdfX_UG|3%Cls>CaoeJ54zt0oQ{ z6|9yOYNsy}dr3oK6s22#M{mSE379&XAW=h6#aB^CQ^~phH2R0MnVI}Y&0UlQZk78iG(&)%> z0|u;D0w+eNoAEa(0!{=3_N#ys0fGH0;KZxw<0@b?5zx>ofs-$2R0?P&j?kzSkmLz{#!3G)DwQ!#KDIHc1Qs+mt^`gxs9C8xoEXH=S~YZ{ zJX5cRPP&q5R6{3y$+W7W6O~w1oe574ao|BUaH79qr86)veu$%oqG*$_h3nlXuM`bAqU+_XZY;_h%5}4+kVhpW$NekjzXYFiNB0+`aw9 z%?#;!bNSLm&%CLbmYq7rFO1yzmX@6o#xE?{STvjw=eZLDC&77s!$?gbb>YQ0*Ap0I zVkk9hkPj`o0fT&R(cq23nVeoYY12vn5Em^>QbtUSLQS$_A;xVcDG(+`IwmOvCWi4Q zDFG%9U?y425JxGKtXPOckxAx@Vr*@aNud})o1`k2w0L5Y$)FSto21&76!e;87AS?b zCaIn!t*w}3`X{ZRn56!dG=VkAyib~@nxwLo6bzeW!Y9p7O;VgnnuVHVrY8lvCYjGk z(@&FBijtySlazvz=A9;)+ezWANh&x=6Hb#q>*|7??f>V*^k#tq!5w9ZP`(bx(8&-Rq2hdje7RU(mBu1t&&`Fkc&6rgvHq)Zs5~3|-66Msy z>4e=bvWMc5G%a&nBV$i=Lx^HiDf41Sp{x!GvDl`A@K}o<8);~hZ6u_iO}4X=f*!D~ zloa%U?VY5chiu;=1wCXN3@PXl-$_V;j~W?7H@RvV(hc$%Br&zjm(emG#mIaQBl9WD z%vY#4)MC<1dukztVXAZCz^8f(FS;YWIoZfhcGr`d*l~KAkiCYA-BWJ8DQ@=*Npj)D z-mE;tr{j3t)M4^`AO_R)(qr5~zBU&CCJx`TPDBv8Am5D2r=Fti86Dv$4^^cUI%tLe3H&kmh9yQWbt0_vHVqt<(gRa7oiAYb8Q;CXu ziv}I0KOAWz)vT=qQpTx86%cw^1uSOZasuLbqQIqwvv6-P!$^qp>*z=4SvTjjsW{<= zHcbr5Wa*QomZe+$A^y==GEYn|CdAWT^>RAnz6mq1+7^nAqdkQqwc3Y6_)x%(iL9^h zLT}JGj`q5>;->GuK2Z5L1ql zq)tmuNG7rSU#KK{vV~~IC7q%7@20Lig)#4$qUpxIY2pGvPtXu@db|nzwR>>1#9Z;I zv+RvVeR6tc0OKS3SFJuLR~&1v_sMi=Kb-m?@CxU1afW+6zt<~Cr`BLztM#?Pcw|_0 z4DFq>n)^0A<+SkU?MR#=O2uUthhsP1V+A&d%BiBBRgkSL`3}b#GE$k&XBxq{#RJy7FZyZRyAZz6r zXt7{F*3AdI=t))cu_Aryp-@iCl3t26-?3bJ?kfR%NI`ftbFA^5{AMLe#^N(xRDeDc zs$XMr5*{;OiWr> z)=-mQta}+uKw6U3&_%6~3aN&XdXx}1%!C}(s$mIF#1fna6NwkdG=^MtQejGiNs_Jw zX^eY#;cZVS&1kChkx(Yl)aWB##1Q69uZsTy>{!ShY4>bEglaifOp+P9KY<%W&zPK9$Oc;qrUtF|W{t z3-OtktP&Qk$kTV3%2T*9PhZJ}pKy7eK96fMS+TToNhB+lHC2pg01*bgaZ^t|R(UQy8Kx>xG{YFEbaG*^!LS-3pyk?rIKDxwLe1z>ZD~V_F8I zMPeQ@pQt2bGOdncBBn@$7kjb&HP}@y1=|f&20B=)b zR0g2lUpHPLU8xn?sI&qiqk+z5pju32$an$Y=1uVkd}x#6pF!XUJZ>xyZH!-x(n~t( zC|5rfdNwqDU>KB?5tABc)KrU>jwc~0EtAJ)mDXSkhodpWvIH!h_J2UJ)PXjzbxcOe zB`_MB?35M+Q`~`8wrd(AbI8v4u+h5`XJn4l5nXn{%q$#3D{#hrb!4d{#@;w?Cy{QT z4s_ktMtRb~{7=_Z!=%d&Jf5QlC7_RNZCHqI=p0>((Mk1+IW9oA#$$E@PLI(o z34MUA>jmgzZ9w(KBS>OCNfCNmI%2&ZZaSuG- zJrR1wc*sVqQA|%0&iUEGX}bavV6@av>T&K%vM^MFIYRo0}2$Sj|fC`Q}LCcMIr@c!x3Kt_yAm zroo#9Rfc@gOdbsj%!j%dBks4_FyV#NoXp3x!0st#++DSi_$lJ-hynt`AshXSxUXts zd*$BRUd=B7#?7`QjJU7rD(@3~Yp4L%81t_X_e)(PjL&BFY~g-@ZjN__<)FJI9meggz zeH!B@j6O~^UuXt8n!%7+;XvmEz=9G2*Y09%_Qa5Qp%x~((y-%_-SwzDaF>Max=n>3c;6aXydC7|c zYSzGF62)<(PNz{M8WYy0^Z6O82Di&$98c;)F`guMn&snKLzUsip`<>NW?zI0@N*?Z zMng7u50hXL*BKW6EkR%4r)Afw=9AFi591?_DGgOnB8sta<^|YB+$-Xs($H8gLs5$s zgz$73DxT69dR#eZgU05qz7$J0q0~U#m;vQ)j>1-RSMcl~3G86ffbcmuErMPbz zFgtST0u7ystePrh6n9aBcTv0%##wP!ZPUg10xiLmOQ+vu6!%VJz+?S) zV7Y5t=9;Vv(1$Q9rs#3kG=_B?45`eKQJ_A z`s28RnwC)L%4P+v3a~AcMd;(WgPH^CDX7xjl`SNH7El=t*)rTX>7YY!7l8}C0J}lO zY5>+4hd7^_={V_-BgzR)4lTd~3D^R&nsmi+#`y_XRum8#4OC7j?va-0|4E!oR*-WC zQlMdJVDOAa>_06n!%Sg-j5NS9_?AHII4#{yRd_5w9&!<4S7{mXQHrW1B_IGg7!4SS zxGP#LI$_=#(^N3os=~`4HN#-88?UnD)T~s>Pg!(=M1~p*U&&!~Mr2^qZ96>|X#@c- zudt=YebO2h&2@+UA&k}*|8{W?v@lRyI3H*~1Yd-CZApNbPimyYxWSaD#eLFZE4e&D z&5rZaa*2$G5YRCRw75SG)ar@%s6R4b-p)6K;(j>Ll8zvpf61p{Sz5fMBu%@`A{CAx z2pf(DY^y~xMI@^Z*W&9cT^f{{SY6z_kt$0DL*HooBT`-G+?+~P*KyV@+? z+cZlqpAdv(22+%-3Y2Ipl}dRi(AU^9EWS0U2{dX2RAaC*6+At|*9H6$yHKkL%~V-+ zIlSC6K^seoC0C&2;}6CLZ`MrkaqTS00)dV~wk2`Tc9Ks=Lubh72wfDnM2ftTuJ+ZD zF=pWs-V~ak>HH?IFc%M^@qxy_n9w_6?k}d6Le1dv;mv^;=QN>fg(Q(NTY!^ z9&x0Bh*a%ob)&Bi4V6t*@ix^s4YERMfH)qT%m|GUOBo_a&f2p{?ogPEr;Sa0z&evL zP7w7vIzn`|-GVo;X5)K3b&*i%5+IO+2uF?62(%o62ERM0WZi<$85lYn<;}c_hndG% zeke}Jjg#yKBZr(-;$jRO$awutya6_gJ}Bx>2F5EE?}Vn6gFCG5R%TxV8V2)?sg0Pp zTiM~S8z;Pm$!@KE3#2;G%@LPtSeoA;60fnUnK+hOx#1ywkZl)5u~`s{B_7}vxkgU42uo);aa zJ6G+2olqZ)xFffW+;K!CU(dY**|EwOfbb&U>MgMC8ZmT>XE<5;ep#Zc*QGmvu!Yeb zH1oVtdrcgn2|*8Z4Xyt93^snXnF-2oetas7|9kvCNWAOH*~81OF+&eep`_A6O>Guv z(T#4ryIs7y4Tqy&Z->jto$=ApZ>*v7YwxEY-e|8rPR!Gf#~;ovk3Rmie5JqA-)KKy zp4^?j`+jkD`Ip7nw{O&+-d!($zMR~>`r*X-`EorxS&XlzKc4$P8sC5X`NzM^oFD$? zop~o8PP|+1NBtXZ`t9{>`s3+hvKV_m{csxm{DbxWwnAmi)T;35{inn6i?$b&a`@!bw?#b`lC@7xwhn=Y^ zX(FyECcI2tfRfQujT-@S8)bVd-ATn7D3U2Ym6$IPUi6`FCm8N#b|@B-FA_>vIc{Gt z45m92jF2x9tmrPgZF`?Mes?I7)J&0V!f}rFMeJO-3bF1fQ4$8WDn~+=-M~mnT<}X_ z$&p66kO58U2goN=cjjys(UW9Y5#!TFCpNR(;L1>YCpSyzvyUdc;itOUiG`-8PqS^& zZQ+gtp~R^ay&hy@>+PCBFU7+ zkSkt!pO8y0mUzUU8W~s%CJ;bB3yEoE&OUEj&W-Uzjv}@xBq1oe3Et6IT?Ky=;LSD* zZ}ol~ep4&=ZE~I>9d|f>K%Km2egEgL&k0=aYdRo)d_!k&v=67XY(WQt*|YVEG?NcbCw=f zjiyPu#AT3$uWW@YFUX5sK74$VP-G#HJ@u6NJuseSUlgX9iIbrj!XeuUgc$ZY~f z=5WOgj1M)fuc<5#1q&ewsN?aN+^nwC7S3o3eMNxLYkiq`@wdG%6O*j_u3Y9;rs>Z3z-*vE`ml5`|cqr43=l8#D=8G7H;H8o|i8sp7M6C0Nk8}|)!tPTb# zVvMykF-#jcP8y5Uem#7WdH^_VfO)sT}*X!!KMa~im z)Tp4N46*X7lEE#5xvB%1wGm@2^FcMU{CZ&xH_iu!thN#Bx|yC^!{gGSs6BT}=`|V! zliIlA2*?Y9#xW?nLL=AVvZF2ye64}UHb&Nn9)J?ZGb~o0_J!=J#_u z?B-Be+p3-!Q_HH3Pq*u-?d0{*D_%MiiSp8!WcQ{lYJvfAXbuPFsIKg6pS?Zt8NnL0 z9P!YqKk>12CYjQ z-Z!b`EcJ@w)%ar9t70;?WvK=m#`NCzFON=%0u;Q{f|W+)F8F)oAD@?pwkk#e5K#uRuLmC{KT7Nhiv-769NJmqg zNMY4Y1&Z3f6YaBVr&=j#OT|NfqgoYfsXBsLi@FVFHGEuZ)mx$^+p42^-LD|Ndd(8pg=Fg8z-Iu{Ig$gYk5#Tf>nyoVr)4YdE8+JH47& zSH{e>X5%ZzoVf5un^_}OACDasCWE8l#2k#l3r}ZbXXrR1#~e*&Q*AO+b!}v+1JlrF z6Ky&k>e_hZ=!3z~P^VX}IvF^V>1Z~b&L*aIH5=(y>eL-r)0s7!j3$n0414RV_tTkf zhu4m74Zg&&|I44wv`P5m@nUr~|Ncws@n2&{jV$|2CQZ^y|m( zE=MQpJO6xmdO5j0U#egAMom9|Yf({_?6#N5u&>7gBTA2lMup~LSQr)I!2@>6qNx(v z++Q!G&d2unu{a7gT64^4g5=|M#sB}$-kX29Z6gb#_t*HG?|qPxL20>i&06-EST(Zr7!`2 z@|Q2>-@g0s^u@FJ(+?M_`@_%f;{5vhboDF{q@E4 zn_t$!w--OZ``U}IeC^S*SN3-ww0QpGFMki8yflA&sh{hSw+v!1fBnPi!|K)bwfiW3 z`&wIGKKb^w{SWugS5vh7zxnRlcOPH;Fk8;tpHZ0?!K<6UeHBbi@b3?=&VTVfm^aVd zr{4PIiY^Ahc&xgp1WWF`TEJruh(C{xxSiD6Z?nI|NhVF;?J+O#WP#|=4d#{6U z!tdX_LKE|=*s`XdRBL(pjeGIP{r=;RZ`8%ptMfPD&68QIz525je)o4>fA;C-EA7Sf z&ws!E<>UE_*FS(O|7ZW{i}!EfTg}j~{$|X;a{B(?%h_f4^~KjdbVBu)AOH4k@^bOR z&Fby<-@SgJ&Ocl|TmAFqLi@D*I()hOKKSOVH{Yz)b8qp@b5%25y#D^p`+xs3e|iDp zzb>EXznE`tzW&?Wk1wtOeBph)xc)JCYJ=&caQ@3T-@bQWUAjLmUI6FKH{ZDz`t{|D z(Ej-NvEYm&HV(81BC8bu%eSFrh8CKw(Nyh3dT2s4@%vh++lFHWQ4~hLm!C-PznLZ4IP_rB>(gPhq*Fx9T0%)QNHnepZYOZG+76gH5+6Z~ib;8hv zxOr5{2|{1TKV5`%7}*Z`X#m@IEf}iEgf>AKScqoJLCa?qH6H}7p{j1+TR;uHAn?!% z3aHSDBF93ulIuGGz653>{58ZIsH>rEYk}`s*yz#CKm(Cxxu&P-frhB?RY&zr8)0H1 zLOd<1lRAh^RNOdg7uz?LsXlc5GOfb(xU7&|R_xuo>yhp1U zJ#ZlKJm`ZEHH8doV4>fU2VH0eh;H9AY#ZaKN4jGNwr}a7f%+FfKX5(tuMrq_gzAJL za6AnmW7~*F8tU`V20*n#QwS__PN3l^DBAPW5ABBg8Z+M2~0@b(u2!Rc}2w{qP0o8Lf9ghXykI<;KkPYh^KElfk z5U0J!MeI;5*N?o&3>+O{5a~ARZQpcl9q}7=RETH`ebYd_Y3pua*-(#M74)f!=gYG-F1rR5qz>Yv@qj~}2wU3rLh(marO7qY-L_^0yHaHqy zwimc2;+bK92zR&X>qu06-wI4OGD1T~<4=V;8Y3POX4~?0V0Z|7Jup!ppuX1}9kq|( zSh}rg08tu7FhYa^yWLu*aa{40re5axqB-6=uFTgsA|go-pntYpzyRNsOaJ2ivh-qq z7IB+|sh#-rU%Xj`e*pR~-fY4@0{U;7eP9yOf7A2>6G;ChX_nECPxN1T_N0jmdgfBv zYUMak<>Up%wqo>HpJ|`jCQX1wep#4!?K4Bezg+Bj@bFiU{<7!}6VBvi((NJq(W8)3aLfN75#G4ys6 z8VO`M^fAE>&-_$UY0$K-i;AmZ_NkNahyKs&&s3Va$U!!Mk8HN6?)kHo#1P@GDW(^I zdts8eX&GmnAh}|$SnF;x)H}^h?6b9zK|uDWK6{$tp?>yqb%gzvDY(JH>gnCt zQoa&81ZT<+Bn0j{Sl|t@D|j_eZb(Y;53CesQ31H?YA8-aTKi2(d*zIpfj)$^zCl?AeH(NLJqFHVm9-jLO0n5T$GHlD3z}P;MLpohPjEF4*Q69~aCN(ic z85PD}_8A3B9v~KWU6V(X`rc`th4FC~K$p^1f^@*6BVPfHF}I{SKempj1B@+-R?WtS zc^(U40ZbV)Elnvf7LqJ9siDg_dPc#JgD1m6ChzrVSXMyFF|(SX`xY?X#NNttg^!9a zXWOb$BjGk|+B(28>mL$XeIz^?STd58Cw?Cjzp6j99Z5E~z=)_;!Ac`Mq5;dnlR`0z z>^2U9EHoMGI^Fym1vv(m4ClC5wId-ZgxZEKjrBjP`v8u|?IO^_$SGj9ud7WgJZrxYdgwulfRu{klfOh!inN?{6$6&U znoYel9?Al!c#})>+LbdK*m69C1yCg!%%=1j4c#hGNo<)cY@;Dtfhmb=5m|90M9Tm> zVmbcQTm!ic?{Zkk5zrL^Y%%)F5faBjk_U)cX|`dRCbl05#S*j@b2kgmH5P6KD4E_J z$*ao4lHpkqIB68@%HTR7ScH5U9oY(K8N}0Ad81&;z>*n{c?hI2@#FSS+L0t72FF1! z2i4NC_2}vfL%INr3VYkiLg8H|D^rnoaH}7r*WfrtNo3qF-qvFf~m1J`f ze`YL9%Me@8EN)?sfMEp~Le7&yF1;c?Dvo8CczN7(z^iD0NZ-IddGNlOgo%N zU~UADfMyk13wq+alOtf-2zVo;#~KRl&^JPVq;-8O@NUR+c}z#gUkG33J{r9^&D>%n zsfw8}X-~g<{qFtS^Ovt>Q9pn6{`uSVzV3IgU*(r@3mE_Bo`U{6fA)-NT!e!1{p**A zbILJ((c#)>-EGi(Y?d!TssRp45?GE*B*cWtHt`763ad2)lB1ftQe8aK8fTO!Wqn_N( zsOBTO5;`a=zY(8?>+gtNn+Zdg3^rkipve);qSfx& zkSBGqdt?sKp*U{c4t8jUR^Fi`Hn3Ej96{uq;YV!-s+qzHLLJ6y19^*GBCY!vZJ=!U z(b-L$cBjLo<+Uz?Ree;glvkNUl5o}4RX6eiFiyv3s7SFw9&dg$7x`LXd7d}?NGWh=<%1-;8>@?UE)6~|Hsi*YV?rno z>}R1+0@VsU#|+0DBGMw$4g2j>N(V-crCzq=*hZ>`@~#xI4=k6Eo~Ig&U<#?8IuRy$ zcjs?AQ8n0trVByxi2vXb!9(oNTj`6MB4R4+FgmvLKQ9M z%b0l2h|AD4klhEIA&n48swMEt*^rh!QSN7@@8eU$K{x5lQjs%JUao@zK8zr6G{d-k z)^tHM=TWs1PDqf~k_cnUhhF8^kEUY*+wlkI4}#ssqBiup+pD!)h-b?cm`-8H0329j zNHU-XGiIZp@_hsP7rR01CNmooA-67KuW)G`nXczWaEyW8ZcA=}^MDCRBBFr5Ew0D-o~xP`Fp~5KbqW zoi)nS6+@VX13$jhNG#7!{3k_AcqJBU9JgWOR%94QNaiSlK~jx z?+au6ddB$uF=ny5tk_Ua%8R&aItbA!(g3dM=!P?fs%>B4ZGiKJD_?1*jWA3$;Y-&c zat&vzd2&NiuvcG=vBy*b*hFeAUR`#aSo>O#;bhqLJ`1XzQXxW;YyKAU7P~}Rx1riX z*|6*X4XEqr0}x1Jnqj6`SS&!2Mwld{!VF#A(?K+-ik6biPMC@oLwWgj^<2lM#ceAn z1`qjBoy9umG6W5)hB7eqv{Vq0R6jN3EOvpEUOHx2HPeBbj_QTUSyavR#JMg!SMyah z&<4~i4D<$CB~k3|U1{XTfP=Lw)g6ayH7`|tt}K!L3_;}ksuPaW@$J^_MtE;%_jh96 zC_`j3{%kO0iX)jtrZ8UKOczA19t=G)nvZ76p|_zr5OHDPewL-Sr#>aWCPk{f9U-oY zRdMF2{H;T_y1FEGBK6^$(6e1H8e?!v3UxP}w^4aAOdCNAHsMP*vA_q%m@I*L_zkpR zi>L95L`;k{8(0Py^0)^EUQeVXYJ%8JOxf-{pyx(RJ2G6|-Vx%fI0>k39^f3g!wq8z zy1EZm8hDD!R7-r)$x`<4>B#dgO{V7cC+)4jbtwi#aFq zqfpb_U8BE>T$TRj#V42FQ=Dsb*pbaZYNnk>soN+ojwa=qLWgzbWMEo|+Tiq94LOTl zAf=a%8P=84ftrr49GY9Olw5Y;F-Cwi5K=}$c6?RISll)V9miFbf`P}B92FhM6IS9( zF5qFu5(ZIEKnVfKam1m&xGa5RSZ3ebcCN{`YihDFHF>fo+jdRnottb=wry*&IoX_S z-TUqN{ok)^uVe3HFI+e;obn4F#e%4}M#C{M4O821oN=5o+{lX(pKSfjh-vgU1-~B^smnQ-GOLBW>?v*m$1uZkFYZKCE8};tH*r!i zwgi?4BcYjfJt^!|e3uBmO zEXz}23m|j$yqC-hb7kb9XqQ%|duNNq;pFIAVlnj1WM=6-J5gd!ur3(oL)x0?WU-@6S5mt5`jE zKYcy5Je{hklEj+qX#U`%I*;QlS%>KzS+2^93F4w)n5OWAB9u_g{$9hN(I7{yr__-a z%>4_Bzh2_VPNh15Y1Hz-(S$ycX+;;CKq-mGf;Q~JF+W-;W-5NFbHyL&?7-R&XULHd zQ6J?J=ZhiN9KEpgCRMNMN03mZM|Y!TjwpdN@@Z6^2W!}gWVvD8XfX;xL+g)AU(XCn z(JpV7hPL0VHNK0{nW6o3_tVlS3Oy}<eSaEciB+=q}XhbFi*` zX+~r7Vc8yE=blcc%BlW$OFdjT|Rs9dg%l681H6S-p_ovE4{Z%7fl*yp8IKX^zCp~MlE$7s|33#L_B1m3na6f-lXM*yD3 z!LU&&-2l2Wm9SVg;hiErC4=3l0Ofgm|IUNc&2GR{Q!35|ucEDi0O^=jQEul<#P1tuBoe7&RAt5L5#hHynm z11i_E!r6CMFth0)r4O?5;?2coNWV9HH8ZDntr;l=++q-qBzO*j{9)`M(&}3|~I|>bjU|8bFc%RNjsz zL&#G2#>KUvRdp8@9WEGryWrYYE)h|r=0=_rww)1 zz%o-h3BdmeL#qU>M|X@`kTS$a;Fz}+;jXMdOKV)1$||*usQCKC@;EXmD|cyJ7~Z9a z4)gMZB5aHoA$%P|Uddy)(ItqQyTKw(>2H?L35IsHWT|4T)UqEzkObUsn6_^}gOsK^ zMX2a`SQ~r8i4m&U;DE#5@gmuEyXpP3GJBq{^imkOL7rIUwWb7Amj-cEPIWr_b`*&D zhj6ztwhDQjIif!ZF4viDgrbTM5ID60krucYotRWplVSYAfQ$^A*KzJKC2z6Pgyb0h2eY?WN+@ddgYTRj8rM^4%hAR$Bp>FH(QHh zVM01njFW|ES8TJnT83b@rzF0r>S4!-p0q*}V?R_2C2ZE<1%w}#E#!mLjP`iGCy+FM z{8%G}v!OhZa!Xwx#S(5yZp@D_r1~0X1}UkQzdqfVI40@`?vuhNC14V>DH*F$7Z$}A z4%x@etH7hsif7TClFJuGEYQ(;@GKoyxJz(TEV>deCAO__Ve$}va0bS3%5*5v3F)5@ z8gT&-7XKV{J<-eY@kOm+c=x|Ah&NOe7&)!MNTD@zW>~%#upeQ?{?b+qe`kC3-nm9#V%)txco`;a4ZPu`8fK3hqyBev20 z0IY1SO1n_W19pq+XZ{2Z*(dfC5jQFc)nnWC2Sl5Z`*uS0nSBeIG>}XTX4fRpUm#!A zBITc%JclaY_a`RbPq^%WE^@WqX;orMSirzG1M~s$XSNm^P z38GqxAA0z5#nP^Q{JILc)Wqds-ERA!Kg6>0x`86(fV4dxenV><=QtYN6BeTQ6_eI z;QnO<;CS#6M~JdD#+arMmX##a{RxwvrJAqHJ9!im4*Ry2J6EmSeU#I*qaDttWLml!(*IXB{YzGHJGnxj zYp1rt9N7p$n!zx|fyuFz)E_Q)oBqOF)`jbXwrfq*lmfa~^lwgF8_Ify_lin5p_~Gf zkWm$Jb6>@8yGC4?SRt5*VLW9Biy68P5hJ%5_4bSXujQ=1&ba2z^Q$pk5n7sB|7>vC zl(UFvfPR^Y$u-k?$=$!{<<4uOv-d8FU)MP}#bsX*n2GgE3ZDN?>IP-k&5BMb+{vEp z@FIck35}^8G9Ug!w~Ifot-8oI#zmHcs=|Vv$p4qrM8xB4{8!8Vja~#*2u{~8FXh7f zCua*F>R58^?~F$(gawtYnHVQ|C82*Fic4USL;1R0(px*rvAI0`ha0uI4a#D0GRn>G z6|{+Z;rMP_(fv*h`kEc0UKQ}&*XwpXDs z*5I0xZ_eAlGQp?FO2w|UQ6O+Go>=k4`}bi<$)=W#R=BB%(QVrr5Dhm(=*q?tw`lak zoR6ccsoE5gzbBHoOUiN_Tif@jF7(Fb73!*`WY`vlH6LbL8$c}~7eI5>=Zi6hkwZ1( zhS~$lDt7vzp$asgkYc2Xc-ibUIM$`kl1VWj2qIQ*2;l=|&{s4g87v3*`%NA?B2fP#;5Zn-IYvX|3!@<06c za1(1KbT6;i#%73}GSf&08?IDgEF>{Cc`;WxhyQ8;ZfM6qFrq4Xq)&xta6%cOWt+7>snTJly=0r~ zUPPnLKZdU&_yjTb_rF}4uH70xH&;3q{VX+`taZU@7eKXjdZoOB#mg?#oYt-4rkwxj zx_uWTxYo*e5e?qYX!hn*%pi9m&&v!5B$62kr}VPqS=(94y@cL=eve;*5&urA(!CeT zhgO9yajf%$tI86;yxfs*_A?#8IQZ{0{FGd$Z!XK|csI`_zx>2nR*8Qr?oM_1Q=HmN zgYF^(y7JtBp9N~d1yWfzSuh-aU@<+!*9`6%>?XoKy&r_QFu{zduqba++_y-3 zHBYIq4O5bv4Z%?B+7autgjygYtKBa5NkuI*;~z^*BSC3si73~pG^`XY8P(#5F8Iea_sE@#0I#A1z*d8#JH7@>Eq#BBiB%2{+RY^w5?_F-|rMIN*g)P#=<{02C!ei4=xNdf zd(tJieQrDWPis;d_*RXTh(`hf^?C!1p%gkFJmF+AlXr{nX6q{>Pb+MfW!dNLJNUL` zkX^7UV@z&l;kgAq<;%_?x7N_A-8<^=j18xF~?wrmDfoq1`2|3HS zUTPV?>7&zFS*}^<MTvqMIL@FOA_?*OZaaT$cQ@8wfjP0bo@UI6 zYFI0(viuK9;W&rYcQl4={PBGAO-|2HozB9>*%T==p;$1$ZHpQ8DBpB>w>tLNZ3KidA|pK8}Mn=s_k8`v8CC&9ue?b&MuLj#dEeiP`-dlbVnR8$U0vuaB=1u?R_AulZp9&s8mKpA5F$ z)-C1mqIc^e6m$6&t}P%9A5N&>+Y87FQ2)Y)((Om|+C z`LGCzGWwk+xmc*`JEt%KW&z}$=E-%VTgVHQ z291S^$#HTPw$1s626R5{WA6+y@h-~gk7-^ia@opjs!_;Te?3@LUxzx@o3U4!Zo-dX zGdTai#2ntcTIJ>0k=m$QBW2RVCuQ3&`x`wb^X2EAt5fn-DOh5OYf26{$+y(-vdKql zjI3Nds6s|;2B>y@G{&3ZA^DJPC&!y)PZGMii1|mEc^9t&>!Q|HIVChqe?OZGe-agR z9r$b$Xyl)<1LwBFB2u+&eQd(;6PIjWhUe$4JFjky{VVBJ7?nCiB}bV!(RnZ;RJ{mZ zj!EskU$`vGYG7jz|IJaE* zr>fwXt#}%Q0}cp6{|+#l-RcSIeOL25iM)JhgsM7I<$87=I}9E>2h+ew6O zi2Z&_c@RH#k9zAB%XLo)Ap73D#s6ZvSKqoU?q_M;A(>hDNfaKlU5j?5TJb7@XXXvv z+Bbp9vQ1P1(`l9FUyL7xP4Ur7xwX|h#t*xWIlfN2laZ$VyH6QHTe3+1jShQAH77osZrz;HQGq&MrjG*n$LpsiXY_UsVcR{(zHn` zBfLf?h$dFZl~D@9Oo#O#-AY;(Vi;#lCr_WagHey^GIFt#ByO5DDUtjWwV+Ggw%c)u zqXy}dP^sNAa$tI|&B=t~L`edLAJ-{<*#$0tbCjMW{lhdwzDBypMCOHy5LS>Jwvawn z{H{ry@~v1TKfF+r`OX#pVL#W}HY=~-OH0TbTko&$D}s%>254TiMXT*FbXohAmithl z)G6-wxd8_dO<|2$H@U&zi<8@PtSrMavttIPe5O&MrkiIj6{*k};X2u#X=OHZsc8{m za!L8}a3!FB=)qDd8fgTobIwYdN~Bz_OhGI-qVG#X6jH#CCtkIO%0fPdWtdEQ7{NqXMmBeZ>Iw*i#3{@ zOjzMJ=Xq|TH!cR0eg3h1xRQU150A7UQV82EK%A_`s#p4NA$7q^XHrO*Flumd5gkrM zF;AFK$HLNhEZOP=b1N7&CB1ze0kZk$ugIMtkmvtcRCGNQgvcCJIB0?FEr6EzqWnSko5o&XgKC>N?I|}gJz|myFw-AiV+h3bM$(ehop)}19XpdAt z@KCjR7T{NEq?U>I_>Zc|?S5wtsY!?0|CSK`C%a@o`p!r+VsDy2vHPXs=B{J;ar zy)CI919~un*J25APk(>&KS^?8PN!iQCIz5Ofw`Cn3rZl=vE5O*jE>;v66)0P3LB zIb`Yyp)hpPZ}`#%TN92)wV`ulfK4^v%sAd4=iG@gnX5E?X5Sj~ErRH4=GWi0xhJeH z@5F!a1}?6eQ0Cb+I7&20RIVTGJY~RT$0iq8JVloAmpbvJQ5;x^v$jU=JPQtX+)0-K zE^ecG71^*NrP1H!crIY1{|ytqi~NQ;!i3Bz8SnU8~8(2cUwkE3IS znf440{=JE4V?TjM_WiAzlNEa_y*4bvzKpq+6}-;8$y}$4xx?NPi4)K%Wgoy#dVM`o2yV%+>~j(Fezd7H?RP=~)pt-m~U)F&i|EU=`b(if|im(=!vL!LNWb5Xg z*HUt(o=Jd~>bfr>)Mev!@J4DOg3!MXKivFp}WEX@CdASB|bvO%jPg5!odhptYp zMKK?wRzh!+1(6YgSI<*w!-(=~4KmbGeP_tBblI{d%=_MnL=}eML%1kS&ESnV-^1`a z;%PMKWzr_1@{jf#60~pbr5x7!9QDLr)pk17+}($CGx6p<)Q1H&6sr)gnHzzql*@Be zVT@Ha3VX;Sb`gpKkvxN`nQD=~KOqx`qVL8p?-ZMntULHzxRwv#BwwDJ(>Fe8?O0Ad zSY?KBGIJqha=hcMW;m4p1{YY{y00*X{X4g^gUtNPfn0oU9ZH1b74z(|Mw~K~cuUHD zM1RVgnS7F7Bkcp5kSX2C8qPzBAUe(Y%j8$ArN?XMxj(~YmYGe2rmnr=7t*!wr<@wm zxh3bkv1?9Mdv(4@-xP#}DRWOl$wVa?*1w*FtsUAB`I+e#v)H&of;U+Jb|E?Jwrs5L z5BPqC%x^XW4yr=&{-BA!760KGvk!XhwMv+i@$NdOX&E7lh|GOI30SPw>t^O`r$=7N zQrqmR$9A>MZJN~2J>(;cKew3IquIAgn&XtgG0(V6k~qC*7R>&!(vowq>SEZo`KD9d z>w+kT>oC8hD?jg^Jh0(-_$Wi~D!J|Tcj!;op@u;G$r;T|my@n74)JHNTZhhXoU|$`^vWe^FWn*k>T++^VPZV|v_1TIZuN009diziqLgXdHYVOI2d1B~Q67XT zcq@cQ&}8aG`<4sNZA8Td4CmV23Rd{A2%NbgQBx*7f$l*y>}e^_GB(If(UXuRJ2X;1 zdW)`fJXtn>l5kz+@;tEx!f~3lGDp5V4I{MQ2)(DkM}_@|YV4oA-wjl|1u}wvA7q8L z*W4;?Uy2)tKMQ)cg|oV0n1v6O6K*WD{$5OSOvUg7B^!=<;_sQ|2VY?2;R$}_ z#8QXxFV65D0=y>9o-Skm05|=K-jgibazg!(f8U*Ovp<&1V+-O;gAK3FWFisf zpURhrdu@D)W5Rg;)B0Z`Md1f}Y~3LTN=P}+$uHhJMY%`hMk6gw(k)F$JZy1)+4T_*)!N zr&`@?Q!RYQc(<{v=`|WEt>vADNd*_Hp+zB6zfOOP6b77-)RE{Vb0DNJ;a)%s-JUhq z5M_`=nbaZFChfLy9=2FCpxZ{?mON8&=o;=@R>N+u1a&-jTJgv^SQth=$@s}Drw^*c zl%2$&L^|VDPFx^H@>5PuCLE02AB{wCzZiB3=X?;zmM!$NibjUB-G{H2J;+~m3)lt5 z0@ytfnppn_i$K-5v|5g=;D3$tnsV#?AxJ6FW)1p1F->-scWyO7N)G0`Q?mLbIJP~U zMQ!sHH%skbY?x>8k3|IHEr^0F>cnjWBKv}D%DtyQrshcfBaSXM>sY3k{}R7nb1TFi zjQM*{bm($0>V;JEoH|l};p9+59iN3a7p=w*=x>K_$p_{4FW2e88>2w0guWNVeGFS zO0_9(=D$JhC#&%|xcpzO!YSHh$T?Y6NQbMlrL~=q^o{lO-{{fP(^9I-vh!j`B%?$G z@QSYYue4m> z2D@0s@Ebz0t9Ak% zildg?T=qFx*Y8;rP)jB~hAeTmIhxrH{BT{of_^#ZaxKSb6b~KCWP_*i=NSKk5p+&5 zBF=DqDF;DEFEDH7^#Z$aDFh-w${lW>OC%WGxX1auuQ)2{98WRUcA2$m?IacRkIr3e zTm;EE+28DIrh$4F!!7e^+j&~iw@0gN7V*F7!Elc98XRz2mFFf2sls}V2K+7yx$=yL z+`&=*AsS8CqUNd5Tk8A6s6O)>&GfpOp*SmoSN#b{Htx~oxP!wk9j;B;BPBj~j90$H zsGUlIad$=nqeenYr23EPY2kgO!ft9_1Dt_8ytO zGk=AX^F$U%D!b@Au((Zq9^+Xu+qR@UI2)m5fe&g%m=@oPT!w?*&t)cUy^=1h? z^Kx8~d2Al54YO;1pA}a~m~BmZxp#;{c~ªl;xi}!VVQMUfxLy*fyOZ*KtpscpW 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'*NJKryAsn*Q@HYcK8Nd`fmrG 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 L{-c5a9u52t^YDMB From dedea73750ed43e76f06c647db3cb12e74e88758 Mon Sep 17 00:00:00 2001 From: Brian French Date: Thu, 27 Feb 2025 14:22:55 -0500 Subject: [PATCH 05/12] syntax error fix. --- lib/netbox_client_ruby/api/tenancy.rb | 4 ++-- spec/netbox_client_ruby/api/tenancy_spec.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/netbox_client_ruby/api/tenancy.rb b/lib/netbox_client_ruby/api/tenancy.rb index 708de6d..03e8a0d 100644 --- a/lib/netbox_client_ruby/api/tenancy.rb +++ b/lib/netbox_client_ruby/api/tenancy.rb @@ -4,7 +4,7 @@ module NetboxClientRuby module Tenancy { tenants: Tenants, - tenant_groups: TenantGroups + tenant_groups: TenantGroups, contacts: Contacts, contact_groups: ContactGroups }.each_pair do |method_name, class_name| @@ -14,7 +14,7 @@ module Tenancy { tenant: Tenant, - tenant_group: TenantGroup + tenant_group: TenantGroup, contact: Contact, contact_group: ContactGroup }.each_pair do |method_name, class_name| diff --git a/spec/netbox_client_ruby/api/tenancy_spec.rb b/spec/netbox_client_ruby/api/tenancy_spec.rb index 8c6e97c..171b457 100644 --- a/spec/netbox_client_ruby/api/tenancy_spec.rb +++ b/spec/netbox_client_ruby/api/tenancy_spec.rb @@ -6,7 +6,7 @@ { tenant_groups: NetboxClientRuby::Tenancy::TenantGroups, tenants: NetboxClientRuby::Tenancy::Tenants, - contact_groups: NetboxClientRuby::Tenancy::ContacttGroups, + contact_groups: NetboxClientRuby::Tenancy::ContactGroups, contacts: NetboxClientRuby::Tenancy::Contacts }.each do |method, klass| describe ".#{method}" do From 1e56a3e8f60f972c6d24c594bb0c41442ce297af Mon Sep 17 00:00:00 2001 From: Brian French Date: Thu, 27 Feb 2025 14:30:38 -0500 Subject: [PATCH 06/12] Just adding more fields to match with their API schema --- spec/fixtures/tenancy/contact-group_1.json | 5 ++++- spec/fixtures/tenancy/contact-groups.json | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/spec/fixtures/tenancy/contact-group_1.json b/spec/fixtures/tenancy/contact-group_1.json index 310dd12..c754849 100644 --- a/spec/fixtures/tenancy/contact-group_1.json +++ b/spec/fixtures/tenancy/contact-group_1.json @@ -1,5 +1,8 @@ { "id": 1, + "display": "Customer", "name": "Customer", - "slug": "customer" + "slug": "customer", + "description": "Customer contact group", + "parent": null } diff --git a/spec/fixtures/tenancy/contact-groups.json b/spec/fixtures/tenancy/contact-groups.json index a2e9802..e2062db 100644 --- a/spec/fixtures/tenancy/contact-groups.json +++ b/spec/fixtures/tenancy/contact-groups.json @@ -5,8 +5,11 @@ "results": [ { "id": 1, + "display": "Customer", "name": "Customer", - "slug": "customer" + "slug": "customer", + "description": "Customer contact group", + "parent": null } ] } From 55354636c43886bedb2490244b6e5d36fc31bdd0 Mon Sep 17 00:00:00 2001 From: Brian French Date: Thu, 27 Feb 2025 15:07:10 -0500 Subject: [PATCH 07/12] Adds Parent/Child relationship to Contact Groups. --- .../api/tenancy/contact_group.rb | 1 + spec/fixtures/tenancy/contact-group_1.json | 9 +++--- spec/fixtures/tenancy/contact-group_2.json | 15 ++++++++++ spec/fixtures/tenancy/contact-groups.json | 25 +++++++++++++---- .../api/tenancy/contact_group_spec.rb | 28 +++++++++++++++---- .../api/tenancy/contacts_groups_spec.rb | 2 +- 6 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 spec/fixtures/tenancy/contact-group_2.json diff --git a/lib/netbox_client_ruby/api/tenancy/contact_group.rb b/lib/netbox_client_ruby/api/tenancy/contact_group.rb index d7038ac..0913a59 100644 --- a/lib/netbox_client_ruby/api/tenancy/contact_group.rb +++ b/lib/netbox_client_ruby/api/tenancy/contact_group.rb @@ -9,6 +9,7 @@ class ContactGroup deletable true path 'tenancy/contact-groups/:id/' creation_path 'tenancy/contact-groups/' + object_fields parent: proc { |raw_data| ContactGroup.new raw_data['id'] } end end end diff --git a/spec/fixtures/tenancy/contact-group_1.json b/spec/fixtures/tenancy/contact-group_1.json index c754849..a7d8c52 100644 --- a/spec/fixtures/tenancy/contact-group_1.json +++ b/spec/fixtures/tenancy/contact-group_1.json @@ -1,8 +1,7 @@ { "id": 1, - "display": "Customer", - "name": "Customer", - "slug": "customer", - "description": "Customer contact group", - "parent": null + "display": "Parent Customers", + "name": "Parent Customers", + "slug": "parent-customers", + "description": "Parent Contact contact group" } diff --git a/spec/fixtures/tenancy/contact-group_2.json b/spec/fixtures/tenancy/contact-group_2.json new file mode 100644 index 0000000..a716d72 --- /dev/null +++ b/spec/fixtures/tenancy/contact-group_2.json @@ -0,0 +1,15 @@ +{ + "id": 2, + "display": "Child Customers", + "name": "Child Customers", + "slug": "child-customers", + "description": "Child contact group", + "parent": { + "id": 1, + "url": "http://localhost/api/tenancy/contact_groups/1/", + "display": "Parent Customers", + "name": "Parent Customers", + "slug": "parent-customers", + "description": "Parent Contact contact group" + } +} diff --git a/spec/fixtures/tenancy/contact-groups.json b/spec/fixtures/tenancy/contact-groups.json index e2062db..01944ba 100644 --- a/spec/fixtures/tenancy/contact-groups.json +++ b/spec/fixtures/tenancy/contact-groups.json @@ -1,15 +1,30 @@ { - "count": 1, + "count": 2, "next": null, "previous": null, "results": [ { "id": 1, - "display": "Customer", - "name": "Customer", - "slug": "customer", - "description": "Customer contact group", + "display": "Customers", + "name": "Customers", + "slug": "customers", + "description": "Parent Contact contact group", "parent": null + }, + { + "id": 2, + "display": "East Coast Customers", + "name": "East Coast Customers", + "slug": "east-coast-customers", + "description": "Child contact group", + "parent": { + "id": 1, + "url": "http://localhost/api/tenancy/contact_groups/1/", + "display": "Customers", + "name": "Customers", + "slug": "customers", + "description": "Parent Contact contact group" + } } ] } diff --git a/spec/netbox_client_ruby/api/tenancy/contact_group_spec.rb b/spec/netbox_client_ruby/api/tenancy/contact_group_spec.rb index 50263fe..47ba97e 100644 --- a/spec/netbox_client_ruby/api/tenancy/contact_group_spec.rb +++ b/spec/netbox_client_ruby/api/tenancy/contact_group_spec.rb @@ -24,7 +24,23 @@ end it 'shall be the expected name' do - expect(subject.name).to eq('Customer') + expect(subject.name).to eq('Parent Customers') + end + end + + describe '.parent' do + it 'should be nil' do + expect(subject.parent).to be_nil + end + + context 'Child Contact Group' do + let(:contact_group_id) { 2 } + + it 'should be a Contact Group object' do + parent_contact_group = subject.parent + expect(parent_contact_group).to be_a NetboxClientRuby::Tenancy::ContactGroup + expect(parent_contact_group.id).to eq(1) + end end end @@ -45,7 +61,7 @@ it 'should update the object' do expect(faraday).to receive(request_method).and_call_original - expect(subject.update(name: 'noob').name).to eq('Customer') + expect(subject.update(name: 'noob').name).to eq('Parent Customers') end end @@ -91,8 +107,8 @@ expect(faraday).to receive(request_method).and_call_original subject.save - expect(subject.name).to eq('Customer') - expect(subject.slug).to eq('customer') + expect(subject.name).to eq('Parent Customers') + expect(subject.slug).to eq('parent-customers') end end @@ -127,8 +143,8 @@ subject.save expect(subject.id).to be(1) - expect(subject.name).to eq('Customer') - expect(subject.slug).to eq('customer') + expect(subject.name).to eq('Parent Customers') + expect(subject.slug).to eq('parent-customers') end end end diff --git a/spec/netbox_client_ruby/api/tenancy/contacts_groups_spec.rb b/spec/netbox_client_ruby/api/tenancy/contacts_groups_spec.rb index 3720b84..762cae1 100644 --- a/spec/netbox_client_ruby/api/tenancy/contacts_groups_spec.rb +++ b/spec/netbox_client_ruby/api/tenancy/contacts_groups_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe NetboxClientRuby::Tenancy::ContactGroups, faraday_stub: true do - let(:expected_number_of_items) { 1 } + let(:expected_number_of_items) { 2 } let(:expected_singular_type) { NetboxClientRuby::Tenancy::ContactGroup } let(:response) { File.read('spec/fixtures/tenancy/contact-groups.json') } From 0bb293aa5d8a3077a2766dce46d24b7d1a42addb Mon Sep 17 00:00:00 2001 From: Brian French Date: Thu, 27 Feb 2025 15:24:24 -0500 Subject: [PATCH 08/12] Update relationship names and tests. --- spec/fixtures/tenancy/contact-groups.json | 18 +++++++++--------- spec/fixtures/tenancy/contact_3.json | 10 ++++++---- spec/fixtures/tenancy/contacts.json | 10 ++++++---- .../api/tenancy/contact_spec.rb | 2 +- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/spec/fixtures/tenancy/contact-groups.json b/spec/fixtures/tenancy/contact-groups.json index 01944ba..86c2934 100644 --- a/spec/fixtures/tenancy/contact-groups.json +++ b/spec/fixtures/tenancy/contact-groups.json @@ -5,24 +5,24 @@ "results": [ { "id": 1, - "display": "Customers", - "name": "Customers", - "slug": "customers", + "display": "Parent Customers", + "name": "Parent Customers", + "slug": "parent-customers", "description": "Parent Contact contact group", "parent": null }, { "id": 2, - "display": "East Coast Customers", - "name": "East Coast Customers", - "slug": "east-coast-customers", + "display": "Child Customers", + "name": "Child Customers", + "slug": "child-customers", "description": "Child contact group", "parent": { "id": 1, "url": "http://localhost/api/tenancy/contact_groups/1/", - "display": "Customers", - "name": "Customers", - "slug": "customers", + "display": "Parent Customers", + "name": "Parent Customers", + "slug": "parent-customers", "description": "Parent Contact contact group" } } diff --git a/spec/fixtures/tenancy/contact_3.json b/spec/fixtures/tenancy/contact_3.json index 5cbb39d..4ee6242 100644 --- a/spec/fixtures/tenancy/contact_3.json +++ b/spec/fixtures/tenancy/contact_3.json @@ -3,10 +3,12 @@ "name": "tenant3", "email": "contact3@customer.test", "group": { - "id": 1, - "url": "http://localhost/api/tenancy/contact-groups/1/", - "name": "Customer", - "slug": "customer" + "id": 2, + "url": "http://localhost/api/tenancy/contact_groups/2/", + "display": "Child Customers", + "name": "Child Customers", + "slug": "child-customers", + "description": "Child contact group" }, "description": "", "comments": "", diff --git a/spec/fixtures/tenancy/contacts.json b/spec/fixtures/tenancy/contacts.json index a74e005..7961618 100644 --- a/spec/fixtures/tenancy/contacts.json +++ b/spec/fixtures/tenancy/contacts.json @@ -8,10 +8,12 @@ "name": "contact3", "email": "contact3@customer.test", "group": { - "id": 1, - "url": "http://localhost/api/tenancy/contact-groups/1/", - "name": "Customer", - "slug": "customer" + "id": 2, + "url": "http://localhost/api/tenancy/contact_groups/2/", + "display": "Child Customers", + "name": "Child Customers", + "slug": "child-customers", + "description": "Child contact group" }, "description": "", "comments": "", diff --git a/spec/netbox_client_ruby/api/tenancy/contact_spec.rb b/spec/netbox_client_ruby/api/tenancy/contact_spec.rb index 026c805..340ccd8 100644 --- a/spec/netbox_client_ruby/api/tenancy/contact_spec.rb +++ b/spec/netbox_client_ruby/api/tenancy/contact_spec.rb @@ -39,7 +39,7 @@ it 'should be a ContactGroup object' do contact_group = subject.group expect(contact_group).to be_a NetboxClientRuby::Tenancy::ContactGroup - expect(contact_group.id).to eq(1) + expect(contact_group.id).to eq(2) end end end From 324eb9960d988b643c0dba2d7631106aadd23a16 Mon Sep 17 00:00:00 2001 From: Brian French Date: Sun, 2 Mar 2025 18:39:35 -0500 Subject: [PATCH 09/12] Adds tenant as an object_field to site. --- lib/netbox_client_ruby/api/dcim/site.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/netbox_client_ruby/api/dcim/site.rb b/lib/netbox_client_ruby/api/dcim/site.rb index a1aa2b3..2cfe6a0 100644 --- a/lib/netbox_client_ruby/api/dcim/site.rb +++ b/lib/netbox_client_ruby/api/dcim/site.rb @@ -19,6 +19,7 @@ class Site path 'dcim/sites/:id/' creation_path 'dcim/sites/' object_fields( + tenant: proc { |raw_region| Tenancy::Tenant.new raw_region['id'] }, region: proc { |raw_region| DCIM::Region.new raw_region['id'] }, status: proc do |raw_status| STATUS_VALUES.key(raw_status['value']) || raw_status['value'] From 5337d265959a4deec7997f259701178cca01b7f1 Mon Sep 17 00:00:00 2001 From: Brian French Date: Sun, 2 Mar 2025 19:22:37 -0500 Subject: [PATCH 10/12] Adding tests for object_fields. --- spec/fixtures/dcim/site_1.json | 21 ++++++++- spec/netbox_client_ruby/api/dcim/site_spec.rb | 45 +++++++++++++------ 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/spec/fixtures/dcim/site_1.json b/spec/fixtures/dcim/site_1.json index 58fce46..dc0eb10 100644 --- a/spec/fixtures/dcim/site_1.json +++ b/spec/fixtures/dcim/site_1.json @@ -2,8 +2,25 @@ "id": 1, "name": "test", "slug": "test", - "region": null, - "tenant": null, + "region": { + "id": 1, + "name": "region1", + "slug": "region1", + "parent": null + }, + "tenant": { + "id": 1, + "name": "tenant1", + "slug": "tenant1", + "group": null, + "description": "", + "comments": "", + "custom_fields": {} + }, + "status": { + "value": 1, + "label": "Active" + }, "facility": "", "asn": null, "physical_address": "", diff --git a/spec/netbox_client_ruby/api/dcim/site_spec.rb b/spec/netbox_client_ruby/api/dcim/site_spec.rb index a7ce4c5..dbc3a51 100644 --- a/spec/netbox_client_ruby/api/dcim/site_spec.rb +++ b/spec/netbox_client_ruby/api/dcim/site_spec.rb @@ -3,15 +3,16 @@ require 'spec_helper' RSpec.describe NetboxClientRuby::DCIM::Site, faraday_stub: true do - let(:site_id) { 1 } - let(:response) { File.read("spec/fixtures/dcim/site_#{site_id}.json") } - let(:request_url) { "/api/dcim/sites/#{site_id}/" } + let(:class_under_test) { NetboxClientRuby::DCIM::Site } + let(:entity_id) { 1 } + let(:response) { File.read("spec/fixtures/dcim/site_#{entity_id}.json") } + let(:request_url) { "/api/dcim/sites/#{entity_id}/" } - subject { NetboxClientRuby::DCIM::Site.new site_id } + subject { class_under_test.new entity_id } describe '#id' do it 'shall be the expected id' do - expect(subject.id).to eq(site_id) + expect(subject.id).to eq(entity_id) end end @@ -37,6 +38,24 @@ end end + { + region: NetboxClientRuby::DCIM::Region, + tenant: NetboxClientRuby::Tenancy::Tenant, + status: Symbol + }.each_pair do |method_name, expected_type| + describe ".#{method_name}" do + it 'should fetch the data' do + expect(faraday).to receive(:get).and_call_original + + expect(subject.public_send(method_name)).to_not be_nil + end + + it 'shall return the expected type' do + expect(subject.public_send(method_name)).to be_a(expected_type) + end + end + end + describe '.delete' do let(:request_method) { :delete } let(:response_status) { 204 } @@ -76,10 +95,10 @@ let(:request_method) { :patch } subject do - site = NetboxClientRuby::DCIM::Site.new site_id - site.name = name - site.slug = slug - site + entity = class_under_test.new entity_id + entity.name = name + entity.slug = slug + entity end it 'does not call PATCH until save is called' do @@ -110,10 +129,10 @@ let(:request_url) { '/api/dcim/sites/' } subject do - site = NetboxClientRuby::DCIM::Site.new - site.name = name - site.slug = slug - site + entity = class_under_test.new + entity.name = name + entity.slug = slug + entity end it 'does not POST until save is called' do From 71bcf417981cd41dfb2b8a75082c8988e2e2424e Mon Sep 17 00:00:00 2001 From: Brian French Date: Sun, 2 Mar 2025 19:24:33 -0500 Subject: [PATCH 11/12] use the described_class builtin --- spec/netbox_client_ruby/api/dcim/site_spec.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spec/netbox_client_ruby/api/dcim/site_spec.rb b/spec/netbox_client_ruby/api/dcim/site_spec.rb index dbc3a51..18805ec 100644 --- a/spec/netbox_client_ruby/api/dcim/site_spec.rb +++ b/spec/netbox_client_ruby/api/dcim/site_spec.rb @@ -3,12 +3,11 @@ require 'spec_helper' RSpec.describe NetboxClientRuby::DCIM::Site, faraday_stub: true do - let(:class_under_test) { NetboxClientRuby::DCIM::Site } let(:entity_id) { 1 } let(:response) { File.read("spec/fixtures/dcim/site_#{entity_id}.json") } let(:request_url) { "/api/dcim/sites/#{entity_id}/" } - subject { class_under_test.new entity_id } + subject { described_class.new entity_id } describe '#id' do it 'shall be the expected id' do @@ -95,7 +94,7 @@ let(:request_method) { :patch } subject do - entity = class_under_test.new entity_id + entity = described_class.new entity_id entity.name = name entity.slug = slug entity @@ -129,7 +128,7 @@ let(:request_url) { '/api/dcim/sites/' } subject do - entity = class_under_test.new + entity = described_class.new entity.name = name entity.slug = slug entity From 7c40a75f81c5f26b81b9b81e1d5eccbeb3514bfc Mon Sep 17 00:00:00 2001 From: Brian French Date: Thu, 6 Mar 2025 12:25:37 -0500 Subject: [PATCH 12/12] really just trying to get a new pipeline ru. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 736e1ff..8d03341 100644 --- a/README.md +++ b/README.md @@ -245,7 +245,7 @@ Before opening a PR, please * extend the existing specs * run rspec * run rubocop and fix your warnings -* check if this README.md file needs adjustments +* check if this `README.md` file needs adjustments ## License