gibson-cli 0.7.4__py3-none-any.whl → 0.7.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  import os
2
4
  import sys
3
5
  from string import Template
@@ -10,6 +12,7 @@ from gibson.command.code.Schema import Schema
10
12
  from gibson.command.code.Test import Test
11
13
  from gibson.command.Merge import Merge
12
14
  from gibson.core.Configuration import Configuration
15
+ from gibson.core.Diff import additions, diff
13
16
  from gibson.core.Spinner import ComputingSpinner, Spinner
14
17
  from gibson.display.Header import Header
15
18
  from gibson.display.WorkspaceFooter import WorkspaceFooter
@@ -60,34 +63,15 @@ class Entity(BaseCommand):
60
63
 
61
64
  return True
62
65
 
63
- def configure_definition(self):
64
- existing_entity = self.memory.recall_entity(sys.argv[3])
65
- if existing_entity is not None:
66
- return existing_entity["definition"]
67
-
68
- parts = sys.argv[3].split("_")
69
- if len(parts) > 1 and parts[1] == "ref":
70
- # This is a reference table implementation. We will handle this here.
71
- with open(self.get_default_ref_table_template_path()) as f:
72
- definition = Template(f.read()).substitute({"entity_name": sys.argv[3]})
73
-
74
- self.memory.append_last({"definition": definition, "name": sys.argv[3]})
75
-
76
- self.conversation.type(
77
- "Reference table created and stored in last memory. What's next?\n"
78
- )
79
- self.conversation.newline()
80
-
81
- exit(1)
82
-
83
- with open(self.get_default_table_template_path()) as f:
84
- return Template(f.read()).substitute({"entity_name": sys.argv[3]})
85
-
86
66
  def execute(self):
87
67
  cli = Cli(self.configuration)
88
-
89
- self.configuration.require_project()
90
- definition = self.configure_definition()
68
+ entity_name = sys.argv[3]
69
+ existing_entity = self.memory.recall_entity(entity_name)
70
+ definition = (
71
+ existing_entity["definition"]
72
+ if existing_entity
73
+ else self.template_definition(entity_name)
74
+ )
91
75
 
92
76
  with ComputingSpinner():
93
77
  self.__context = CodeContextSchemaManager().from_code_writer_schema_context(
@@ -104,10 +88,19 @@ class Entity(BaseCommand):
104
88
  .instantiate(self.configuration.project.datastore.type)
105
89
  .import_from_struct(data)
106
90
  )
91
+ original_entity = entity if existing_entity else None
92
+ original_model_code = (
93
+ data["code"][0]["definition"] if existing_entity else None
94
+ )
107
95
 
108
96
  while True:
109
97
  try:
110
- self.__render_workspace(entity, data["code"][0]["definition"])
98
+ self.__render_workspace(
99
+ original_entity,
100
+ entity,
101
+ original_model_code,
102
+ data["code"][0]["definition"],
103
+ )
111
104
  input_ = input("> ")
112
105
  if input_.lower() in [":q", ":q!", ":wq"]:
113
106
  self.conversation.newline()
@@ -185,8 +178,24 @@ class Entity(BaseCommand):
185
178
  + "/default-table.tmpl"
186
179
  )
187
180
 
188
- def __render_workspace(self, entity: StructureEntity, model):
181
+ def __render_workspace(
182
+ self,
183
+ original_entity: StructureEntity | None,
184
+ entity: StructureEntity,
185
+ original_model_code: str | None,
186
+ model_code: str,
187
+ ):
189
188
  self.configuration.platform.cmd_clear()
189
+ create_table_statement_diff = (
190
+ diff(original_entity.create_statement(), entity.create_statement())
191
+ if original_entity
192
+ else additions(entity.create_statement())
193
+ )
194
+ model_code_diff = (
195
+ diff(original_model_code, model_code)
196
+ if original_model_code
197
+ else additions(model_code)
198
+ )
190
199
 
191
200
  print("")
192
201
  print(WorkspaceHeader().render(self.configuration.project.name))
@@ -194,11 +203,29 @@ class Entity(BaseCommand):
194
203
  print("")
195
204
  print(Header().render("SQL", Colors.cyan))
196
205
  print("")
197
- print(Colors.table(entity.create_statement(), entity.name))
206
+ print(Colors.table(create_table_statement_diff, entity.name))
198
207
 
199
208
  print("")
200
209
  print(Header().render("Model", Colors.yellow))
201
210
  print("")
202
- print(Colors.model(model, entity.name))
203
-
211
+ print(Colors.model(model_code_diff, entity.name))
204
212
  print(WorkspaceFooter().render())
213
+
214
+ def template_definition(self, entity_name):
215
+ parts = entity_name.split("_")
216
+ if len(parts) > 1 and parts[1] == "ref":
217
+ # This is a reference table implementation. We will handle this here.
218
+ with open(self.get_default_ref_table_template_path()) as f:
219
+ definition = Template(f.read()).substitute({"entity_name": entity_name})
220
+
221
+ self.memory.append_last({"definition": definition, "name": entity_name})
222
+
223
+ self.conversation.type(
224
+ "Reference table created and stored in last memory. What's next?\n"
225
+ )
226
+ self.conversation.newline()
227
+
228
+ exit(1)
229
+
230
+ with open(self.get_default_table_template_path()) as f:
231
+ return Template(f.read()).substitute({"entity_name": entity_name})
gibson/core/Diff.py ADDED
@@ -0,0 +1,34 @@
1
+ from difflib import Differ
2
+
3
+ from gibson.core.Colors import green, red
4
+
5
+
6
+ # Highlights all lines as additions with a green + at the beginning
7
+ # This keeps visual clutter to a minimum when showing the diff of an entirely new entity
8
+ def additions(input: str):
9
+ lines = input.splitlines(keepends=True)
10
+ result = []
11
+ for line in lines:
12
+ result.append(f"{green('+')} {line}")
13
+ return "".join(result)
14
+
15
+
16
+ # Highlights the diffs between two strings, showing the additions and removals as distinct colored lines
17
+ def diff(original: str, modified: str):
18
+ diffs = list(
19
+ Differ().compare(
20
+ original.splitlines(keepends=True), modified.splitlines(keepends=True)
21
+ )
22
+ )
23
+
24
+ result = []
25
+ for line in diffs:
26
+ if line.startswith("+ "):
27
+ result.append(green(line))
28
+ elif line.startswith("- "):
29
+ result.append(red(line))
30
+ elif line.startswith(" "):
31
+ result.append(line)
32
+ # Ignore lines starting with '? ' as they are not needed for this highlighting
33
+
34
+ return "".join(result)
gibson/display/Header.py CHANGED
@@ -1,9 +1,11 @@
1
1
  import math
2
2
 
3
+ from gibson.core.Colors import bold
4
+
3
5
 
4
6
  class Header:
5
7
  def render(self, text, colorizer=None):
6
8
  output = text if colorizer is None else colorizer(text)
7
9
  half = math.floor((78 - len(text)) / 2) # 80 line length - 2 spaces
8
- header = "/" * half + f" {output} " + "/" * half
10
+ header = "/" * half + f" {bold(output)} " + "/" * half
9
11
  return header
@@ -5,7 +5,7 @@ class WorkspaceHeader:
5
5
  def render(self, project_name):
6
6
  return (
7
7
  f"Project {project_name}".ljust(50)
8
- + " " * 12
9
- + "[PAIR PROGRAMMER]\n"
8
+ + " " * 14
9
+ + f"{Colors.bold('PAIR PROGRAMMER')}\n"
10
10
  + "-" * 79
11
11
  ).replace(project_name, Colors.project(project_name))
@@ -5,8 +5,8 @@ from gibson.display.Header import Header
5
5
  def test_render():
6
6
  text = "abc def ghi"
7
7
  assert Header().render(text) == (
8
- "///////////////////////////////// abc def ghi /////////////////////////////////"
8
+ f"///////////////////////////////// {Colors.bold(text)} /////////////////////////////////"
9
9
  )
10
10
  assert Header().render(text, Colors.red) == (
11
- f"///////////////////////////////// {Colors.red(text)} /////////////////////////////////"
11
+ f"///////////////////////////////// {Colors.bold(Colors.red(text))} /////////////////////////////////"
12
12
  )
@@ -4,6 +4,6 @@ from gibson.display.WorkspaceHeader import WorkspaceHeader
4
4
 
5
5
  def test_render():
6
6
  assert WorkspaceHeader().render("abc def ghi") == (
7
- f"""Project {Colors.project("abc def ghi")} [PAIR PROGRAMMER]
7
+ f"""Project {Colors.project("abc def ghi")} {Colors.bold("PAIR PROGRAMMER")}
8
8
  -------------------------------------------------------------------------------"""
9
9
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gibson-cli
3
- Version: 0.7.4
3
+ Version: 0.7.5
4
4
  Summary: Gibson Command Line Interface
5
5
  Author-email: GibsonAI <noc@gibsonai.com>
6
6
  Project-URL: Homepage, https://gibsonai.com/
@@ -26,7 +26,7 @@ gibson/command/auth/Logout.py,sha256=V01q4TdbiBqCnIrM6IA4T25fO6ws0UpXp42I3pwHZVM
26
26
  gibson/command/code/Api.py,sha256=sSvAqEJXdgQjYcu0uiM6ndHE3GnfkfVL6eqP2Otkbww,1002
27
27
  gibson/command/code/Base.py,sha256=YJ2a5Hl0f9NXHUBBPvlt-dUIqEPWQz5vH6-1EHmbFbA,640
28
28
  gibson/command/code/Code.py,sha256=Ce8jilFWl1B7Djabf4KoN3s8IgQPQchhxwOis0nFXvM,4234
29
- gibson/command/code/Entity.py,sha256=MJLGi-8a69X3KDMtXX8j6hsDvdhnI05fJUm3p2WfjN4,7779
29
+ gibson/command/code/Entity.py,sha256=ZEDYiNRhg8CPI1GVei9gHMP-PpwcXrggXmhhEDPMPcc,8729
30
30
  gibson/command/code/Model.py,sha256=fEg0A-NjNLHx4I7-FoMVI5ClDf0UcCkKcti2Z-3rnwY,1340
31
31
  gibson/command/code/Models.py,sha256=eoUpZHpR0qwNgX60EWfcNz49GHmBw_FGfBuHH2ueZqY,799
32
32
  gibson/command/code/Schema.py,sha256=3f6iWoq6xzdj9NU3_WrByo7AUj0Tpo2CxtUzkIx73nQ,1346
@@ -69,6 +69,7 @@ gibson/core/CommandRouter.py,sha256=G_4_OToiBQUgvZbO_yuIqYGus0FtV_sk6s9LzGwR4RY,
69
69
  gibson/core/Completions.py,sha256=Bsh25vnf0pjpJA6MJNR_2MA2s58Ujj8XolR8fm8AQ_s,1197
70
70
  gibson/core/Configuration.py,sha256=sGqTRKoM0NaYuL9FKJ1oh5VttZRVshMCp5IgIHABtRA,15866
71
71
  gibson/core/Conversation.py,sha256=X9SeD9kBLmzEbZAOOTTZYV42HhHx-ud_HO_t20D33LA,10383
72
+ gibson/core/Diff.py,sha256=onUJ5_0_S1vKAY_oFgX4vmwQo4byrnXLV4w7QSNA8fY,1071
72
73
  gibson/core/Env.py,sha256=08dZRHzzR0ahrbM4S0bXC7V1xhYQkT8Zefs00qUHf0U,498
73
74
  gibson/core/Memory.py,sha256=kAo9kFgsIAVrofTRepv81pw43Sl2zQrNFsfIy_yMb_w,4037
74
75
  gibson/core/PythonPath.py,sha256=p1q7n_5KnPvA8XbxJyvqC2vrIdEdTiMr6vRU9yj77Cs,1567
@@ -83,12 +84,12 @@ gibson/data/postgresql/default-table.tmpl,sha256=4xON0XyY55OiZhZmJ4RemnKMNFLniuS
83
84
  gibson/db/TableExceptions.py,sha256=LGDPxAVjXmb0EJSFpHC6twHoFzv7nFsFzTj2DXNabQU,196
84
85
  gibson/db/tests/test_db_TableExceptions.py,sha256=tNzn6SybygWXSuj-3i_s6t9LOo1P8gI9S4wSz4UxeCk,312
85
86
  gibson/dev/Dev.py,sha256=O-GiMATpVd9kYHsVfbHaC-Omh17HQ8FalFQNelfxh2s,2544
86
- gibson/display/Header.py,sha256=A6KW4lgCrH67tqi7VrKucVn7lH-lJ-hd3yIauZxhv_A,292
87
+ gibson/display/Header.py,sha256=OA-E2IWa7aBoHWrzuyrD8D4t-sXWXiF4J_1a9cUXtKk,335
87
88
  gibson/display/WorkspaceFooter.py,sha256=Mh18foAb33O1adnecLe7elIqBN8u2ewaSURl99qlcvE,415
88
- gibson/display/WorkspaceHeader.py,sha256=zqWa9xh3I8ky0ghYRmLdpUr4TXSBRyaIIyyVfYsfMQU,306
89
- gibson/display/tests/test_display_Header.py,sha256=gppahcCu3VXQMyIZiB_ixAS-ZygrTtkrx62IGFlWQOk,411
89
+ gibson/display/WorkspaceHeader.py,sha256=143BCT724Ei8B1vF7mJ3iZ--OrE1ALBrrUAGMtxjogM,322
90
+ gibson/display/tests/test_display_Header.py,sha256=q1iPm91shdoayqmtg81loFlTcivgQ1_O84cvWrviqOQ,433
90
91
  gibson/display/tests/test_display_WorkspaceFooter.py,sha256=HBcZ48UwEsJsNEXPcPH8UiuF0Wa15vffEkJILNhwPyw,471
91
- gibson/display/tests/test_display_WorkspaceHeader.py,sha256=8aY62ucD_YfP4DiqsWA3f_PZ9CNr096TuG1vUv0MoVE,373
92
+ gibson/display/tests/test_display_WorkspaceHeader.py,sha256=QAbjAD89LK8dbTadAlAs1nXR5FjqaOZgQAv2SU3PHzU,390
92
93
  gibson/lang/Python.py,sha256=WNbCTFhDh9qXVbeySyfaP-6m-c0wllSCZw8A-r_Z0Oo,1764
93
94
  gibson/lang/tests/test_lang_Python.py,sha256=YpdqYOGAssg-jP9GuzfoU4Y4L7Boj0vAUAJgjuZvedo,1862
94
95
  gibson/services/auth/Server.py,sha256=DfemWNZlZ3rDE6PsAAvDP0anK7czwhiadX6Wilo4agY,1936
@@ -125,8 +126,8 @@ gibson/structure/tests/test_structure_Entity.py,sha256=askl8w0p1uqET6HKBogJlRcPP
125
126
  gibson/tests/test_Env.py,sha256=DPWmP0-aEelducq9bAwv7rKoY2NjWXUeCrzfJDQkn2M,369
126
127
  gibson/tests/test_Memory.py,sha256=YP7owToABAk_-s7fD5UG0HTc4lamDjdA39JUlLnk3Fg,2574
127
128
  gibson/tests/test_utils.py,sha256=r_y-EG05YTCNtL8MWiAK1KmPsmeoMgypKsQC_lVgOtM,559
128
- gibson_cli-0.7.4.dist-info/METADATA,sha256=Nx8vTtLVMaHx3zpI_G3Pi_Xl0VZ8KjdHTdj3MJLpnrI,13171
129
- gibson_cli-0.7.4.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
130
- gibson_cli-0.7.4.dist-info/entry_points.txt,sha256=j5VUvq3AzL21xPvVC24zMoXFt-I5lUWulr66nL3OAPM,50
131
- gibson_cli-0.7.4.dist-info/top_level.txt,sha256=RFaUY7VXGiqkMwo1Rj7pM4kGvxkhhnfo-2LmPpuL_fs,11
132
- gibson_cli-0.7.4.dist-info/RECORD,,
129
+ gibson_cli-0.7.5.dist-info/METADATA,sha256=OuHAiCEQTdnpRzDKYryR6kF4KpF54aUts77G46xMHvs,13171
130
+ gibson_cli-0.7.5.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
131
+ gibson_cli-0.7.5.dist-info/entry_points.txt,sha256=j5VUvq3AzL21xPvVC24zMoXFt-I5lUWulr66nL3OAPM,50
132
+ gibson_cli-0.7.5.dist-info/top_level.txt,sha256=RFaUY7VXGiqkMwo1Rj7pM4kGvxkhhnfo-2LmPpuL_fs,11
133
+ gibson_cli-0.7.5.dist-info/RECORD,,