{ "info": { "author": null, "author_email": "Arun Kishore ", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)" ], "description": "\n
\n

ak_sap

\n

\n Python wrapper for SAP2000. \n Generate/Analyze/Extract complex structural models using python. \n

\n

\n GUI\n \u00b7 \n Getting Started\n \u00b7 \n Layout Documentation\n \u00b7 \n Report Bug/Request Feature\n\n

\n
\n
\n\n![GitHub commit activity](https://img.shields.io/github/commit-activity/m/rpakishore/ak_sap)\n![GitHub last commit](https://img.shields.io/github/last-commit/rpakishore/ak_sap)\n[![tests](https://github.com/rpakishore/ak_sap/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/rpakishore/ak_sap/actions/workflows/test.yml)\n\n\n

Table of Contents

\n\n- [1. About the Project](#1-about-the-project)\n- [2. Getting Started](#2-getting-started)\n - [2.1. Prerequisites](#21-prerequisites)\n - [2.2. Installation](#22-installation)\n - [2.2.1. Production](#221-production)\n - [2.2.1.1. Install directly from repo](#2211-install-directly-from-repo)\n - [2.2.1.2. Install from Pypi release](#2212-install-from-pypi-release)\n - [2.2.2. Development](#222-development)\n- [3. Usage](#3-usage)\n - [3.1. GUI](#31-gui)\n - [3.2. Layout Documentation](#32-layout-documentation)\n - [Layout Map](#layout-map)\n - [Initialize](#initialize)\n - [Parent Level](#parent-level)\n - [Sub-Modules](#sub-modules)\n - [Model](#model)\n - [Element](#element)\n - [Point](#point)\n - [Frame](#frame)\n - [Database](#database)\n - [Select](#select)\n - [Loads](#loads)\n - [Load Patterns](#load-patterns)\n - [Load Cases](#load-cases)\n - [Modal](#modal)\n - [Analyze](#analyze)\n - [Results](#results)\n - [Material](#material)\n - [Rebar](#rebar)\n- [4. Roadmap](#4-roadmap)\n- [5. License](#5-license)\n- [6. Contact](#6-contact)\n- [7. Acknowledgements](#7-acknowledgements)\n\n\n## 1. About the Project\n\n\n## 2. Getting Started\n\n\n### 2.1. Prerequisites\n\n1. Python 3.11 or above\n2. SAP2000 v24 or higher\n\n\n### 2.2. Installation\n\n#### 2.2.1. Production\n\n##### 2.2.1.1. Install directly from repo\n\nClone repo and Install with flit\n\n```bash\ngit clone https://github.com/rpakishore/ak_sap.git\ncd ak_sap\npip install flit\n```\n\n- If you want just the base package:\n \n ```bash\n flit install --deps production\n ```\n\n- Alternatively, if you also want to include the optional streamlit gui:\n \n ```bash\n flit install --deps production --extras gui\n ```\n\n##### 2.2.1.2. Install from Pypi release\n\n```bash\npip install ak_sap\n```\n\nNote: The Pypi version does not ship with the optional streamlit gui\n\n#### 2.2.2. Development\n\nDownload the git and install via flit\n\n```bash\ngit clone https://github.com/rpakishore/ak_sap.git\ncd ak_sap\npip install flit\nflit install --pth-file\n```\n\nUpdating Docs:\n\n- Update the [Usage.ipynb](./documentation/Usage.ipynb).\n- Open `cmd.exe` to run\n\n ```bash\n update-doc\n ```\n\n\n## 3. Usage\n\nInitialize the module as below\n\n```python\nfrom ak_sap import debug, Sap2000Wrapper\ndebug(status=False)\n\n#Initialize\nsap = Sap2000Wrapper(attach_to_exist=True) #Attach to existing opened model\nsap = Sap2000Wrapper(attach_to_exist=False) #Create new blank model from latest SAP2000\n\n## Create blank model from a custom version of SAP2000\nsap = Sap2000Wrapper(attach_to_exist=False, program_path=r'Path\\to\\SAP2000.exe')\n\n```\n\nParent level methods and attributes\n\n```python\nsap.hide() #Hide the SAP2000 window\nsap.unhide() #Unhides SAP2000 window\nsap.version #Returns SAP2000 version number\nsap.api_version #Returns Sap0API version number\n\nsap.save(r'\\Path\\to\\save\\file.sdb')\n```\n\n### 3.1. GUI\n\nThe repo has an optional streamlit GUI for the wrapper. Checkout [`GUI.md`](/documentation/Usage/GUI.md) for installation and usage instructions.\n\n### 3.2. Layout Documentation\n\n\n#### Layout Map\n\n![MindMap](assets/mindmap.svg)\n\n#### Initialize\n\nUsage Examples:\n\n```python\nfrom ak_sap import debug, Sap2000Wrapper\ndebug(status=False)\n\n#Initialize\nsap = Sap2000Wrapper(attach_to_exist=True) #Attach to existing opened model\nsap = Sap2000Wrapper(attach_to_exist=False) #Create new blank model from latest SAP2000\n## Create blank model from a custom version of SAP2000\nsap = Sap2000Wrapper(attach_to_exist=False, program_path=r'Path\\to\\SAP2000.exe')\n```\n\n#### Parent Level\n\nUsage Examples:\n\n```python\nsap.hide() #Hide the SAP2000 window\nsap.unhide() #Unhides SAP2000 window\nsap.ishidden #Check if window is hidden\nsap.version #Returns SAP2000 version number\nsap.api_version #Returns Sap0API version number\nsap.exit(save=False) #Exit the application\n\nsap.save(r'\\Path\\to\\save\\file.sdb')\n```\n\n#### Sub-Modules\n##### Model\n\nCollection of methods and attributes that control changes to the model as a whole\n\nUsage Examples:\n\n```python\nsap.Model.units #Returns current model units\nsap.Model.units_database #Returns Internal Database units\nsap.Model.set_units(value='N_m_C') #Changes the present units of model\n\nsap.Model.merge_tol #retrieves the value of the program auto merge tolerance\nsap.Model.set_merge_tol(0.05) #sets the program auto merge tolerance\n\nsap.Model.filepath #Returns filepath of current file\n\nsap.Model.is_locked #Returns if the model is locked\nsap.Model.lock() #Locks the model\nsap.Model.unlock() #Unlocks the model\n\nsap.Model.project_info #Returns a dict of Project Info\n##Set project info, use `.project_info` to see available keys\nsap.Model.set_project_info({'Design Code': 'BCBC 2018'})\n\nsap.Model.logs #Retrieve user comments and logs\nsap.Model.set_logs('Add this comment') #Adds user comments/logs\n```\n\n##### Element\n\nCollection of methods and attributes that apply changes to elements in the model\n\nUsage Examples:\n\n```python\nobject = sap.Object\nobject.move_selected(dx=0.5, dy=0, dz=1.0) #Move selected object\nobject.copy(dx=0.5, dy=0, dz=0, num=10)#copy selected object\n\n#Mirror and create object\nfrom ak_sap import Coord\npt1 = Coord(x=10, y=20, z=0)\np2 = Coord(x=10, y=30, z=0)\nobject.mirror(plane='Z', coord1=pt1, coord2=pt2) #Mirror replicate selected obj.\n```\n\n###### Point\n\nManipulate Point Elements\n\nUsage Examples:\n\n```python\npoints = sap.Object.Point\nlen(points) #list number of points in model\npoints.add_by_coord((1,2,3)) #Add point to model\npoints.is_selected(name='1') #Check if point is selected\npoints.selected() #Yields selected points\npoints.all() #Lists all defined points\npoints.rename(old_name='1', new_name='1_1') #Rename point\npoints.check_obj_legal(name='1') #Asserts point's existance\npoints.delete(name='1') #Delete point\n\n#Manipilate\npoints.deselect_all() #Deselect all points\npoints.select(name='1') #Select a single point\npoints.align(axis='Z', ordinate = 100) #Align selected points\npoints.deselect(name='1') #Deselect a single point\n\n# Extrude point to frame\npoints.extrude(\n point_name='3',\n property_name='FSec1',\n dx=0, dy=144, dz=0,\n num_frames=3\n)\npoints.merge(tolerance=2) #Merge points that are within tol\npoints.change_coord(name='1', x=0, y=0, z=0)#Change point coordinate\n```\n\n###### Frame\n\nManipulate Frame Elements\n\nUsage Examples:\n\n```python\nframes = sap.Object.Frame\nlen(frames) #list number of frames in model\nframes.is_selected(name='1') #Check if frame is selected\nframes.selected() #Yields selected frames\nframes.all() #Lists all defined frames\nframes.rename(old_name='1', new_name='1_1') #Rename frame\nframes.check_obj_legal(name='1') #Asserts frame's existance\nframes.get_section(name='1') #Get the assigned Section name\nframes.get_points(name='1') #Get points connected to frame\n\n#Manipulation\nframes.delete(name='1') #Delete frame\nframes.divide_by_distance(name='1',\n dist=0.5,Iend=True) #Divide frame by distance\nframes.divide_by_intersection(name='2') #Divide at selected intersections\nframes.divide_by_ratio(name='3',ratio=0.3)#Divide at selected ratio\nframes.join('2','3') #Join Colinear frames\nframes.change_points(name='1', point1='1', point2='3') #Change connected points of frame\n\n# Extrude frames to area\nframes.extrude(\n frame_name='8',\n property_name='Default',\n dx=0, dy=144, dz=0,\n num_areas=3,\n del_frame=True\n)\n\n# Get frame properties\nframes.Prop.rename(old_name=\"FSEC1\", new_name=\"MySection\") #Rename frame property\nframes.Prop.total() #Total # of defined frame properties\n```\n\n##### Database\n\nControl the database values\n\nUsage Examples:\n\n```python\ntables = sap.Table\ntables.list_available() #Lists available database tables\ntables.list_all() #Lists all database tables\ntables.get_table_fields('Analysis Options') #Get table Field Info\ntables.get(TableKey='Load Case Definitions', dataframe=False) #Get Table data in `list[dict]` format\ndf = tables.get('Material Properties 01 - General') #Get Table data in pandas dataframe\n\n# Update Table\ndf.iloc[0,0] = 'New Value'\ntables.update(TableKey='Material Properties 01 - General', data=df, apply=True)\n```\n\n##### Select\n\nUsage Examples:\n\n```python\nselect = sap.Select\n\nselect.all() #Select all objects\nselect.clear() #Deselect all objects\n\nselect.constraint(name='Diaph1') #Select points in constraint\nselect.constraint(name='Diaph1', reverse=True) #Deselect points in constraint\n\nselect.invert() #Invert selections\nselect.selected #Returns list of selected objects\nselect.previous() #restores the previous selection\n\n#Selection based on plane\nselect.in_plane(pointname='1', plane='XY') #Select in XY plane\nselect.in_plane(pointname='2', plane='YZ', reverse=False) #Deselect\n\n#Select by property\nselect.property(type='Area', name='ASEC1')\nselect.property(type='Cable', name='CAB1', reverse=True)\nselect.property(type='Frame', name='FSEC1')\nselect.property(type='Link', name='GAP1', reverse=True)\nselect.property(type='Material', name='A992Fy50')\nselect.property(type='Solid', name='SOLID1', reverse=True)\nselect.property(type='Tendon', name='TEN1')\n```\n\n##### Loads\n\nControl the definition and assignments of loads.\n###### Load Patterns\n\nUsage Examples:\n\n```python\npattern = sap.Load.Pattern\nlen(pattern) # List the number of load patterns defined\npattern.list_all() #List defined load patterns\npattern.rename('Dead', 'Live') #Rename previously defined pattern\npattern.delete(name='Dead') #Delete a load pattern\n\npattern.get_selfwt_multiplier('DEAD') #Get defined self weight multiplier\npattern.set_selfwt_multiplier('DEAD', 1.15) #Set self weight multiplier\n\npattern.get_loadtype('DEAD') #Get the defined load type\npattern.set_loadtype('DEAD', pattern_type='LIVE') #Set the defined load type\n\n#Add a Live load case with name \"Custom Live\", a 1.15x self weight multiplier and also generate an accompanying load case\npattern.add(name='Custom Live', pattern_type='LIVE', \n selfwt_multiplier=1.15, add_case=True)\n```\n\n###### Load Cases\n\nUsage Examples:\n\n```python\ncases = sap.Load.Case\nlen(cases) #returns total # of defined cases\ncases.total(casetype='MODAL') #Get # of modal load cases\ncases.list_all() #List all load cases\ncases.rename('DEAD','WATER') #Rename existing load case\ncases.case_info(name='DEAD') #Get the Case type information\ncases.set_type(name='DEAD', casetype='LINEAR_STATIC') #Change the case type of existing load case\n```\n\n###### Modal\n\n`sap.Load.Modal`\n####### Eigen\n\nUsage Examples:\n\n```python\neigen = sap.Load.Modal.Eigen\neigen.set_case(case_name=\"LCASE1\") #Set a Eigen Modal case\n\neigen.set_initial_case(case_name='LCASE1', initial_case='DEAD') #Set initial stiffness case\neigen.get_initial_case(case_name=\"LCASE1\") #Get the Initial Case\n\neigen.get_loads(case_name='LCASE1') #Get the load data\n\n#Set Eigen parameters\neigen.set_parameters(\n case_name='LCASE1',\n EigenShiftFreq=0.05, #cyc/s\n EigenCutOff=0.0001, #cyc/s\n EigenTolerance=0.00000001,\n AllowAutoFreqShift=True\n)\neigen.get_parameters(case_name='LCASE1') #Get Parameters\n\neigen.set_number_modes(case_name='LCASE1', max=10, min=5) #set number of modes\neigen.get_number_modes(case_name='LCASE1') #get number of modes\n```\n\n####### Ritz\n\nUsage Examples:\n\n```python\nritz = sap.Load.Modal.Ritz\nritz.set_case(case_name=\"LCASE1\") #Set a Eigen Modal case\n\nritz.set_initial_case(case_name='LCASE1', initial_case='DEAD') #Set initial stiffness case\nritz.get_initial_case(case_name=\"LCASE1\") #Get the Initial Case\n\nritz.get_loads(case_name='LCASE1') #Get the load data\n\nritz.set_number_modes(case_name='LCASE1', max=10, min=5) #set number of modes\nritz.get_number_modes(case_name='LCASE1') #get number of modes\n```\n\n##### Analyze\n\nUsage Examples:\n\n```python\nanalyze = sap.Analyze\nanalyze.create_model() #Create analysis model\nanalyze.run() #Runs the analysis\nanalyze.case_status() #retrieves the status for all load cases.\nanalyze.get_run_flag() #retrieves the run flags for all cases\nanalyze.set_run_flag(case='MODAL', status=True) # Set case to run\nanalyze.get_solver() #Get solver info\n\n#Set solver options\nanalyze.set_solver(\n SolverType='Standard',\n SolverProcessType='Auto',\n NumberParallelRuns=0,\n StiffCase=''\n) \n```\n\n##### Results\n\nManipulate Results from SAP2000\n\nUsage Examples:\n\n```python\nresults = sap.Results\n\nsetup = sap.Results.Setup\nsetup.clear_casecombo() #Deselect all Case&Combo for results\nsetup.select_case(casename='DEAD') #sets an load case selected for output flag.\nsetup.is_selected_case(casename='DEAD') #checks if an load case is selected for output.\nsetup.select_combo(comboname='DEAD') #sets an load combo selected for output flag.\nsetup.is_selected_combo(comboname='COMB1') #checks if an load combo is selected for output.\nsetup.set_rxn_loc_get(x=0.5, y=0.5, z=5) #sets coordinates of the locn at which the base reactions are reported. \nsetup.base_rxn_loc_get() #retrieves coordinates of the locn at which the base reactions are reported.\n\nresults.joint_reactions(jointname='1') #Get Joint reactions as list of dict\nresults.joint_displacements(jointname='1') #Get Joint displacements as list of dict\nresults.joint_accelerations(jointname='1') #Get joint accelerations\nresults.joint_velocities(jointname='1') #Get joint velocities\n\nresults.delete('MODAL') #Delete results of `MODAL` case\nresults.delete('All') #Delete results of all cases\n```\n\n##### Material\n\nUsage Examples:\n\n```python\nmaterial = sap.Material\nmaterial.rename(old=\"4000Psi\", new=\"MatConc\") #Rename existing material\nmaterial.total() #Total # of defined material properties\nmaterial.delete(name='4000Psi') #Delete existing material property\nmaterial.list_all() #List all defined Material Properties\nmaterial.get_props(name='4000Psi') #Returns basic material property data\nmaterial.add(name='Steel', material_type='Steel') #Initialze Material Property\nmaterial.set_isotropic(name='Steel', E=29500, poisson=0.25, thermal_coeff=6e-06) #Set isotropic material properties\nmaterial.set_density(name='Steel', mass_per_vol=0.00029) #set density\n```\n\n###### Rebar\n\nUsage Examples:\n\n```python\nrebar = sap.Material.Rebar\nrebar.rename(old='R1', new='MyRebar') #Rename rebar\nrebar.total() #Total # of defined rebar properties\nrebar.delete(name='R1') #Delete existing rebar property\nrebar.list_all() #List all defined rebar Properties\nrebar.set_prop(name='MyRebar2', area=1.05, dia=1.0) #Define a rebar property\nrebar.get_prop(name='MyRebar2') #Get rebar property\n```\n\n\n\n\n## 4. Roadmap\n\n- [x] Generate Load Patterns\n- [x] Generate Load Cases\n- [ ] Apply Loads\n - [ ] Points\n - [ ] Area\n - [ ] Line\n- [x] Export joint reactions to Hilti-Profis file\n\n\n## 5. License\n\nSee [LICENSE](https://github.com/rpakishore/ak_sap/blob/main/LICENSE) for more information.\n\n\n## 6. Contact\n\nArun Kishore - [@rpakishore](mailto:pypi@rpakishore.co.in)\n\nProject Link: [https://github.com/rpakishore/ak_sap](https://github.com/rpakishore/ak_sap)\n\n\n## 7. Acknowledgements\n\n- [Shields.io](https://shields.io/)\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": null, "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "dynamic": null, "home_page": null, "keywords": null, "license": null, "maintainer": null, "maintainer_email": null, "name": "ak_sap", "package_url": "https://pypi.org/project/ak_sap/", "platform": null, "project_url": "https://pypi.org/project/ak_sap/", "project_urls": { "Home": "https://github.com/rpakishore/ak_sap" }, "provides_extra": [ "cli", "dev", "gui", "test" ], "release_url": "https://pypi.org/project/ak_sap/0.0.3/", "requires_dist": [ "comtypes==1.2.0", "forallpeople==2.6.7", "pandas==2.1.3", "rich==13.7.0; extra == \"cli\"", "typer[all]==0.9.0; extra == \"cli\"", "ipykernel; extra == \"dev\"", "ipywidgets; extra == \"dev\"", "pandasgui; extra == \"dev\"", "line-profiler; extra == \"dev\"", "streamlit==1.31.0; extra == \"gui\"", "hilti_profis==0.0.3; extra == \"gui\"", "pytest==7.4.3; extra == \"test\"" ], "requires_python": ">=3.11.0", "summary": "Python wrapper for SAP2000 API", "version": "0.0.3", "yanked": false, "yanked_reason": null }, "last_serial": 22829834, "releases": { "0.0.1": [ { "comment_text": null, "digests": { "blake2b_256": "7c7f487f835868a6a9f0806f4edf5a683c114c867e10cbb6c084fc772cd8912c", "md5": "37024334b768a805a3114a814c67eb15", "sha256": "219071424edcbabc7743949d469b9d7eab0a1a000a83c8c33cbf8824595ec33a" }, "downloads": -1, "filename": "ak_sap-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "37024334b768a805a3114a814c67eb15", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.11.0", "size": 32353, "upload_time": "2024-02-27T19:09:16", "upload_time_iso_8601": "2024-02-27T19:09:16.816484Z", "url": "https://files.pythonhosted.org/packages/7c/7f/487f835868a6a9f0806f4edf5a683c114c867e10cbb6c084fc772cd8912c/ak_sap-0.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": null, "digests": { "blake2b_256": "51f0071319d48cd1f278fdf97b6a80c649f18d8354df2c2d65d5669b6b20509a", "md5": "a7478405d1571b984e8dc6c7ac6cf440", "sha256": "f3a5ca3b54369815dd9ec08698ec073e2f262d975c4407be714df45a1da8c08e" }, "downloads": -1, "filename": "ak_sap-0.0.1.tar.gz", "has_sig": false, "md5_digest": "a7478405d1571b984e8dc6c7ac6cf440", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.11.0", "size": 180877, "upload_time": "2024-02-27T19:09:19", "upload_time_iso_8601": "2024-02-27T19:09:19.729132Z", "url": "https://files.pythonhosted.org/packages/51/f0/071319d48cd1f278fdf97b6a80c649f18d8354df2c2d65d5669b6b20509a/ak_sap-0.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.2": [ { "comment_text": null, "digests": { "blake2b_256": "e35ba8cc32a132b656dc69512f2f47de0570cf8f261ec15e1454418f83f3c055", "md5": "3f9ad8447ca198dfa1731f8746d42759", "sha256": "961e220c4ed8c7661be88ac7218ec59637e85aa148918e82f6929cf2c223145d" }, "downloads": -1, "filename": "ak_sap-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "3f9ad8447ca198dfa1731f8746d42759", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.11.0", "size": 38426, "upload_time": "2024-03-08T21:13:39", "upload_time_iso_8601": "2024-03-08T21:13:39.914694Z", "url": "https://files.pythonhosted.org/packages/e3/5b/a8cc32a132b656dc69512f2f47de0570cf8f261ec15e1454418f83f3c055/ak_sap-0.0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": null, "digests": { "blake2b_256": "e1db8136c5d0f457a9fb4696e2bacb1b8af0282412fd997dae7b8f5d67114ffa", "md5": "8c5c4bc253429f06a88ef0091f370ca4", "sha256": "e5b1a3087a9fc5ce893d8a066c136cbb82fb068d1b76d40650ac84e3836e14f6" }, "downloads": -1, "filename": "ak_sap-0.0.2.tar.gz", "has_sig": false, "md5_digest": "8c5c4bc253429f06a88ef0091f370ca4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.11.0", "size": 187686, "upload_time": "2024-03-08T21:13:41", "upload_time_iso_8601": "2024-03-08T21:13:41.783465Z", "url": "https://files.pythonhosted.org/packages/e1/db/8136c5d0f457a9fb4696e2bacb1b8af0282412fd997dae7b8f5d67114ffa/ak_sap-0.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.3": [ { "comment_text": null, "digests": { "blake2b_256": "fa68471ddb369381fae2b7904b8c07f4ad9ba89f09a5174ef1cc6f79dc978ecd", "md5": "210052c0d54ac1a6d63736b16c74e11d", "sha256": "76cfe963e71853896d62a966aa3ccd5c01069238abe772a30382fffa03a28e0e" }, "downloads": -1, "filename": "ak_sap-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "210052c0d54ac1a6d63736b16c74e11d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.11.0", "size": 43536, "upload_time": "2024-04-18T19:22:40", "upload_time_iso_8601": "2024-04-18T19:22:40.417184Z", "url": "https://files.pythonhosted.org/packages/fa/68/471ddb369381fae2b7904b8c07f4ad9ba89f09a5174ef1cc6f79dc978ecd/ak_sap-0.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": null, "digests": { "blake2b_256": "b92613468083c2f220344a2aef9adbcff8bb9c1cbf0324968018352fe62d1160", "md5": "9c70e23929049f26be6f582957ba9456", "sha256": "0cf90a674321a80fb6b31c4d035647f09f03f6a2a8149c5d9828e78f2234e7e2" }, "downloads": -1, "filename": "ak_sap-0.0.3.tar.gz", "has_sig": false, "md5_digest": "9c70e23929049f26be6f582957ba9456", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.11.0", "size": 196635, "upload_time": "2024-04-18T19:22:43", "upload_time_iso_8601": "2024-04-18T19:22:43.017592Z", "url": "https://files.pythonhosted.org/packages/b9/26/13468083c2f220344a2aef9adbcff8bb9c1cbf0324968018352fe62d1160/ak_sap-0.0.3.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": null, "digests": { "blake2b_256": "fa68471ddb369381fae2b7904b8c07f4ad9ba89f09a5174ef1cc6f79dc978ecd", "md5": "210052c0d54ac1a6d63736b16c74e11d", "sha256": "76cfe963e71853896d62a966aa3ccd5c01069238abe772a30382fffa03a28e0e" }, "downloads": -1, "filename": "ak_sap-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "210052c0d54ac1a6d63736b16c74e11d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.11.0", "size": 43536, "upload_time": "2024-04-18T19:22:40", "upload_time_iso_8601": "2024-04-18T19:22:40.417184Z", "url": "https://files.pythonhosted.org/packages/fa/68/471ddb369381fae2b7904b8c07f4ad9ba89f09a5174ef1cc6f79dc978ecd/ak_sap-0.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": null, "digests": { "blake2b_256": "b92613468083c2f220344a2aef9adbcff8bb9c1cbf0324968018352fe62d1160", "md5": "9c70e23929049f26be6f582957ba9456", "sha256": "0cf90a674321a80fb6b31c4d035647f09f03f6a2a8149c5d9828e78f2234e7e2" }, "downloads": -1, "filename": "ak_sap-0.0.3.tar.gz", "has_sig": false, "md5_digest": "9c70e23929049f26be6f582957ba9456", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.11.0", "size": 196635, "upload_time": "2024-04-18T19:22:43", "upload_time_iso_8601": "2024-04-18T19:22:43.017592Z", "url": "https://files.pythonhosted.org/packages/b9/26/13468083c2f220344a2aef9adbcff8bb9c1cbf0324968018352fe62d1160/ak_sap-0.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }