<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: andriy melnyk ╔╬╚╗╠ ╠╣╔╦╣╚╗╔╬╗</title>
    <description>The latest articles on DEV Community by andriy melnyk ╔╬╚╗╠ ╠╣╔╦╣╚╗╔╬╗ (@turbobasic).</description>
    <link>https://dev.to/turbobasic</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F98556%2F583ad450-0d60-457c-8405-e12d2a0687fc.png</url>
      <title>DEV Community: andriy melnyk ╔╬╚╗╠ ╠╣╔╦╣╚╗╔╬╗</title>
      <link>https://dev.to/turbobasic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/turbobasic"/>
    <language>en</language>
    <item>
      <title>Who is in space now?</title>
      <dc:creator>andriy melnyk ╔╬╚╗╠ ╠╣╔╦╣╚╗╔╬╗</dc:creator>
      <pubDate>Sun, 04 Aug 2019 09:24:44 +0000</pubDate>
      <link>https://dev.to/turbobasic/who-is-in-space-now-1gig</link>
      <guid>https://dev.to/turbobasic/who-is-in-space-now-1gig</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;--silent&lt;/span&gt; http://api.open-notify.org/astros.json | 
  jq &lt;span class="nt"&gt;--raw-output&lt;/span&gt; .people[].name

Alexey Ovchinin
Nick Hague
Christina Koch
Alexander Skvortsov
Luca Parmitano
Andrew Morgan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>rest</category>
      <category>api</category>
      <category>bash</category>
      <category>space</category>
    </item>
    <item>
      <title>Super-simple Jira API wrapper for bash/zsh</title>
      <dc:creator>andriy melnyk ╔╬╚╗╠ ╠╣╔╦╣╚╗╔╬╗</dc:creator>
      <pubDate>Fri, 02 Aug 2019 20:27:59 +0000</pubDate>
      <link>https://dev.to/turbobasic/super-simple-jira-api-wrapper-for-bash-117h</link>
      <guid>https://dev.to/turbobasic/super-simple-jira-api-wrapper-for-bash-117h</guid>
      <description>&lt;p&gt;Often I need some very simple bits of automation of Jira-related tasks without heavy external dependencies like Python version &amp;amp; packages, Groovy classes or even more exotic stuff. Scripts provided below depend only on Bash v4+ or Zsh v5+ (or even earlier versions which I didn't test).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Ups... on &lt;strong&gt;curl&lt;/strong&gt; as well. &lt;strong&gt;&lt;a href="https://stedolan.github.io/jq/"&gt;jq&lt;/a&gt;&lt;/strong&gt; is used for fancy output only)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{
    "fields": {
      "project": { "key": "BOOM" }, 
      "summary": "Foo", 
      "description": "Bar", 
      "labels": ["test"], 
      "issuetype": { "name": "Issue" } 
    }
  }'&lt;/span&gt; | jiraPost issue
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;:&lt;span class="s2"&gt;"3162226"&lt;/span&gt;, &lt;span class="s2"&gt;"key"&lt;/span&gt;:&lt;span class="s2"&gt;"BOOM-666"&lt;/span&gt;, &lt;span class="s2"&gt;"self"&lt;/span&gt;:&lt;span class="s2"&gt;"https://example.com/jira/rest/api/2/issue/3162226"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;


&lt;span class="nv"&gt;$ &lt;/span&gt;jiraGet issue/BOOM-666 | jq
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"3162226"&lt;/span&gt;,
  &lt;span class="s2"&gt;"self"&lt;/span&gt;: &lt;span class="s2"&gt;"https://example.com/jira/rest/api/2/issue/3162226"&lt;/span&gt;,
  &lt;span class="s2"&gt;"key"&lt;/span&gt;: &lt;span class="s2"&gt;"BOOM-666"&lt;/span&gt;,
  &lt;span class="s2"&gt;"fields"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Foo"&lt;/span&gt;,
    ...
&lt;span class="o"&gt;}&lt;/span&gt;


&lt;span class="nv"&gt;$ &lt;/span&gt;jiraPut issue/BOOM-666 &lt;span class="s1"&gt;'{"fields": {"summary": "Bar"}}'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Script &lt;code&gt;jira.sh&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;this should be sourced into your shell profile&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;function &lt;/span&gt;jiraApi&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;DATA_PARAM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'-'&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; PUT &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; POST &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;
    &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nv"&gt;DATA_PARAM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'@-'&lt;/span&gt;
    &lt;span class="k"&gt;fi

    if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;
    &lt;span class="k"&gt;then
        &lt;/span&gt;curl  &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JIRA&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--cert&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JIRA_CERT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--key&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JIRA_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--cacert&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JIRA_CA&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--request&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DATA_PARAM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JIRA_API&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; |
        curl  &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JIRA&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--cert&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JIRA_CERT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--key&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JIRA_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--cacert&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JIRA_CA&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--request&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DATA_PARAM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JIRA_API&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;jiraGet&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    jiraApi GET &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;jiraPost&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    jiraApi POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;jiraPut&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    jiraApi PUT &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Environment variables
&lt;/h2&gt;

&lt;p&gt;If you ask &lt;em&gt;‘What are all those JIRA_* variables?’&lt;/em&gt; — you get the point: this is where all sensitive access details are kept. Source them into your shell profile as well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;JIRA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'login:password'&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;JIRA_API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://example.com/jira/rest/api/2
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;JIRA_CERT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/full/path/to/certificate/file
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;JIRA_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/full/path/to/private/key/file
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;JIRA_CA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/full/path/to/certificate/authority/file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>List non-empty fields of Jira ticket</title>
      <dc:creator>andriy melnyk ╔╬╚╗╠ ╠╣╔╦╣╚╗╔╬╗</dc:creator>
      <pubDate>Fri, 02 Aug 2019 16:53:02 +0000</pubDate>
      <link>https://dev.to/turbobasic/list-non-empty-fields-of-jira-ticket-1i87</link>
      <guid>https://dev.to/turbobasic/list-non-empty-fields-of-jira-ticket-1i87</guid>
      <description>&lt;p&gt;Let's assume you have saved payload received using Jira REST API to file &lt;code&gt;jiraTask.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;jiraGet issue/BOOM-666 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; jiraIssue.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;You can read more about Super-simple Jira API in &lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/turbobasic" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cxCBmoLP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--_KAAb9mC--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/98556/583ad450-0d60-457c-8405-e12d2a0687fc.png" alt="turbobasic image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/turbobasic/super-simple-jira-api-wrapper-for-bash-117h" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Super-simple Jira API wrapper for bash/zsh&lt;/h2&gt;
      &lt;h3&gt;andriy melnyk ╔╬╚╗╠ ╠╣╔╦╣╚╗╔╬╗ ・ Aug  2 '19 ・ 2 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#jira&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#bash&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#zsh&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;br&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then you can list non-empty fields of the ticket using the folowing command (&lt;em&gt;make sure you have installed &lt;strong&gt;&lt;a href="https://stedolan.github.io/jq/"&gt;jq&lt;/a&gt;&lt;/strong&gt; before&lt;/em&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;jq &lt;span class="nt"&gt;--raw-output&lt;/span&gt; &lt;span class="s1"&gt;'
    .fields | 
    . as $f |
    keys[] | 
    select($f[.] != null)
'&lt;/span&gt; jiraIssue.json

...&amp;lt;87 fields listed&amp;gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my example, the command above lists &lt;strong&gt;87&lt;/strong&gt; non-empty fields of Jira ticket. Compare it with total number of fields in the ticket which is &lt;strong&gt;983&lt;/strong&gt; 😱&lt;/p&gt;

&lt;p&gt;Or, if you want to see fields with their values, use the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;jq &lt;span class="nt"&gt;--raw-output&lt;/span&gt; &lt;span class="s1"&gt;'
    .fields | 
    . as $f | [ 
        keys[] | 
        select($f[.] != null) | 
        { (.): $f[.] } 
    ] | 
    add
'&lt;/span&gt; jiraIssue.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>jira</category>
      <category>jq</category>
    </item>
  </channel>
</rss>
