Jump to content
marcus

wireshell - an extendable ProcessWire command line interface

Recommended Posts

wireshell 1.0.0 is out   :) 

See Bea's post

Quote

 

wireshell 1.0.0  :)

Compatibility: ProcessWire 3.x

  • Prepares wireshell for ProcessWire 3.x, adds namespace support, only supports ProcessWire 3.x
  • Updates Github Repository: github.com/processwire/processwire
  • Improves module:upgrade command, if no argument is provided it just checks for upgrades
  • Extends new command, adds option --src=path/to/source to be able to use a pre-downloaded tgz/zip/folder
  • Extends status command, only shows database password if --pass option is provided, shows if an upgrade is available
  • Updates upgrade command, removes options dev and devns

 

 

wireshell.gif

-------- Original post -----------

 
Now this one could be a rather long post about only an experimental niche tool, but maybe a helpful one for some, so stay with me ;)
 
Intention
Do you guys know "Artisan" (Laravel) or "Drush" (Drupal)? If not: These are command line companions for said systems, and very useful for running certain (e.g. maintenance, installation) task quickly - without having to use the Admin Interface, first and foremost when dealing with local ProcessWire installations. And since it has a powerful API and an easy way of being bootstrapped into CLIs like this, I think such a tool has a certain potential in the PW universe. 
 
It's totally not the first approach of this kind. But: this one should be easily extendable - and is based on PHP (specifically: the Console component of the Symfony Framework). Every command is tidily wrapped in its own class, dependencies are clearly visible, and so on.
 
( Here was the outdated documentation. Please visit wireshell.pw for the current one )
  • Like 33

Share this post


Link to post
Share on other sites

Just as I'm in the means to build a separate directory for bugfixes, where I just paste in disposable processwire installations. Really great. Will certainly take a look at it later. I can also see this very useful for setting up base installations in a more flexible way than siteprofiles. 

  • Like 2

Share this post


Link to post
Share on other sites

Great! Thanks for this, Marcus. So far, everything looks good here on Windows - have only just installed PW-dev, going to work with other commands now. (Update: Everything works like a charm. Looking forward to seeing more Commands.)

For Windows users interested in making this global:

  1. Make sure PHP is in your PATH
  2. Create a wireshell folder somewhere (also added to your path), and create a wireshell.bat file:
@echo off
php "path\to\wireshell" %*

Then you can run wireshell new --dev anywhere you like.

  • Like 6

Share this post


Link to post
Share on other sites

Thanks for the positive feedback!

Some updates in 0.2.0:

  • Attach roles on the fly while user creation: $ wireshell create-user foo --roles=superuser,editor
  • Create templates and attach existing fields on the fly with $ wireshell create-template contact --fields=body,sidebar , prevent template file creation with --nofile
  • Command aliases now available: c-u, c-t, c-r, s

Now planning field creation. :)

  • Like 6

Share this post


Link to post
Share on other sites

Ever since I learned about drush I knew PW could benefit greatly from similar tool. Great job, Marcus!

Those "with dashes in-between" comands look a little weird for a cli interface. I saw you can easilly add aliases for commands, so maybe cr showd be included as a third one (as it is quicker to type)? Drush commands comprise of an object being manipulated followed by a "manipulation type". Not saying it is the right way to go, but it is better to choose some naming pattern explicitly.

Wireshell is a bit long too... Why not add an alias like ''wish" (for WIre SHell). It sounds magical, and isn't PW a wish come true?!

Thank you for developing this!

P.S. It kind of bugs me a little that this cli tool is written with symphony, not with PW itself. I am not even close to being able to argue here, but can it even be done?

  • Like 1

Share this post


Link to post
Share on other sites

Ever since I learned about drush I knew PW could benefit greatly from similar tool. Great job, Marcus!

Those "with dashes in-between" comands look a little weird for a cli interface. I saw you can easilly add aliases for commands, so maybe cr showd be included as a third one (as it is quicker to type)? Drush commands comprise of an object being manipulated followed by a "manipulation type". Not saying it is the right way to go, but it is better to choose some naming pattern explicitly.

Wireshell is a bit long too... Why not add an alias like ''wish" (for WIre SHell). It sounds magical, and isn't PW a wish come true?!

Thank you for developing this!

P.S. It kind of bugs me a little that this cli tool is written with symphony, not with PW itself. I am not even close to being able to argue here, but can it even be done?

Regarding aliases: Yeah, I'm aware of the dash, and wanted to try cr, cu, ct first, but in the case of "cr" Symfony Console bugged me with the following error:

Bildschirmfoto%202015-03-28%20um%2017.01

So in favor of consistency (cu. ct. cro?) I went for the dash.

As for "$ wish", that was also my first thought (especially regarding the pun), but I learned that - at least on Unix and OS X - there's a programm called "wish" already present (https://www.tcl.tk/)

/ Edit: and I'm totally open for a "command style standard". The current order "verb-noun" was nothing but a gut decision.

Edited by marcus

Share this post


Link to post
Share on other sites

Seems like you put the same alias for 3 commands...

Nope, but since the other two also start with cr.. Console component tends to misunderstand cr as an incomplete command.

Share this post


Link to post
Share on other sites

Not sure if this can be done with Symfony Console (I've never really looked at it before), but what about `create:user`, where a colon is used? I must be honest and say that I'm not one for short aliases - have always preferred concise, clear-cut naming. But, I'm sure others appreciate faster typing. ;-)

  • Like 2

Share this post


Link to post
Share on other sites

Not sure if this can be done with Symfony Console (I've never really looked at it before), but what about `create:user`, where a colon is used?

Good idea, totally possible and artisan-y. 

  • Like 1

Share this post


Link to post
Share on other sites

I'm being really silly - of course it's possible. Didn't even look at the source earlier. Simple as pie, like commands in Laravel.

Yeah, I just think that it gives a nice factory feel to it. Also, it makes the commands a tad easier to remember, considering there'll probably be quite a few as you go along.

Share this post


Link to post
Share on other sites

Hi all, 

With interest of everyone and love for Processwire, I will send a the PR to wireshell . So it will be a a one click installer.

  • Like 4

Share this post


Link to post
Share on other sites

Hi,

this tool is really cool idea. It would be great to have command for full PW installation, not just download. I've managed it by modifying original install.php file from PW 2.5 sources. But I'm not sure if it is production ready, it works but I haven't tested all edge cases. It requires config file with configuration array (db connection, profile, admin user credentials, ...). If you are interested I can post it somewhere. I plan to do it also for PW 2.4. With this comes and idea for 'new' command to allow installation of another versions other than the latest.

EDIT:

... So it will be a a one click installer.

Hari KT, don't you have the same intention? What do you mean by 'one click installer'. Installer for wireshell or for PW?

Share this post


Link to post
Share on other sites

@Richard: Hari KT said in his post he will send a PR (Pull Request) to WireShell. So it will be a one click step installer for WireShell, I think. :)

Share this post


Link to post
Share on other sites

Thanks for the proposals regarding an installer process, @HariKT and @Richard. A command named "new" definitely promises more than a download, that's right. But for this command I was just tipping my toe in the water, and testdriving the Console component, mimiking "laravel new" (which actually just is a download since there's no installation in the classic sense). Actually your thread about a command line installation of PW got me started with Wireshell in the first place :) So it's really cool that you'll contribute. Looking forward to the PR!

@Richard, it would be cool if you can post your approach to this. Frankly speaking I'm still in the learning phase regarding whats really possible with the API and would be glad if we could discuss in this thread the best approach about this - probably - most important command of Wireshell :)

 

  • Like 1

Share this post


Link to post
Share on other sites

Big update! Version 0.3.0 comes with:
 

  • a new "NewCommand" provided by HariKT! Big thanks again. This contribution should lead to a better workflow with Wireshell since it opens up the possibility to install PW via command line in a convenient way
  • A command for creating fields
  • A command for assigning fields to existing templates
  • A generic backup command (DB dump)
  • Commands for en/disabling modules (downloading them via Wireshell is still on my bucket list)
  • A little command outputting the currently installed ProcessWire version
  • An unified approach to naming commands and classes: entity:verb, so for example user:create
  • I dropped the "(Experimental)" from the topic's title  ;)

Read more about the available new commands and their options in the readme.

If you have an older version of Wireshell installed, make sure you "$ composer update" it in order to get the new dependencies. And we're on packagist now: https://packagist.org/packages/wireshell/wireshell
 

  • Like 14

Share this post


Link to post
Share on other sites

Great! Thanks for this, Marcus. So far, everything looks good here on Windows - have only just installed PW-dev, going to work with other commands now. (Update: Everything works like a charm. Looking forward to seeing more Commands.)

For Windows users interested in making this global:

  1. Make sure PHP is in your PATH
  2. Create a wireshell folder somewhere (also added to your path), and create a wireshell.bat file:
@echo off
php "path\to\wireshell" %*

Then you can run wireshell new --dev anywhere you like.

Since Wireshell is on packagist now and "composer global require wireshell/wireshell" installs it into "~/.composer/vendor/bin/wireshell" on Linux, could you test/check what the comparable Windows path or workflow would be? I'm currently rewriting (simplifying) the installation guide. Cheers!

  • Like 2

Share this post


Link to post
Share on other sites

On Windows, it installs to C:\Users\<user>\AppData\Roaming\Composer\vendor\wireshell\wireshell\ ... Not sure what the best way of making this global is, other than making a batch file look specifically in that directory. I must admit: I'm not a composer fundi, but I get the basics...

Update: In fact, if I run wireshell directly from the above directory (using php wireshell), it doesn't run because it's looking for vendor/autoload.php in that directory too. If I run the nasty php vendor/wireshell/wireshell/wireshell from the C:\Users\<user>\AppData\Roaming\Composer directory, it works. Phew, quite messy. But, like I said, I'm no fundi - there must be a better way to do this.

  • Like 1

Share this post


Link to post
Share on other sites

On Windows, it installs to C:\Users\<user>\AppData\Roaming\Composer\vendor\wireshell\wireshell\ ... Not sure what the best way of making this global is, other than making a batch file look specifically in that directory. I must admit: I'm not a composer fundi, but I get the basics...

Update: In fact, if I run wireshell directly from the above directory (using php wireshell), it doesn't run because it's looking for vendor/autoload.php in that directory too. If I run the nasty php vendor/wireshell/wireshell/wireshell from the C:\Users\<user>\AppData\Roaming\Composer directory, it works. Phew, quite messy. But, like I said, I'm no fundi - there must be a better way to do this.

Thanks so far! I discovered an installation guide for "laravel install" on windows: http://www.bitspedia.com/2014/09/how-to-install-and-make-first-laravel.html :

  1. Add your ~/.composer/vendor/bin path into Path environmental variable, so that Windows Command Prompt could identify laravel command that would be used later to install Laravel and doing other tasks. In my case the path where its located is: C:\Users\UserName\AppData\Roaming\Composer\vendor\bin 

    so I added it into my Path environmental variable. Must restart your Shell or Command-Prompt so that updated Path variables is loaded.

And when I googled "windows Path environmental variable", got this: http://www.computerhope.com/issues/ch000549.htm. This GUI/matrix seems to be the counterpart to .bashrc.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By louisstephens
      So I was tinkering around with the "select fields" field type and added it to a repeater. My thoughts were I could have a user select a field (textarea, text, etc etc) that I defined and give it a name (another field in the repeater) and create their own form on the page. To be honest, I am now a little lost with rendering the form and mailing the results as potentially the form will be unique and custom every time.  The only way I know to handle the output is by going about it this way:
      $forms = $page->form_select_fields; foreach($forms as $form) { if($form->name === "form_input") { //output input with custom name } elseif($form->name === "form_textarea") { //output input with custom name } } Is there a better way to go about rendering the elements from the repeater? As far as the custom sending goes, I am really at a loss since it would be pretty dynamic. Has anyone used this type of approach, and if so, how did you handle this without going insane?
    • By Harmen
      I want to add a few pages to an AsmSelect Page field inside a repeater using the following code:
      $trialsPage = wire("pages")->get(28422); // Get the page $trialsPage->of(false); $newTrial = $ordersPage->trial_repeater_orders->getNewItem(); // Add item to repeater foreach ($selectedProducts as $selectedProduct){ $productPage = $pages->get("template=product, reference=$selectedProduct"); $newTrial->trial_selected_products->add($productPage); } $newTrial->save(); $trialsPage->save(); However, when I check the page where the field is located it doesn't have the new values as expected. The selected pages exist, the field is in the right location, made sure that the output formatting is turned off: $page->of(false); But it still doesn't work with a variable. No matter what I try, it doesn't work.
      It only works when I replace $selectedProduct with a hardcoded string. Am I doing something wrong here?
    • By louisstephens
      So I have been diving into hooks lately, and I am enjoying them thus far. However, I guess I am a bit stumped on how to achieve what I want too. I am trying to set up a hook that would create a new child page when the parent page is saved. However, when you save the parent page a second time, I just need to update the child page without creating multiple child pages. What would be the best way to go about this?
      So after rereading my post, I believe it is a bit vague so I will try to explain more. 
      The Goal:
      Create a page with a template "one". Once the page is created/saved => create a new child page with the template of "two" If the parent is saved anytime after, do nothing to the child page (limit the parent page to one child page) The parent page is really just being used to output content, whereas the child page is being used to pull out the some fields from the parent to be used elsewhere. I might have made this too complicated in my head.
    • By Peter Knight
      Is there a way to make JPGs progressive by default via the API?
      I've added the following to my site/config.php file but user-uploaded images are often displayed as non progressive.
      $config->imageSizerOptions = array( 'upscaling' => true, // upscale if necessary to reach target size? 'cropping' => true, // crop if necessary to reach target size? 'autoRotation' => true, // automatically correct orientation? 'interlace' => true, // use interlaced JPEGs by default? (recommended) 'sharpening' => 'soft', // sharpening: none | soft | medium | strong 'quality' => 95, // quality: 1-100 where higher is better but bigger 'hidpiQuality' => 60, // Same as above quality setting, but specific to hidpi images 'defaultGamma' => 0.5, // defaultGamma: 0.5 to 4.0 or -1 to disable gamma correction (default=2.0) ); Thanks
    • By louisstephens
      From my last post, I was given a good idea on how to count the repeater items, and it worked wonderfully. I got my code working well and the columns (based on the count) all work well as well. Now, I have a head scratcher on my hands. 
      <?php $buttonsIncluded = $page->special_custom_buttons->find('special_custom_buttons_include=1'); $buttonsIncludedCount = count($buttonsIncluded); $buttonsIncludedCountAdditional = $buttonsIncludedCount +1; echo $buttonsIncludedCount; ?> <div class="row"> <?php foreach($buttonsIncluded as $button): ?> <?php if($button->custom_buttons_include): ?> <?php if($buttonsIncludedCountAdditional == 2): ?> <div class="col-6"> <a href=""><?php echo $button->custom_buttons_text; ?></a> </div> <?php elseif($buttonsIncludedCountAdditional == 3): ?> <div class="col-4"> <a href=""><?php echo $button->custom_buttons_text; ?></a> </div> <?php elseif($buttonsIncludedCountAdditional == 4): ?> <div class="col-3"> <a href=""><?php echo $button->custom_buttons_text; ?></a> </div> <?php endif; ?> <?php endif; ?> <?php endforeach; ?> </div> All of this is included in a larger foreach statement that is pulling in other data (like body copy etc etc) from a Page Table field. As you can see in my code above, I am adding "1" to the count, so I can have space in the grid layout for a new button.
      So, right now: it looks something like: 
      [repeater button] [repeater button] [repeater button] [space for new button] What I really need to do is to pull in the button from the Page Table and add it into the new space so it looks like:
      [repeater button] [repeater button] [repeater button] [button from Page Table] Is this even possible todo, or is there a better way to go about this? 
       
      *Edit*
      So, I really just overlooked something quite easy here. Since the grid is based on 12 columns, I could just take 12 and divide by $buttonsIncludedCountAdditional which would give me the remaining col width to use outside the foreach loop. I was trying to make this too complicated.
×
×
  • Create New...