Software Components 101 - Part 15 Joining Components
Introduction
At this point, we have parsed 4 components - v, v/x, v/x/y and v/x/y/z.
We are avoiding parsing the left-overs, z and c, for now. We think that the details will not be of help in designing and debugging the process (we’ll see if that assumption is correct, later).
Join - Simple
Let’s join two components and build from there.
Let’s join v and v/x.
We write a simple bash script
#!/bin/bash
# join two .pl files and re-sort into the final .pl file
# inputs: $1, $2
# output: $3.pl
cat $1.pl $2.pl > _temp
sort _temp >$3.pl
and run it
./join.bash v v_x inc
Next, we run our query:
pseudo % ./run-qr.bash inc
inc
component IDs [v_0,v_3,v_7,v_9,v_x_0,v_x_10,v_x_4,v_x_8]
components [v,v_b,v_c,v_x,v_x,v_x_d,v_x_y,v_x_c]
ports [v_a,v_x_a,v_x_b,v_x_c,v_d,v_b_a,v_b_b,v_x_a,v_x_d_a,v_x_d_b,v_x_b,v_x_c,v_x_y_a,v_x_y_b,v_x_y_c]
links [v_b,v_x,v_x_d,v_x_y]
arrows [[[v_a,v_b_a]],[[v_a,v_x_a]],[[v_b_b,v_c]],[[v_c,v_x_b]],[[v_x_c,v_d]],[[v_x_a,v_x_y_a]],[[v_x_b,v_x_y_b]],[[v_x_c,v_x_d_a]],[[v_x_d_b,v_x_e]],[[v_x_y_c,v_x_c]]]
and see that the joined component v/x
is still being reported as a link
, and, v/x
is reported twice in the components list.
After joining v
and v/x
, we should see 3 link components v/x/y
, v/b/
and v/x/d
.
The list of links currently includes v/x
. We need to modify our factbase and our query.
Joining should make v/x
into a sub-component of v
.
We want to change v
s notion of v/x
.
What if we try to knock out the chain of declarations of v/x
from v
?
Let’s try that with a simple manual edit.
As humans who are getting really, really bored, we edit v.md for this test.
Low Level Test 1
We make the manual edit and get
pseudo % ./run.bash
pseudo % ./join.bash v v_x inc
pseudo % ./run-qr.bash inc
inc
component IDs [v_0,v_3,v_7,v_x_0,v_x_10,v_x_4,v_x_8]
components [v,v_b,v_c,v_x,v_x_d,v_x_y,v_x_c]
ports [v_a,v_d,v_b_a,v_b_b,v_x_a,v_x_d_a,v_x_d_b,v_x_b,v_x_c,v_x_y_a,v_x_y_b,v_x_y_c]
links [v_b,v_x_d,v_x_y]
arrows [[[v_a,v_b_a]],[[v_a,v_x_a]],[[v_b_b,v_c]],[[v_c,v_x_b]],[[v_x_c,v_d]],[[v_x_a,v_x_y_a]],[[v_x_b,v_x_y_b]],[[v_x_c,v_x_d_a]],[[v_x_d_b,v_x_e]],[[v_x_y_c,v_x_c]]]
Now, v/x
does not appear as a link and appears only once in the components list.
Actually, that’s not quite correct (our test is lying to us).
We want to replace the v/x hierarchy in v.md with the v_x.md hierarchy.
Again, that’s not quite right.
We want
- to demote
v/x
by one level (## instead of # and so on) - paste the demoted version into
v
after deletingv/x
fromv
.
pseudo % ./run.bash
pseudo % ./join.bash v v_x inc
pseudo % ./run-qr.bash inc
inc
component IDs [v_0,v_13,v_17,v_19,v_3,v_7,v_9,v_x_0,v_x_10,v_x_4,v_x_8]
components [v,v_x_y,v_x_c,v_x_d,v_b,v_c,v_x,v_x,v_x_d,v_x_y,v_x_c]
ports [v_a,v_x_a,v_x_b,v_x_c,v_x_y_a,v_x_y_b,v_x_y_c,v_d,v_x_d_a,v_x_d_b,v_b_a,v_b_b,v_x_a,v_x_d_a,v_x_d_b,v_x_b,v_x_c,v_x_y_a,v_x_y_b,v_x_y_c]
links [v_x_y,v_x_d,v_b,v_x_d,v_x_y]
arrows [[[v_a,v_b_a]],[[v_a,v_x_a]],[[v_b_b,v_c]],[[v_c,v_x_b]],[[v_x_a,v_x_y_a]],[[v_x_b,v_x_y_b]],[[v_x_c,v_d]],[[v_x_c,v_x_d_a]],[[v_x_d_b,v_x_e]],[[v_x_y_c,v_x_c]],[[v_x_a,v_x_y_a]],[[v_x_b,v_x_y_b]],[[v_x_c,v_x_d_a]],[[v_x_d_b,v_x_e]],[[v_x_y_c,v_x_c]]]
That’s better, but still no cigar. V/x/y
and v/x/d
appear twice in the links (and other places). Maybe something is wrong with
- our manual edit
- our query, or,
- something else.
We can view this join as a .
This diagram shows what we want to do. The exising arrows in v
can remain, since they connect to v/x
but do not penetrate the boundaries of v/x
.
In a more automated version, we would want to convert circles in v/x
into rects. Or would we?
unifinished - experimenting with .png files and .md