From a5f290d0e7739eade6e2c6f9923a2e71297cdd1b Mon Sep 17 00:00:00 2001 From: Aerex Date: Sun, 3 Mar 2019 19:29:38 -0600 Subject: [PATCH] feat(added command to retrieve stock overview): --- .gitignore | 2 + README.rst | 1 + grocy/__init__.py | 78 ++++++++++++++++++ grocy/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1993 bytes grocy/__pycache__/cli.cpython-37.pyc | Bin 0 -> 2404 bytes grocy/__pycache__/rest.cpython-37.pyc | Bin 0 -> 1770 bytes grocy/cli.py | 75 +++++++++++++++++ grocy/commands/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 210 bytes .../commands/__pycache__/stock.cpython-37.pyc | Bin 0 -> 2145 bytes grocy/commands/stock.py | 64 ++++++++++++++ requirements.txt | 7 ++ sample.config.yml | 9 ++ setup.py | 42 ++++++++++ 14 files changed, 279 insertions(+) create mode 100644 .gitignore create mode 100644 README.rst create mode 100644 grocy/__init__.py create mode 100644 grocy/__pycache__/__init__.cpython-37.pyc create mode 100644 grocy/__pycache__/cli.cpython-37.pyc create mode 100644 grocy/__pycache__/rest.cpython-37.pyc create mode 100644 grocy/cli.py create mode 100644 grocy/commands/__init__.py create mode 100644 grocy/commands/__pycache__/__init__.cpython-37.pyc create mode 100644 grocy/commands/__pycache__/stock.cpython-37.pyc create mode 100644 grocy/commands/stock.py create mode 100644 requirements.txt create mode 100644 sample.config.yml create mode 100644 setup.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2839fc9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +venv +grocy_cli.egg-info/ diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..152ecb0 --- /dev/null +++ b/README.rst @@ -0,0 +1 @@ +.. readme diff --git a/grocy/__init__.py b/grocy/__init__.py new file mode 100644 index 0000000..c90afa9 --- /dev/null +++ b/grocy/__init__.py @@ -0,0 +1,78 @@ +import requests +import json +class RestService(object): + API_KEY_HEADER = 'GROCY-API-KEY' + def __init__(self, api_url, json=False): + self.api_url = api_url + self.headers = {} + self.json = json + + def get(self, path, id=None): + + # TODO: change this to a single pattern assume a pattern then stick with it + if self.api_url.endswith('/'): + url = '{0}{1}'.format(self.api_url, path[1:]) + else: + url = '{0}{1}'.format(self.api_url, path) + + if id: + url = '{0}/{1}'.format(url, id) + + r = requests.get(url, headers=self.headers) + + if r.raise_for_status(): + logger.error(r.raise_for_status()) + raise r.raise_for_status() + + if self.json: + return r.json() + + return r.content + + def delete(self, path, id): + api_url = self.api_url + + if api_url.endswith('/'): + url = '{0}{1}'.format(api_url, path[1:]) + else: + url = '{0}/{1}'.format(api_url, path) + + r = requests.get(url, headers=self.headers) + + if r.raise_for_status(): + logger.error(r.raise_for_status()) + raise r.raise_for_status() + + if self.json: + return r.json() + + return r.content + + def post(self, path, payload): + api_url = self.api_url + + if self.api_url.endswith('/'): + api_url = api_url[1:] + + if path.startswith('/'): + url ='{0}{1}'.format(api_url, path) + else: + url = '{0}/{1}'.format(api_url, path) + + print('{}'.format(url)) + r = requests.post(url, data=json.dumps(payload), headers=self.headers) + + #if r.raise_for_status(): + # logger.error(r.raise_for_status()) + # raise r.raise_for_status() + + if self.json: + return r.json() + + return r.content + + def addHeader(self, type, value): + self.headers[type] = value + + def addToken(self, value): + self.headers[RestService.API_KEY_HEADER] = value; diff --git a/grocy/__pycache__/__init__.cpython-37.pyc b/grocy/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e09624579c4a3554086576bfd213e8ac675641db GIT binary patch literal 1993 zcmaKt&u`l{6vs)5`eDU(+_X(IU>Lf!7@$Mq4Fh&6hO|xEZo|AG-KE9=O*7fVnk~5$ zoh^>M!4=2P2dj{<>v|<}fNlOxwJ^@Qh29^l|pQD|~F@7@Y z$73}x{)tS4RE6Pbk!LW%3pseH@MFpa^EXjGbno`tC;3pe6RG6y?Ss5G9?DD?Z6!x} z(cT-W{%N9R`&i|@v)$gHUwQ2~?q_`+$9tnQ6D$M#Y~g_+)Pujtt+n0lEt5K{ePKFg z+kIVtQ<9X-sGxJI?h7`9ou#l>fJ^>jACNhlI$87bJ;o(dj|7KI@G#a+%E2e8E8I71 z%1b`;=0uIOKMN{fbNvKhNh|g^$%?&(09gZ1XTkqd%h|a?pJ(+2YYMEnWzAQt-O{zJf3~cx zZ&_P!!8(JSinY67t#A)Z+G+!X_tRE&7*h>2O*FWF3s|+#yMbm44XR4r1QU4{rMiVL zZlkf<#|xzHph5Xx5;dNX1F7X*cx!JNh?s?Rn_WY?wT`s<$rY+Nzg2Vz&VuTtu0JXr zC^uHmK%35>fPmV+6wVCTmzJxgyoxjzE{yRxeGSUhZt9iX5@vI&U*WxRrY_9mt5cxs zTP0U?{f?zuQC$dnMR&r^rx7z;Bsy7FwdHI=kgC#F+?Kg;%4cyku>gUG8oJ25~w9YJhNr<8(a_;T|y_f*C$_P^z0}kV82=ciV@3m zN;FN`;aKNo7ylf%kpQ1P`j!eT6l)z``2Pfc^)C5T|tj literal 0 HcmV?d00001 diff --git a/grocy/__pycache__/cli.cpython-37.pyc b/grocy/__pycache__/cli.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34e2ce5851167d346b7bd6ffd979dbbd31b4cac5 GIT binary patch literal 2404 zcma)8&2QT_6c_bn`8#pav|0M0bz27)opb9BE4HO+TBK;xpvf?R7$B%3Z7Y^6gQU~i zvv*0a+i_?6xcjg_Mu!2zPW=~l+Iw{3W=g~; zZ|q$B3SfK-Mg9pDGZ;w>imjQD)TAas+e)m|rna{2#7SN1YMUelT7YpU@zNqKYM+~w z(lRY;yO31UDy^n9T1)G+u6w|X7f}+AS7n$E65fik zemm~8MrkrGy|*J=9R5rwE|gs;vJI6oW<;6Fnw!&wZ8M^rxiuv);wp1aIiFA#Qq$jz*CtR%*L^a0qJoL#%8NEzPGEF=l?kMVP8B_ znebW0rQgq#52=vqo*xMwD&B(VtzAe;-0%2{z4?p%_$q_<ohj z;DbzVw+13Ug*|RB;agbSu!7cLl&=TDA_>7_$NE!OU|QLL${-a|BPFszJhMa^V2KUz zE+N(-P-%#5Fc<%cPQ$o=8!Ug9Y6bg=08PQYMf3ZOFcO9R`P zp~wsg1k?Zu*)!*&&yZ9EJnjU>u^Dqb~fy@@m)XcGyip*B>pRY&K%~$2p7PSmcK83)eV*ZqW8_^ z;~;=LNS-xl#41#Ixx-Zu4h8|xGWT{44}*i9=X;u6qKr{1P|(40+W*4*?{+R zdlaS#Ey}RXgCq-C)1lRVb^%{1JJefJ=E{Guz4)lvX0$d4h2%>zT>?wvRL4bLqQvL0 z0C^26gV@9aLLeDRV7t)skQg^$YzZXNcnRbm&`}0J0B}x>o-3{aq+}By={FVt&TP;D z!b}8_SrgJLi2Ka$1DMQ$IFmWr_msKX=YY>r?nz-{PApdV8CAi9IlVJeo?^QRMC^Iu zS7n_PS&@}kS;v%SWmZ`z2CHf+RNFwSUo-_~wYf2M6e1%(|*Q9H=pBM|%&ydqS&77JwoORh;#63nH4PxCNWeJsj$XDbF31^>}~$;2;A{0ZWrh z6RYJPCOnkf4;k}E*-)GZfb^&?5N)AiIMFd^v&DrNH~;r6?=<`B8k|cELmmo5Q*7cg z3%ErPzr6e^lyS7HKbaT0p$wH00+m4A#6SnWo(auHVS$5cF5^8DbJ=vM1pyvfp0L=~$ z?x93q$MC+UQy^*>hH9JRo`wUhlp09X2E8S{^GkWd>ppg%=eVFjC5r2t`^gzn- YS+whDnI+SP6Kuoj-LSmsisRM)1wRyO%>V!Z literal 0 HcmV?d00001 diff --git a/grocy/__pycache__/rest.cpython-37.pyc b/grocy/__pycache__/rest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26c1ded24356cd1e9d298140d050adad1001362e GIT binary patch literal 1770 zcmaKsOK&4Z5Xbv94?B(%_K^)j0uBht2V&rWI7Dc*pam{Iu(t?l7~H+dSmPOQbvqDe z%z+KZ{SNk#uhbU~ocIcRqN>O7dLzMDT~j?>Q=b0yzv{{UewX3(SJnJDO&I%|CbySD z=P?fZ0L`~dGtF;s81_=0aV?&)fgIz?_LAs5#$mriV;IJ;Gokmj(DH_#N!{0xj?q&( z(di94i*!eK@gD0v-NSpL73Mtfdp{WKo*B3-#^&jmveHF&f#Yi&_6SYG8TFR`Dh@0lFy244y8{nOs)-BuO_yxa79^DJ_kw!w7)+Y#CUssI=rZ-W|$i=zYf2t z$MdPFoE?Ih)pmF?gW@uGW_S+u`0A5!S+pK5TX!ppIU16hj^E*#Zp%NH_vI_2za6uMxsY^ zCnpMhHi>lfN-R~QR`Hs_%q6R|_1B!U*83d^PCD=#&N^#k*QiMs3C5$>e7K0OKV4pb zw)}_VXDt$(3~@H#K<6;n3j}>?Ds6u$+=Y*y*D%eUPrioaI~eRn^D7ABj6i@9iROUwMlv9bZs%gU*KP z8(qKONbCqf&q$lEL{R$|TCR|N6SxM-+nG~3!Zo$#FHyNJn#7F?gvC1OSI4j9GQ$5! z;1cO3LCG!MWEAMOR5ya&(p`w_U`I&k(~lq$F&?!eqf*aRvU(4#hM>sr}H zdOn@m_8jgq_sJ~3D(hVTKX-T!Ieoqhy@x99@;-v^^W!+^_;43G{rwg>6(o&-oJ2v* zklMy6w(PbcZmL#pD$8BXjE^q!a&GQQpp$F;U1*u#(+5$XWPI^(_s_Qx1OAk{ZA$I0 z%BLpFd^gLcwVs#c_p*+=Bjmf=G(RD(Mvls5Go8kWi-mEEX&l-^Gt h0X-YxnZ@g`kg0p2cF&aSnF^B^LOhASM5Elyoi4=wu#vF!R#wbQch7_h?22JLdKv4!w z##^kxCHcwOews|TMAD1$lPmR-^K)|(^HPfSia`=ZAY)cC6tMs)F!9S%KO;XkRX;Jc zD78Z0B|o_|H#M)MSidN>Air2&ub?QiEU_e2A8eLxa!w|Mr4KVzKR!M)FS8^*Uaz3? V7Kcr4eoARhsvRTH^kN`p003mlH`)LI literal 0 HcmV?d00001 diff --git a/grocy/commands/__pycache__/stock.cpython-37.pyc b/grocy/commands/__pycache__/stock.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..794d80c30d75247df52c7a8e4c1caac0fb44b496 GIT binary patch literal 2145 zcmah~OK%)S5bmD$K5RJ#Atyq}2NJOo_C^th94sr?4gp2lMD|8WMnuD8y1gEIc4pJv z8@!uY4mcch;2*4yT=*IM2l~n>5(mUF7pUqP2PXm1qpq&*>Q{YL{ms_GLX$xG^;!A# z9|0l1Vdtzkpxl5euY+KO(TogfNGa-8W(}>-GP<4FLnm}7xkZ@6+~e-1kcr)837B96^{>j zqPinduyLYf_u181Lg7>_cnursZK!euL`e?GoR;(yU?|DlIwc4J97lT{TL)3Z(nLj( z_QoRyzUk#C%~KT#a6OW>@0NBX&-S$sHxVh9KM~P_tzUi7Jt&5}8*{;ryE{cP9>N6K z6?|04?)pfiPhrRIKorSjEy>bK>n6o;80Sn@UapTOcnfoA1OX)yqey6*P8SUv>u1K- zKBBMa<2F>e1wuinOLAh#6$U;=06j=6zXIbH_-}*dQ#0n|%P?lwW1H1HgND=7{(d2b zv69+_KxbUrNs)D2?H|N4R!W2z|BUYsRTzLJ&eB0H7UA@;RT<3c4iya;Gx$`Z4PAW+ zuv8J_`|&tak(nRW$Gr!3iTe=Rq#g~xbF9XhDLfq0^FaETO9r)|_lkC3Vmw~{ z1*MNK<4_j)w7p&A3iGx<8S&{-JQ`(b605YxyJ+tO+Kxx5Zb}skCBIG8fetw21Zo0v zShvq-pl-yBeaU0Sg$_XN7e_pYIAQbehzm@mkD%7jw&@apx&+@Movzf-zLV*%A;t7Y zo-vUA3CiRbgl0~ab!eZ`8Gy^I=cJ@NnIN(2xeqzAfR`pkx~P@Kh_4Wa_om^Z8bDeN)}N_*Za0|flZwfp2g$*(v> zwU3(OXG&%bN~S^C_@3T}a4_h9*LXl4lH7U#jD}%j!N8d{)k0~PP1bl}?U8!*@BgzJ z38LA14F^U9Gi(p4d>_OBvf)vC2E4+^Me?Kd#6d>U&6<;ZLZSjx7~#;rTQOnieLgJ4 zxtcC*0eh`(ad=^Tbq6?Tx=>kG?~HiP8Qj!AFxezKi{cXOp=~%%xTsyYb+aFB-`m~2 z+3QDp{X5&YwJYL$0ECc1(i!vJ-8(z?w)@f6!|1CW?Nu*XJ9sa+|^gcs1wn&TshtRJ@i!BB<^6;;$gXgAFnKQ>+qjEDB?$u$QV z#3q{ZvxT*nZ$YnH=g|EG_K_chAk?CZ_9AtlT{awq4`!JzTTAo