GithubHelp home page GithubHelp logo

puppetlabs-ruby_task_helper's Introduction

Ruby Task Helper

A Ruby helper library for writing Puppet tasks. It provides a class that handles error generation, simplifies JSON input and output, and makes testing your task easier. It requires Bolt >= 1.1 or Puppet Enterprise >= 2019.0.

Table of Contents

  1. Description
  2. Requirements
  3. Setup
  4. Usage
  5. Debugging
  6. Testing

Description

This library handles parsing JSON input, serializing the result as JSON output, and producing a formatted error message for errors.

Requirements

This library works with Ruby 2.3 and later, though is tested using Ruby 2.4 and 2.5.

Setup

To use this library, include this module in a Puppetfile:

mod 'puppetlabs-ruby_task_helper'

Add it to your task metadata

{
  "files": ["ruby_task_helper/files/task_helper.rb"],
  "input_method": "stdin"
}

Usage

When writing your task include the library in your script, extend the TaskHelper module, and write the task() function. The task() function should accept its parameters as symbols, and should return a hash. The following is an example of a task that uses the library. All parameters will be symbolized including nested hash keys and hashes contained in arrays.

mymodule/tasks/mytask.rb

#!/usr/bin/env ruby

require_relative "../../ruby_task_helper/files/task_helper.rb"

class MyClass < TaskHelper
  def task(name: nil, **kwargs)
    {greeting: "Hi, my name is #{name}"}
  end
end

if __FILE__ == $0
  MyClass.run
end

You can then run the task like any other Bolt task:

bolt task run mymodule::task -t target.example.com name="Robert'); DROP TABLE Students;--"

You can additionally provide detailed errors by raising a TaskError, such as

class MyTask < TaskHelper
  def task(**kwargs)
    raise TaskHelper::Error.new("my task error message",
                               "mytask/error-kind",
                               "Additional details")

Debugging

When writing your task, it can be helpful to write debugging statement to locate the source of any errors. The library includes a debug method that accepts arbitrary values and logs it as a debugging statement. If the task errors, the list of debugging statements will be included in the resulting TaskError.

The list of debugging statements can also be accessed from the task itself by calling the debug_statements method. This can be used to include the debugging statements in a TaskError that you explicitly raise.

Adding a debugging statement:

debug "Result of method call: #{result}

Adding the list of debugging statements to a TaskError:

raise TaskHelper::Error.new("my task error message",
                            "mytask/error-kind",
                            "debug" => debug_statements)

Testing

By implementing the task as a method and not executing the task as a script unless it is invoked directly it becomes much easier to write rspec tests for your task. Make sure the task helper repo is checked out next to your module so the relative requires work and you can write simple unit tests for the methods of your task.

mymodule/spec/mytask_spec.rb

require_relative '../tasks/mytask.rb'

describe 'MyTask' do
  let(:params) { { name: 'Lucy' } }
  let(:task) { MyTask.new() }

  it 'runs my task' do
    expect(task.task(params)).to eq({greeting: 'Hi, my name is Lucy'})
  end
end

puppetlabs-ruby_task_helper's People

Contributors

adreyer avatar beechtom avatar donoghuc avatar lucywyman avatar nicklewis avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.