Skip to content

Commit a1744ad

Browse files
AE-142 PHPStorm tools (#11147)
PHPStorm tools
1 parent 2c6bbc5 commit a1744ad

File tree

2 files changed

+312
-1
lines changed

2 files changed

+312
-1
lines changed

Diff for: bin/phpstorm-command-line-tools.sh

+310
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
#!/bin/bash
2+
3+
# The directory/file selected in PhpStorm ($FileName$) needs to be transformed to the widly used "module" parameter structure (first match applies):
4+
# 1. Items in vendor direcotry are resolved to Core
5+
# a. items ending as "/spryker" OR "/spryker/Bundles": are resolved to "Spryker.all"
6+
# b. items ending as "/spryker-shop" OR "/spryker-shop/Bundles": are resolved to "SprykerShop.all"
7+
# c. items ending as "/spryker-eco" OR "/spryker-eco/Bundles": are resolved to "SprykerEco.all"
8+
# d. items containing "/spryker/spryker/" AND 1 more item: are resolved as "Spryker.{selected camelcased name}" (nonsplit modules)
9+
# d. items containing "/spryker-shop/" AND 1 more item: are resolved as "SprykerShop.{selected camelcased name}"
10+
# d. items containing "/spryker-eco/" AND 1 more item: are resolved as "SprykerEco.{selected camelcased name}"
11+
# d. items containing "/spryker/" AND 1 more item: are resolved as "Spryker.{selected camelcased name}" (standalone modules)
12+
# 2. If item is the root "src" directory OR a 1st level directory in "src" OR a 2nd level directory in "src": are resolved to "all" (project)
13+
# 3. Item: is resolved to "{selected camelcased name}" (project)
14+
TARGET_MODULE_EXPRESSION=$(cat <<'EOF'
15+
TARGET_MODULE=$(if [[ $FileDirRelativeToProjectRoot$ == vendor* ]]; then if [[ $FileDirRelativeToProjectRoot$ == */spryker || $FileDirRelativeToProjectRoot$ == *spryker/Bundles ]]; then echo 'Spryker.all'; elif [[ $FileDirRelativeToProjectRoot$ == */spryker-shop || $FileDirRelativeToProjectRoot$ == *spryker-shop/Bundles ]]; then echo 'SprykerShop.all'; elif [[ $FileDirRelativeToProjectRoot$ == */spryker-eco || $FileDirRelativeToProjectRoot$ == *spryker-eco/Bundles ]]; then echo 'SprykerEco.all'; elif [[ $FileDirRelativeToProjectRoot$ == */spryker/spryker/* ]]; then echo \&quot;Spryker.$TARGET_DIR\&quot;; elif [[ $FileDirRelativeToProjectRoot$ == */spryker-shop/* ]]; then echo \&quot;SprykerShop.$TARGET_DIR\&quot;; elif [[ $FileDirRelativeToProjectRoot$ == */spryker-eco/* ]]; then echo \&quot;SprykerEco.$TARGET_DIR\&quot;; elif [[ &quot;$FileDirRelativeToProjectRoot$&quot; == */spryker/* &amp;&amp; ! &quot;$FileDirRelativeToProjectRoot$&quot; == */spryker/*/* ]]; then echo \&quot;Spryker.$TARGET_DIR\&quot;; fi; else if [[ &quot;$FilePath$&quot; == &quot;$ProjectFileDir$/src&quot; ]] || [[ &quot;$FilePath$&quot; == &quot;$ProjectFileDir$/src/*&quot; &amp;&amp; ! &quot;$FilePath$&quot; == &quot;$ProjectFileDir$/src/*/*/*&quot; ]]; then echo \&quot;all\&quot;; else echo \&quot;$TARGET_DIR\&quot;; fi; fi);
16+
EOF
17+
)
18+
19+
# The directory/file selected in PhpStorm ($FileName$) is transformed to camelcase into TARGET_DIR variable (eg: event-behavior => EventBehavior, AclExtension => AclExtension)
20+
TARGET_DIR_EXPRESSION=$(cat <<'EOF'
21+
TARGET_DIR=$(echo '$FileName$' | awk -F- '{ OFS=\&quot;\&quot;; for(i=1; i&lt;=NF; i++) $i = toupper(substr($i,1,1)) substr($i,2); print }');
22+
EOF
23+
)
24+
25+
XML_CONTENT_START=$(cat <<'EOF'
26+
<toolSet name="Spryker Tools">
27+
EOF
28+
)
29+
30+
XML_CONTENT_END=$(cat <<'EOF'
31+
32+
</toolSet>
33+
EOF
34+
)
35+
36+
XML_GENERIC_COMMANDS=$(cat <<'EOF'
37+
38+
<tool name="code:sniff:style -f" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true">
39+
<exec>
40+
<option name="COMMAND" value="bash " />
41+
<option name="PARAMETERS" value="-c &quot;echo ''; __TARGETDIR__ __TARGETMODULE__ echo \&quot; Executing: APPLICATION_ENV=development DEVELOPMENT_CONSOLE_COMMANDS=1 $ProjectFileDir$/__COMMAND__ c:s:s -m $TARGET_MODULE -f \&quot; ; echo ''; __TARGETDIR__ __TARGETMODULE__ APPLICATION_ENV=development DEVELOPMENT_CONSOLE_COMMANDS=1 $ProjectFileDir$/__COMMAND__ c:s:s -m $TARGET_MODULE -f; echo ''; &quot;" />
42+
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
43+
</exec>
44+
</tool>
45+
<tool name="code:phpstan" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true">
46+
<exec>
47+
<option name="COMMAND" value="bash " />
48+
<option name="PARAMETERS" value="-c &quot;echo ''; __TARGETDIR__ __TARGETMODULE__ echo \&quot; Executing: APPLICATION_ENV=development DEVELOPMENT_CONSOLE_COMMANDS=1 $ProjectFileDir$/__COMMAND__ code:phpstan -m $TARGET_MODULE -vvv \&quot; ; echo ''; __TARGETDIR__ __TARGETMODULE__ APPLICATION_ENV=development DEVELOPMENT_CONSOLE_COMMANDS=1 $ProjectFileDir$/__COMMAND__ code:phpstan -m $TARGET_MODULE -vvv ; echo ''; &quot;" />
49+
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
50+
</exec>
51+
</tool>
52+
<tool name="code:sniff:architecture" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true">
53+
<exec>
54+
<option name="COMMAND" value="bash " />
55+
<option name="PARAMETERS" value="-c &quot;echo ''; __TARGETDIR__ __TARGETMODULE__ echo \&quot; Executing: APPLICATION_ENV=development DEVELOPMENT_CONSOLE_COMMANDS=1 $ProjectFileDir$/__COMMAND__ code:sniff:architecture -m $TARGET_MODULE -vvv \&quot; ; echo ''; __TARGETDIR__ __TARGETMODULE__ APPLICATION_ENV=development DEVELOPMENT_CONSOLE_COMMANDS=1 $ProjectFileDir$/__COMMAND__ code:sniff:architecture -m $TARGET_MODULE -vvv ; echo ''; &quot;" />
56+
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
57+
</exec>
58+
</tool>
59+
EOF
60+
)
61+
62+
XML_CORE_COMMANDS=$(cat <<'EOF'
63+
64+
<tool name="codecept run (limited, localmachine)" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true">
65+
<exec>
66+
<option name="COMMAND" value="bash " />
67+
<option name="PARAMETERS" value="-c &quot;echo ''; __TARGETDIR__ __TARGETMODULE__ echo \&quot; Executing: APPLICATION_ENV=development DEVELOPMENT_CONSOLE_COMMANDS=1 $ProjectFileDir$/vendor/bin/codecept run -c $FileDirRelativeToProjectRoot$ \&quot; ; echo ''; __TARGETDIR__ __TARGETMODULE__ APPLICATION_ENV=development DEVELOPMENT_CONSOLE_COMMANDS=1 $ProjectFileDir$/vendor/bin/codecept run -c $FileDirRelativeToProjectRoot$ ; echo ''; &quot;" />
68+
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
69+
</exec>
70+
</tool>
71+
<tool name="dev:validate-module-transfers" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true">
72+
<exec>
73+
<option name="COMMAND" value="bash" />
74+
<option name="PARAMETERS" value="-c &quot;echo ''; __TARGETDIR__ __TARGETMODULE__ echo \&quot; Executing: APPLICATION_ENV=development $ProjectFileDir$/vendor/bin/spryker-dev-console dev:validate-module-transfers -m $TARGET_MODULE -vvv \&quot; ; echo ''; __TARGETDIR__ __TARGETMODULE__ APPLICATION_ENV=development $ProjectFileDir$/vendor/bin/spryker-dev-console dev:validate-module-transfers -m $TARGET_MODULE -vvv ; echo ''; &quot;" />
75+
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
76+
</exec>
77+
</tool>
78+
<tool name="dev:validate-module-schemas" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true">
79+
<exec>
80+
<option name="COMMAND" value="bash" />
81+
<option name="PARAMETERS" value="-c &quot;echo ''; __TARGETDIR__ __TARGETMODULE__ echo \&quot; Executing: APPLICATION_ENV=development $ProjectFileDir$/vendor/bin/spryker-dev-console dev:validate-module-schemas -m $TARGET_MODULE -vvv \&quot; ; echo ''; __TARGETDIR__ __TARGETMODULE__ APPLICATION_ENV=development $ProjectFileDir$/vendor/bin/spryker-dev-console dev:validate-module-schemas -m $TARGET_MODULE -vvv ; echo ''; &quot;" />
82+
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
83+
</exec>
84+
</tool>
85+
<tool name="dev:validate-module-databuilders" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true">
86+
<exec>
87+
<option name="COMMAND" value="bash" />
88+
<option name="PARAMETERS" value="-c &quot;echo ''; __TARGETDIR__ __TARGETMODULE__ echo \&quot; Executing: APPLICATION_ENV=development $ProjectFileDir$/vendor/bin/spryker-dev-console dev:validate-module-databuilders -m $TARGET_MODULE -vvv \&quot; ; echo ''; __TARGETDIR__ __TARGETMODULE__ APPLICATION_ENV=development $ProjectFileDir$/vendor/bin/spryker-dev-console dev:validate-module-databuilders -m $TARGET_MODULE -vvv ; echo ''; &quot;" />
89+
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
90+
</exec>
91+
</tool>
92+
EOF
93+
)
94+
95+
96+
97+
XML_GENERIC_COMMANDS="${XML_GENERIC_COMMANDS//__TARGETDIR__/$TARGET_DIR_EXPRESSION}"
98+
XML_GENERIC_COMMANDS="${XML_GENERIC_COMMANDS//__TARGETMODULE__/$TARGET_MODULE_EXPRESSION}"
99+
XML_CORE_COMMANDS="${XML_CORE_COMMANDS//__TARGETDIR__/$TARGET_DIR_EXPRESSION}"
100+
XML_CORE_COMMANDS="${XML_CORE_COMMANDS//__TARGETMODULE__/$TARGET_MODULE_EXPRESSION}"
101+
102+
display_help() {
103+
cat << EOF
104+
Description:
105+
Copy Spryker Tool configuration files to the local machine PhpStorm configuration folder.
106+
107+
Usage:
108+
vendor/bin/phpstorm-command-line-tools.sh [options]
109+
110+
Options:
111+
-y Automatically agree to copy/remove the configuration files to the local machine PhpStorm configuration folder.
112+
--platform=PLATFORM Set the platform for the configuration (default: docker). Options: docker, local.
113+
-p PLATFORM Shorthand for --platform, specify either "docker" or "local".
114+
-u, --uninstall Uninstall the Spryker tools configuration from the local PhpStorm configuration folder.
115+
-h Display this help message.
116+
117+
Help:
118+
This script will copy configuration files to the local PhpStorm configuration folder for the latest version of PhpStorm.
119+
120+
Example of usage:
121+
122+
./phpstorm-command-line-tools.sh -y --platform=local
123+
This will run the script and automatically copy the configuration files for local machine tools without asking for confirmation.
124+
125+
./phpstorm-command-line-tools.sh -u
126+
This will uninstall the Spryker tools configuration from the local PhpStorm configuration folder.
127+
128+
Use -h to display this help message:
129+
130+
./phpstorm-command-line-tools.sh -h
131+
132+
EOF
133+
}
134+
135+
136+
AUTO_CONFIRM=false
137+
PLATFORM="docker" # Default value
138+
UNINSTALL=false
139+
140+
while [[ $# -gt 0 ]]; do
141+
case "$1" in
142+
-y)
143+
AUTO_CONFIRM=true
144+
shift # Remove -y from processing
145+
;;
146+
-p)
147+
# Ensure the platform argument exists and is valid for -p
148+
if [[ -z "$2" || ( "$2" != "docker" && "$2" != "local" ) ]]; then
149+
echo "Invalid platform option: $2 (allowed: docker, local)" >&2
150+
exit 1
151+
fi
152+
PLATFORM="$2"
153+
shift 2 # Remove both -p and its argument
154+
;;
155+
--platform=*)
156+
PLATFORM="${1#*=}"
157+
if [[ "$PLATFORM" != "docker" && "$PLATFORM" != "local" ]]; then
158+
echo "Invalid platform option: $PLATFORM (allowed: docker, local)" >&2
159+
exit 1
160+
fi
161+
shift # Remove this argument
162+
;;
163+
-u|--uninstall)
164+
UNINSTALL=true
165+
shift # Remove -u or --uninstall from processing
166+
;;
167+
-h|--help)
168+
display_help
169+
exit 0
170+
;;
171+
*)
172+
echo "Invalid option: $1" >&2
173+
exit 1
174+
;;
175+
esac
176+
done
177+
178+
delete_from_jetbrains() {
179+
# Take the base directory as an argument
180+
local BASE_DIR="$1"
181+
182+
# Find the latest product version directory
183+
LATEST_DIR=$(find "$BASE_DIR" -maxdepth 1 -type d -name 'PhpStorm*' | sort -V | tail -n 1)
184+
185+
# Check if the latest PhpStorm configuration directory was found
186+
if [[ -n "$LATEST_DIR" ]]; then
187+
DEST_DIR="$LATEST_DIR/tools"
188+
FILE_PATH="$DEST_DIR/Spryker Tools.xml"
189+
190+
# Check if the Spryker Tools.xml file exists
191+
if [[ -f "$FILE_PATH" ]]; then
192+
# If AUTO_CONFIRM is not true, ask for confirmation
193+
if ! $AUTO_CONFIRM; then
194+
echo -e "\033[0;33mThis script will delete the Spryker Tools configuration file from your local JetBrains PhpStorm configuration directory:\033[0m"
195+
echo "File to be deleted: $FILE_PATH"
196+
read -p "Do you agree to proceed with the deletion? (y/n): " confirm
197+
198+
if [[ "$confirm" != "y" ]]; then
199+
echo "Operation canceled."
200+
return 1
201+
fi
202+
fi
203+
204+
# Proceed to delete the file
205+
rm -f "$FILE_PATH"
206+
echo "Deleted $FILE_PATH ."
207+
echo -e "\033[0;33mPlease restart PhpStorm for the changes to take effect.\033[0m"
208+
else
209+
echo "No Spryker Tools.xml file found in $DEST_DIR."
210+
fi
211+
else
212+
echo "No JetBrains product directory found in $BASE_DIR."
213+
fi
214+
}
215+
216+
# Function to handle copying on both macOS and Linux
217+
copy_to_jetbrains() {
218+
# Take the base directory as an argument
219+
local BASE_DIR="$1"
220+
221+
# Find the latest product version directory
222+
LATEST_DIR=$(find "$BASE_DIR" -maxdepth 1 -type d -name 'PhpStorm*' | sort -V | tail -n 1)
223+
224+
if [[ -n "$LATEST_DIR" ]]; then
225+
DEST_DIR="$LATEST_DIR/tools"
226+
227+
# If the -y flag was not provided, ask for confirmation
228+
if ! $AUTO_CONFIRM; then
229+
echo -e "\033[0;33mThis script will create or modify a file in your local machine JetBrains PhpStorm configuration directory:\033[0m"
230+
echo "File: $DEST_DIR/Spryker Tools.xml"
231+
read -p "Do you agree to proceed? (y/n): " confirm
232+
233+
if [[ "$confirm" != "y" ]]; then
234+
echo "Operation canceled."
235+
exit 1
236+
fi
237+
fi
238+
239+
mkdir -p "$DEST_DIR"
240+
241+
if [[ "$PLATFORM" == "local" ]]; then
242+
XML_GENERIC_COMMANDS="${XML_GENERIC_COMMANDS//__COMMAND__/vendor/bin/console}"
243+
if [[ -f "./vendor/bin/spryker-dev-console" ]]; then
244+
echo "$XML_CONTENT_START$XML_GENERIC_COMMANDS$XML_CORE_COMMANDS$XML_CONTENT_END" > "$DEST_DIR/Spryker Tools.xml"
245+
else
246+
echo "$XML_CONTENT_START$XML_CORE_COMMANDS$XML_CONTENT_END" > "$DEST_DIR/Spryker Tools.xml"
247+
fi
248+
249+
echo ""
250+
echo "Successfully created Spryker Tools.xml in $DEST_DIR with"
251+
echo "- vendor/bin/console code:sniff:style -f -m [module]"
252+
echo "- vendor/bin/console code:phpstan -m [module] -vvv"
253+
echo "- vendor/bin/console code:sniff:architecture -m [module] -vvv"
254+
if [[ -f "./vendor/bin/spryker-dev-console" ]]; then
255+
echo "- vendor/bin/codecept run -c [relative directory]"
256+
echo "- vendor/bin/spryker-dev-console dev:validate-module-transfers -m [module] -vvv"
257+
echo "- vendor/bin/spryker-dev-console dev:validate-module-schemas -m [module] -vvv"
258+
echo "- vendor/bin/spryker-dev-console dev:validate-module-databuilders -m [module] -vvv"
259+
fi
260+
echo ""
261+
echo -e "\033[1;33mImportant:\033[0m To execute commands from within PhpStorm, verify that all required tools are installed and runnable on your local machine."
262+
echo -e "\033[0;33mPlease restart PhpStorm for the changes to take effect.\033[0m"
263+
264+
elif [[ "$PLATFORM" == "docker" ]]; then
265+
XML_GENERIC_COMMANDS="${XML_GENERIC_COMMANDS//__COMMAND__/docker/sdk console}"
266+
echo "$XML_CONTENT_START$XML_GENERIC_COMMANDS$XML_CONTENT_END" > "$DEST_DIR/Spryker Tools.xml"
267+
echo ""
268+
echo "Successfully created Spryker Tools.xml in $DEST_DIR with"
269+
echo "- docker/sdk console code:sniff:style -f -m [module]"
270+
echo "- docker/sdk console code:phpstan -m [module] -vvv"
271+
echo "- docker/sdk console code:sniff:architecture -m [module] -vv"
272+
if [[ -f "./vendor/bin/spryker-dev-console" ]]; then
273+
echo "Info: vendor/bin/spryker-dev-console and vendor/bin/codecept commands were not registered as they require local machine to run."
274+
fi
275+
echo ""
276+
echo -e "\033[1;33mImportant:\033[0m To execute commands from within PhpStorm, ensure that Spryker Docker is running."
277+
echo -e "\033[0;33mPlease restart PhpStorm for the changes to take effect.\033[0m"
278+
279+
else
280+
echo "Error: Unexpected argument combination. Please specify a valid PLATFORM value ('local' or 'docker')." >&2
281+
exit 1
282+
fi
283+
else
284+
echo "No JetBrains product directory found in $BASE_DIR."
285+
286+
exit 0
287+
fi
288+
}
289+
290+
if [[ "$UNINSTALL" != true ]]; then
291+
if ! command -v awk &> /dev/null; then
292+
echo "Error: 'awk' is not installed. Please install it before running this script."
293+
exit 1
294+
fi
295+
fi
296+
297+
if [[ "$OSTYPE" == "darwin"* ]]; then
298+
BASE_DIR="$HOME/Library/Application Support/JetBrains"
299+
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
300+
BASE_DIR="$HOME/.config/JetBrains"
301+
else
302+
echo "Unsupported operating system: $OSTYPE"
303+
exit 1
304+
fi
305+
306+
if [[ "$UNINSTALL" == true ]]; then
307+
delete_from_jetbrains "$BASE_DIR"
308+
else
309+
copy_to_jetbrains "$BASE_DIR"
310+
fi

Diff for: composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
}
5555
},
5656
"bin": [
57-
"bin/development"
57+
"bin/development",
58+
"bin/phpstorm-command-line-tools.sh"
5859
]
5960
}

0 commit comments

Comments
 (0)