qb 0.1.10 → 0.1.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitmodules +12 -0
- data/.qb-options.yml +2 -0
- data/bin/qb +2 -0
- data/{scratch → dev/scratch}/case.rb +0 -0
- data/dev/setup.yml +4 -0
- data/exe/qb +65 -18
- data/lib/qb/version.rb +7 -1
- data/qb.gemspec +26 -1
- data/roles/nrser.blockinfile/CONTRIBUTING.md +19 -0
- data/roles/nrser.blockinfile/README.md +262 -0
- data/roles/nrser.blockinfile/library/blockinfile.py +354 -0
- data/roles/nrser.blockinfile/meta/main.yml +10 -0
- data/roles/nrser.blockinfile/tests/.gitignore +1 -0
- data/roles/nrser.blockinfile/tests/expected/test-basic/create.txt +5 -0
- data/roles/nrser.blockinfile/tests/expected/test-basic/insert.txt +6 -0
- data/roles/nrser.blockinfile/tests/expected/test-basic/marker.txt +5 -0
- data/roles/nrser.blockinfile/tests/expected/test-basic/remove.txt +2 -0
- data/roles/nrser.blockinfile/tests/expected/test-basic/update.txt +6 -0
- data/roles/nrser.blockinfile/tests/expected/test-block/block.txt +4 -0
- data/roles/nrser.blockinfile/tests/expected/test-block/content.txt +4 -0
- data/roles/nrser.blockinfile/tests/expected/test-follow/link0.txt +6 -0
- data/roles/nrser.blockinfile/tests/expected/test-follow/link1.txt +6 -0
- data/roles/nrser.blockinfile/tests/expected/test-follow/link2.txt +1 -0
- data/roles/nrser.blockinfile/tests/expected/test-follow/real0.txt +2 -0
- data/roles/nrser.blockinfile/tests/expected/test-follow/real1.txt +2 -0
- data/roles/nrser.blockinfile/tests/expected/test-follow/real2.txt +6 -0
- data/roles/nrser.blockinfile/tests/expected/test-insertab/insertafter.txt +8 -0
- data/roles/nrser.blockinfile/tests/expected/test-insertab/insertbefore.txt +8 -0
- data/roles/nrser.blockinfile/tests/expected/test-insertab/insertbof.txt +8 -0
- data/roles/nrser.blockinfile/tests/expected/test-insertab/inserteof.txt +8 -0
- data/roles/nrser.blockinfile/tests/expected/test-insertab/insertunmatched.txt +8 -0
- data/roles/nrser.blockinfile/tests/expected/test-insertab/updateafter.txt +8 -0
- data/roles/nrser.blockinfile/tests/expected/test-insertab/updatebefore.txt +8 -0
- data/roles/nrser.blockinfile/tests/expected/test-multiline/insert.txt +11 -0
- data/roles/nrser.blockinfile/tests/expected/test-multiline/remove.txt +2 -0
- data/roles/nrser.blockinfile/tests/expected/test-multiline/update.txt +12 -0
- data/roles/nrser.blockinfile/tests/expected/test-replace/index.html +6 -0
- data/roles/nrser.blockinfile/tests/expected/test-state/insert-present.txt +5 -0
- data/roles/nrser.blockinfile/tests/expected/test-state/insert.txt +5 -0
- data/roles/nrser.blockinfile/tests/expected/test-state/remove-absent.txt +2 -0
- data/roles/nrser.blockinfile/tests/expected/test-state/remove-present.txt +2 -0
- data/roles/nrser.blockinfile/tests/expected/test-state/remove.txt +2 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-basic/insert.txt +2 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-basic/marker.txt +1 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-basic/remove.txt +6 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-basic/update.txt +6 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-block/block.txt +1 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-block/content.txt +1 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-follow/link0.txt +1 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-follow/link1.txt +1 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-follow/link2.txt +1 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-follow/real0.txt +2 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-follow/real1.txt +2 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-follow/real2.txt +2 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-insertab/insertafter.txt +4 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-insertab/insertbefore.txt +4 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-insertab/insertbof.txt +4 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-insertab/inserteof.txt +4 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-insertab/insertunmatched.txt +4 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-insertab/updateafter.txt +8 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-insertab/updatebefore.txt +8 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-multiline/insert.txt +2 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-multiline/remove.txt +11 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-multiline/update.txt +12 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-replace/index.html +1 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-state/insert-present.txt +2 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-state/insert.txt +2 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-state/remove-absent.txt +6 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-state/remove-present.txt +6 -0
- data/roles/nrser.blockinfile/tests/fixtures/test-state/remove.txt +6 -0
- data/roles/nrser.blockinfile/tests/hosts +1 -0
- data/roles/nrser.blockinfile/tests/roles/yaegashi.blockinfile +1 -0
- data/roles/nrser.blockinfile/tests/run.sh +64 -0
- data/roles/nrser.blockinfile/tests/test-basic.yml +31 -0
- data/roles/nrser.blockinfile/tests/test-block.yml +16 -0
- data/roles/nrser.blockinfile/tests/test-follow.yml +21 -0
- data/roles/nrser.blockinfile/tests/test-insertab.yml +34 -0
- data/roles/nrser.blockinfile/tests/test-multiline.yml +51 -0
- data/roles/nrser.blockinfile/tests/test-replace.yml +21 -0
- data/roles/nrser.blockinfile/tests/test-state.yml +32 -0
- data/roles/nrser.rb/.gitignore +31 -0
- data/roles/nrser.rb/library/sync.rb +52 -0
- data/roles/nrser.rb/library/vars.rb +63 -0
- data/roles/{qb.meteor_react_component → nrser.rb}/meta/main.yml +1 -1
- data/roles/nrser.rbenv_gem/README.md +38 -0
- data/roles/nrser.rbenv_gem/VERSION +1 -0
- data/roles/nrser.rbenv_gem/defaults/main.yml +5 -0
- data/roles/nrser.rbenv_gem/handlers/main.yml +2 -0
- data/roles/nrser.rbenv_gem/meta/main.yml +9 -0
- data/roles/nrser.rbenv_gem/tasks/clone-repo.yml +24 -0
- data/roles/nrser.rbenv_gem/tasks/main.yml +46 -0
- data/roles/nrser.rbenv_gem/tasks/manage-source.yml +48 -0
- data/roles/nrser.rbenv_gem/tasks/manage-version.yml +45 -0
- data/roles/nrser.rbenv_gem/vars/main.yml +2 -0
- data/roles/qb.build_gem/tasks/main.yml +2 -1
- data/roles/qb.gitignore/defaults/main.yml +1 -1
- data/roles/qb.gitignore/files/gitignore/.github/PULL_REQUEST_TEMPLATE.md +11 -0
- data/roles/qb.gitignore/files/gitignore/Actionscript.gitignore +11 -0
- data/roles/qb.gitignore/files/gitignore/Ada.gitignore +5 -0
- data/roles/qb.gitignore/files/gitignore/Agda.gitignore +1 -0
- data/roles/qb.gitignore/files/gitignore/Android.gitignore +39 -0
- data/roles/qb.gitignore/files/gitignore/AppEngine.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/AppceleratorTitanium.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/ArchLinuxPackages.gitignore +13 -0
- data/roles/qb.gitignore/files/gitignore/Autotools.gitignore +18 -0
- data/roles/qb.gitignore/files/gitignore/C++.gitignore +28 -0
- data/roles/qb.gitignore/files/gitignore/C.gitignore +32 -0
- data/roles/qb.gitignore/files/gitignore/CFWheels.gitignore +12 -0
- data/roles/qb.gitignore/files/gitignore/CMake.gitignore +6 -0
- data/roles/qb.gitignore/files/gitignore/CONTRIBUTING.md +34 -0
- data/roles/qb.gitignore/files/gitignore/CUDA.gitignore +6 -0
- data/roles/qb.gitignore/files/gitignore/CakePHP.gitignore +25 -0
- data/roles/qb.gitignore/files/gitignore/ChefCookbook.gitignore +9 -0
- data/roles/qb.gitignore/files/gitignore/Clojure.gitignore +1 -0
- data/roles/qb.gitignore/files/gitignore/CodeIgniter.gitignore +6 -0
- data/roles/qb.gitignore/files/gitignore/CommonLisp.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/Composer.gitignore +6 -0
- data/roles/qb.gitignore/files/gitignore/Concrete5.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/Coq.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/CraftCMS.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/D.gitignore +20 -0
- data/roles/qb.gitignore/files/gitignore/DM.gitignore +5 -0
- data/roles/qb.gitignore/files/gitignore/Dart.gitignore +27 -0
- data/roles/qb.gitignore/files/gitignore/Delphi.gitignore +66 -0
- data/roles/qb.gitignore/files/gitignore/Drupal.gitignore +36 -0
- data/roles/qb.gitignore/files/gitignore/EPiServer.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/Eagle.gitignore +44 -0
- data/roles/qb.gitignore/files/gitignore/Elisp.gitignore +5 -0
- data/roles/qb.gitignore/files/gitignore/Elixir.gitignore +5 -0
- data/roles/qb.gitignore/files/gitignore/Elm.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/Erlang.gitignore +10 -0
- data/roles/qb.gitignore/files/gitignore/ExpressionEngine.gitignore +19 -0
- data/roles/qb.gitignore/files/gitignore/ExtJs.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/Fancy.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Finale.gitignore +13 -0
- data/roles/qb.gitignore/files/gitignore/ForceDotCom.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/Fortran.gitignore +1 -0
- data/roles/qb.gitignore/files/gitignore/FuelPHP.gitignore +21 -0
- data/roles/qb.gitignore/files/gitignore/GWT.gitignore +28 -0
- data/roles/qb.gitignore/files/gitignore/Gcov.gitignore +5 -0
- data/roles/qb.gitignore/files/gitignore/Gem.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/GitBook.gitignore +16 -0
- data/roles/qb.gitignore/files/gitignore/Global/Anjuta.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/Global/Archives.gitignore +27 -0
- data/roles/qb.gitignore/files/gitignore/Global/BricxCC.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/Global/CVS.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/Global/Calabash.gitignore +10 -0
- data/roles/qb.gitignore/files/gitignore/Global/Cloud9.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/Global/CodeKit.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/Global/DartEditor.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Global/Dreamweaver.gitignore +7 -0
- data/roles/qb.gitignore/files/gitignore/Global/Dropbox.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/Global/Eclipse.gitignore +51 -0
- data/roles/qb.gitignore/files/gitignore/Global/EiffelStudio.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Global/Emacs.gitignore +41 -0
- data/roles/qb.gitignore/files/gitignore/Global/Ensime.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/Global/Espresso.gitignore +1 -0
- data/roles/qb.gitignore/files/gitignore/Global/FlexBuilder.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/Global/GPG.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Global/IPythonNotebook.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Global/JDeveloper.gitignore +13 -0
- data/roles/qb.gitignore/files/gitignore/Global/JetBrains.gitignore +44 -0
- data/roles/qb.gitignore/files/gitignore/Global/KDevelop4.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Global/Kate.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/Global/Lazarus.gitignore +30 -0
- data/roles/qb.gitignore/files/gitignore/Global/LibreOffice.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Global/Linux.gitignore +10 -0
- data/roles/qb.gitignore/files/gitignore/Global/LyX.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/Global/Matlab.gitignore +19 -0
- data/roles/qb.gitignore/files/gitignore/Global/Mercurial.gitignore +6 -0
- data/roles/qb.gitignore/files/gitignore/Global/MicrosoftOffice.gitignore +13 -0
- data/roles/qb.gitignore/files/gitignore/Global/ModelSim.gitignore +23 -0
- data/roles/qb.gitignore/files/gitignore/Global/Momentics.gitignore +8 -0
- data/roles/qb.gitignore/files/gitignore/Global/MonoDevelop.gitignore +8 -0
- data/roles/qb.gitignore/files/gitignore/Global/NetBeans.gitignore +7 -0
- data/roles/qb.gitignore/files/gitignore/Global/Ninja.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Global/NotepadPP.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Global/OSX.gitignore +24 -0
- data/roles/qb.gitignore/files/gitignore/Global/Otto.gitignore +1 -0
- data/roles/qb.gitignore/files/gitignore/Global/README.md +10 -0
- data/roles/qb.gitignore/files/gitignore/Global/Redcar.gitignore +1 -0
- data/roles/qb.gitignore/files/gitignore/Global/Redis.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/Global/SBT.gitignore +9 -0
- data/roles/qb.gitignore/files/gitignore/Global/SVN.gitignore +1 -0
- data/roles/qb.gitignore/files/gitignore/Global/SlickEdit.gitignore +11 -0
- data/roles/qb.gitignore/files/gitignore/Global/SublimeText.gitignore +14 -0
- data/roles/qb.gitignore/files/gitignore/Global/SynopsysVCS.gitignore +36 -0
- data/roles/qb.gitignore/files/gitignore/Global/Tags.gitignore +16 -0
- data/roles/qb.gitignore/files/gitignore/Global/TextMate.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/Global/TortoiseGit.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Global/Vagrant.gitignore +1 -0
- data/roles/qb.gitignore/files/gitignore/Global/Vim.gitignore +10 -0
- data/roles/qb.gitignore/files/gitignore/Global/VirtualEnv.gitignore +12 -0
- data/roles/qb.gitignore/files/gitignore/Global/VisualStudioCode.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Global/WebMethods.gitignore +14 -0
- data/roles/qb.gitignore/files/gitignore/Global/Windows.gitignore +18 -0
- data/roles/qb.gitignore/files/gitignore/Global/Xcode.gitignore +23 -0
- data/roles/qb.gitignore/files/gitignore/Global/XilinxISE.gitignore +67 -0
- data/roles/qb.gitignore/files/gitignore/Go.gitignore +24 -0
- data/roles/qb.gitignore/files/gitignore/Gradle.gitignore +14 -0
- data/roles/qb.gitignore/files/gitignore/Grails.gitignore +33 -0
- data/roles/qb.gitignore/files/gitignore/Haskell.gitignore +17 -0
- data/roles/qb.gitignore/files/gitignore/IGORPro.gitignore +5 -0
- data/roles/qb.gitignore/files/gitignore/Idris.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Java.gitignore +12 -0
- data/roles/qb.gitignore/files/gitignore/Jboss.gitignore +19 -0
- data/roles/qb.gitignore/files/gitignore/Jekyll.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/Joomla.gitignore +546 -0
- data/roles/qb.gitignore/files/gitignore/KiCad.gitignore +20 -0
- data/roles/qb.gitignore/files/gitignore/Kohana.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/LICENSE +19 -0
- data/roles/qb.gitignore/files/gitignore/LabVIEW.gitignore +16 -0
- data/roles/qb.gitignore/files/gitignore/Laravel.gitignore +16 -0
- data/roles/qb.gitignore/files/gitignore/Leiningen.gitignore +12 -0
- data/roles/qb.gitignore/files/gitignore/LemonStand.gitignore +21 -0
- data/roles/qb.gitignore/files/gitignore/Lilypond.gitignore +6 -0
- data/roles/qb.gitignore/files/gitignore/Lithium.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Lua.gitignore +41 -0
- data/roles/qb.gitignore/files/gitignore/Magento.gitignore +104 -0
- data/roles/qb.gitignore/files/gitignore/Maven.gitignore +9 -0
- data/roles/qb.gitignore/files/gitignore/Mercury.gitignore +13 -0
- data/roles/qb.gitignore/files/gitignore/MetaProgrammingSystem.gitignore +16 -0
- data/roles/qb.gitignore/files/gitignore/Nanoc.gitignore +10 -0
- data/roles/qb.gitignore/files/gitignore/Nim.gitignore +1 -0
- data/roles/qb.gitignore/files/gitignore/Node.gitignore +34 -0
- data/roles/qb.gitignore/files/gitignore/OCaml.gitignore +20 -0
- data/roles/qb.gitignore/files/gitignore/Objective-C.gitignore +51 -0
- data/roles/qb.gitignore/files/gitignore/Opa.gitignore +13 -0
- data/roles/qb.gitignore/files/gitignore/OpenCart.gitignore +13 -0
- data/roles/qb.gitignore/files/gitignore/OracleForms.gitignore +8 -0
- data/roles/qb.gitignore/files/gitignore/Packer.gitignore +5 -0
- data/roles/qb.gitignore/files/gitignore/Perl.gitignore +20 -0
- data/roles/qb.gitignore/files/gitignore/Phalcon.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/PlayFramework.gitignore +15 -0
- data/roles/qb.gitignore/files/gitignore/Plone.gitignore +18 -0
- data/roles/qb.gitignore/files/gitignore/Prestashop.gitignore +32 -0
- data/roles/qb.gitignore/files/gitignore/Processing.gitignore +7 -0
- data/roles/qb.gitignore/files/gitignore/Python.gitignore +85 -0
- data/roles/qb.gitignore/files/gitignore/Qooxdoo.gitignore +5 -0
- data/roles/qb.gitignore/files/gitignore/Qt.gitignore +38 -0
- data/roles/qb.gitignore/files/gitignore/R.gitignore +25 -0
- data/roles/qb.gitignore/files/gitignore/README.md +79 -0
- data/roles/qb.gitignore/files/gitignore/ROS.gitignore +47 -0
- data/roles/qb.gitignore/files/gitignore/Rails.gitignore +38 -0
- data/roles/qb.gitignore/files/gitignore/RhodesRhomobile.gitignore +9 -0
- data/roles/qb.gitignore/files/gitignore/Ruby.gitignore +47 -0
- data/roles/qb.gitignore/files/gitignore/Rust.gitignore +15 -0
- data/roles/qb.gitignore/files/gitignore/SCons.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Sass.gitignore +2 -0
- data/roles/qb.gitignore/files/gitignore/Scala.gitignore +17 -0
- data/roles/qb.gitignore/files/gitignore/Scheme.gitignore +7 -0
- data/roles/qb.gitignore/files/gitignore/Scrivener.gitignore +7 -0
- data/roles/qb.gitignore/files/gitignore/Sdcc.gitignore +8 -0
- data/roles/qb.gitignore/files/gitignore/SeamGen.gitignore +26 -0
- data/roles/qb.gitignore/files/gitignore/SketchUp.gitignore +1 -0
- data/roles/qb.gitignore/files/gitignore/Smalltalk.gitignore +18 -0
- data/roles/qb.gitignore/files/gitignore/Stella.gitignore +12 -0
- data/roles/qb.gitignore/files/gitignore/SugarCRM.gitignore +25 -0
- data/roles/qb.gitignore/files/gitignore/Swift.gitignore +63 -0
- data/roles/qb.gitignore/files/gitignore/Symfony.gitignore +43 -0
- data/roles/qb.gitignore/files/gitignore/SymphonyCMS.gitignore +6 -0
- data/roles/qb.gitignore/files/gitignore/TeX.gitignore +177 -0
- data/roles/qb.gitignore/files/gitignore/Terraform.gitignore +3 -0
- data/roles/qb.gitignore/files/gitignore/Textpattern.gitignore +11 -0
- data/roles/qb.gitignore/files/gitignore/TurboGears2.gitignore +20 -0
- data/roles/qb.gitignore/files/gitignore/Typo3.gitignore +20 -0
- data/roles/qb.gitignore/files/gitignore/Umbraco.gitignore +19 -0
- data/roles/qb.gitignore/files/gitignore/Unity.gitignore +30 -0
- data/roles/qb.gitignore/files/gitignore/UnrealEngine.gitignore +59 -0
- data/roles/qb.gitignore/files/gitignore/VVVV.gitignore +6 -0
- data/roles/qb.gitignore/files/gitignore/VisualStudio.gitignore +245 -0
- data/roles/qb.gitignore/files/gitignore/Waf.gitignore +4 -0
- data/roles/qb.gitignore/files/gitignore/WordPress.gitignore +18 -0
- data/roles/qb.gitignore/files/gitignore/Xojo.gitignore +11 -0
- data/roles/qb.gitignore/files/gitignore/Yeoman.gitignore +6 -0
- data/roles/qb.gitignore/files/gitignore/Yii.gitignore +6 -0
- data/roles/qb.gitignore/files/gitignore/ZendFramework.gitignore +25 -0
- data/roles/qb.gitignore/files/gitignore/Zephir.gitignore +26 -0
- data/roles/qb.gitignore/meta/qb +28 -0
- data/roles/qb.gitignore/tasks/main.yml +4 -15
- data/roles/qb.install_gem/meta/qb.yml +4 -0
- data/roles/qb.project/defaults/main.yml +3 -2
- data/roles/qb.project/files/ansible.cfg +3 -1
- data/roles/qb.project/meta/main.yml +1 -0
- data/roles/qb.project/meta/qb.yml +10 -2
- data/roles/qb.project/tasks/dev.yml +36 -0
- data/roles/qb.project/tasks/main.yml +9 -29
- data/roles/qb.project/tasks/setup.yml +24 -23
- data/roles/qb.project/templates/bootstrap.yml.j2 +20 -0
- data/roles/qb.project/templates/setup.yml.j2 +3 -1
- data/roles/qb.release_gem/defaults/main.yml +2 -0
- data/roles/qb.release_gem/meta/main.yml +7 -0
- data/roles/qb.release_gem/meta/qb.yml +21 -0
- data/roles/qb.release_gem/tasks/main.yml +84 -0
- metadata +280 -15
- data/requirements.yml +0 -7
- data/roles/qb.gitignore/.qb-options.yml +0 -3
- data/roles/qb.gitignore/meta/qb.yml +0 -8
- data/roles/qb.gitignore/vars/main.yml +0 -3
- data/roles/qb.meteor_react_component/defaults/main.yml +0 -8
- data/roles/qb.meteor_react_component/meta/qb.yml +0 -68
- data/roles/qb.meteor_react_component/tasks/main.yml +0 -44
- data/roles/qb.meteor_react_component/templates/component.jsx.j2 +0 -75
- data/roles/qb.meteor_react_component/templates/style.import.less.j2 +0 -4
- data/roles/qb.project/files/requirements.yml +0 -12
@@ -0,0 +1,354 @@
|
|
1
|
+
#!/usr/bin/python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
# (c) 2014, 2015 YAEGASHI Takeshi <yaegashi@debian.org>
|
5
|
+
#
|
6
|
+
# This file is part of Ansible
|
7
|
+
#
|
8
|
+
# Ansible is free software: you can redistribute it and/or modify
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
10
|
+
# the Free Software Foundation, either version 3 of the License, or
|
11
|
+
# (at your option) any later version.
|
12
|
+
#
|
13
|
+
# Ansible is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
+
# GNU General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU General Public License
|
19
|
+
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
20
|
+
|
21
|
+
import re
|
22
|
+
import os
|
23
|
+
import tempfile
|
24
|
+
|
25
|
+
from itertools import chain
|
26
|
+
|
27
|
+
import pprint
|
28
|
+
|
29
|
+
DOCUMENTATION = """
|
30
|
+
---
|
31
|
+
module: blockinfile
|
32
|
+
author:
|
33
|
+
- 'YAEGASHI Takeshi (@yaegashi)'
|
34
|
+
extends_documentation_fragment:
|
35
|
+
- files
|
36
|
+
- validate
|
37
|
+
short_description: Insert/update/remove a text block
|
38
|
+
surrounded by marker lines.
|
39
|
+
version_added: '2.0'
|
40
|
+
description:
|
41
|
+
- This module will insert/update/remove a block of multi-line text
|
42
|
+
surrounded by customizable marker lines.
|
43
|
+
notes:
|
44
|
+
- This module supports check mode.
|
45
|
+
options:
|
46
|
+
dest:
|
47
|
+
aliases: [ name, destfile ]
|
48
|
+
required: true
|
49
|
+
description:
|
50
|
+
- The file to modify.
|
51
|
+
state:
|
52
|
+
required: false
|
53
|
+
choices: [ present, absent ]
|
54
|
+
default: present
|
55
|
+
description:
|
56
|
+
- Whether the block should be there or not.
|
57
|
+
marker:
|
58
|
+
required: false
|
59
|
+
default: '# {mark} ANSIBLE MANAGED BLOCK'
|
60
|
+
description:
|
61
|
+
- The marker line template.
|
62
|
+
"{mark}" will be replaced with "BEGIN" or "END".
|
63
|
+
block:
|
64
|
+
aliases: [ content ]
|
65
|
+
required: false
|
66
|
+
default: ''
|
67
|
+
description:
|
68
|
+
- The text to insert inside the marker lines.
|
69
|
+
If it's missing or an empty string,
|
70
|
+
the block will be removed as if C(state) were specified to C(absent).
|
71
|
+
insertafter:
|
72
|
+
required: false
|
73
|
+
default: EOF
|
74
|
+
description:
|
75
|
+
- If specified, the block will be inserted after the last match of
|
76
|
+
specified regular expression. A special value is available; C(EOF) for
|
77
|
+
inserting the block at the end of the file. If specified regular
|
78
|
+
expresion has no matches, C(EOF) will be used instead.
|
79
|
+
choices: [ 'EOF', '*regex*' ]
|
80
|
+
insertbefore:
|
81
|
+
required: false
|
82
|
+
default: None
|
83
|
+
description:
|
84
|
+
- If specified, the block will be inserted before the last match of
|
85
|
+
specified regular expression. A special value is available; C(BOF) for
|
86
|
+
inserting the block at the beginning of the file. If specified regular
|
87
|
+
expresion has no matches, the block will be inserted at the end of the
|
88
|
+
file.
|
89
|
+
choices: [ 'BOF', '*regex*' ]
|
90
|
+
create:
|
91
|
+
required: false
|
92
|
+
default: 'no'
|
93
|
+
choices: [ 'yes', 'no' ]
|
94
|
+
description:
|
95
|
+
- Create a new file if it doesn't exist.
|
96
|
+
backup:
|
97
|
+
required: false
|
98
|
+
default: 'no'
|
99
|
+
choices: [ 'yes', 'no' ]
|
100
|
+
description:
|
101
|
+
- Create a backup file including the timestamp information so you can
|
102
|
+
get the original file back if you somehow clobbered it incorrectly.
|
103
|
+
"""
|
104
|
+
|
105
|
+
EXAMPLES = r"""
|
106
|
+
- name: insert/update "Match User" configuation block in /etc/ssh/sshd_config
|
107
|
+
blockinfile:
|
108
|
+
dest: /etc/ssh/sshd_config
|
109
|
+
block: |
|
110
|
+
Match User ansible-agent
|
111
|
+
PasswordAuthentication no
|
112
|
+
|
113
|
+
- name: insert/update eth0 configuration stanza in /etc/network/interfaces
|
114
|
+
(it might be better to copy files into /etc/network/interfaces.d/)
|
115
|
+
blockinfile:
|
116
|
+
dest: /etc/network/interfaces
|
117
|
+
block: |
|
118
|
+
iface eth0 inet static
|
119
|
+
address 192.168.0.1
|
120
|
+
netmask 255.255.255.0
|
121
|
+
|
122
|
+
- name: insert/update HTML surrounded by custom markers after <body> line
|
123
|
+
blockinfile:
|
124
|
+
dest: /var/www/html/index.html
|
125
|
+
marker: "<!-- {mark} ANSIBLE MANAGED BLOCK -->"
|
126
|
+
insertafter: "<body>"
|
127
|
+
content: |
|
128
|
+
<h1>Welcome to {{ansible_hostname}}</h1>
|
129
|
+
<p>Last updated on {{ansible_date_time.iso8601}}</p>
|
130
|
+
|
131
|
+
- name: remove HTML as well as surrounding markers
|
132
|
+
blockinfile:
|
133
|
+
dest: /var/www/html/index.html
|
134
|
+
marker: "<!-- {mark} ANSIBLE MANAGED BLOCK -->"
|
135
|
+
content: ""
|
136
|
+
"""
|
137
|
+
|
138
|
+
|
139
|
+
def write_changes(module, contents, dest):
|
140
|
+
|
141
|
+
tmpfd, tmpfile = tempfile.mkstemp()
|
142
|
+
f = os.fdopen(tmpfd, 'wb')
|
143
|
+
f.write(contents)
|
144
|
+
f.close()
|
145
|
+
|
146
|
+
validate = module.params.get('validate', None)
|
147
|
+
valid = not validate
|
148
|
+
if validate:
|
149
|
+
if "%s" not in validate:
|
150
|
+
module.fail_json(msg="validate must contain %%s: %s" % (validate))
|
151
|
+
(rc, out, err) = module.run_command(validate % tmpfile)
|
152
|
+
valid = rc == 0
|
153
|
+
if rc != 0:
|
154
|
+
module.fail_json(msg='failed to validate: '
|
155
|
+
'rc:%s error:%s' % (rc, err))
|
156
|
+
if valid:
|
157
|
+
module.atomic_move(tmpfile, dest)
|
158
|
+
|
159
|
+
|
160
|
+
def check_file_attrs(module, changed, message):
|
161
|
+
|
162
|
+
file_args = module.load_file_common_arguments(module.params)
|
163
|
+
if module.set_file_attributes_if_different(file_args, False):
|
164
|
+
|
165
|
+
if changed:
|
166
|
+
message += " and "
|
167
|
+
changed = True
|
168
|
+
message += "ownership, perms or SE linux context changed"
|
169
|
+
|
170
|
+
return message, changed
|
171
|
+
|
172
|
+
|
173
|
+
def startswith_lines(marker, lines, index):
|
174
|
+
for i in range(0, len(marker)):
|
175
|
+
if lines[i] == marker[0 + index]:
|
176
|
+
pass
|
177
|
+
else:
|
178
|
+
return False
|
179
|
+
return True
|
180
|
+
|
181
|
+
|
182
|
+
def main():
|
183
|
+
module = AnsibleModule(
|
184
|
+
argument_spec=dict(
|
185
|
+
dest=dict(required=True, aliases=['name', 'destfile']),
|
186
|
+
state=dict(default='present', choices=['absent', 'present']),
|
187
|
+
marker=dict(default='# {mark} ANSIBLE MANAGED BLOCK', type='str'),
|
188
|
+
block=dict(default='', type='str', aliases=['content']),
|
189
|
+
insertafter=dict(default=None),
|
190
|
+
insertbefore=dict(default=None),
|
191
|
+
create=dict(default=False, type='bool'),
|
192
|
+
backup=dict(default=False, type='bool'),
|
193
|
+
validate=dict(default=None, type='str'),
|
194
|
+
beginmarker=dict(default=None, type='str'),
|
195
|
+
endmarker=dict(default=None, type='str'),
|
196
|
+
),
|
197
|
+
mutually_exclusive=[['insertbefore', 'insertafter']],
|
198
|
+
add_file_common_args=True,
|
199
|
+
supports_check_mode=True
|
200
|
+
)
|
201
|
+
|
202
|
+
params = module.params
|
203
|
+
dest = os.path.expanduser(params['dest'])
|
204
|
+
if module.boolean(params.get('follow', None)):
|
205
|
+
dest = os.path.realpath(dest)
|
206
|
+
|
207
|
+
if os.path.isdir(dest):
|
208
|
+
module.fail_json(rc=256,
|
209
|
+
msg='Destination %s is a directory !' % dest)
|
210
|
+
|
211
|
+
if not os.path.exists(dest):
|
212
|
+
if not module.boolean(params['create']):
|
213
|
+
module.fail_json(rc=257,
|
214
|
+
msg='Destination %s does not exist !' % dest)
|
215
|
+
original = ''
|
216
|
+
lines = []
|
217
|
+
else:
|
218
|
+
f = open(dest, 'rb')
|
219
|
+
original = f.read()
|
220
|
+
f.close()
|
221
|
+
lines = original.splitlines()
|
222
|
+
|
223
|
+
insertbefore = params['insertbefore']
|
224
|
+
insertafter = params['insertafter']
|
225
|
+
block = params['block']
|
226
|
+
marker = params['marker']
|
227
|
+
present = params['state'] == 'present'
|
228
|
+
|
229
|
+
if insertbefore is None and insertafter is None:
|
230
|
+
insertafter = 'EOF'
|
231
|
+
|
232
|
+
if insertafter not in (None, 'EOF'):
|
233
|
+
insertre = re.compile(insertafter)
|
234
|
+
elif insertbefore not in (None, 'BOF'):
|
235
|
+
insertre = re.compile(insertbefore)
|
236
|
+
else:
|
237
|
+
insertre = None
|
238
|
+
|
239
|
+
if params['beginmarker']:
|
240
|
+
marker0 = params['beginmarker']
|
241
|
+
else:
|
242
|
+
marker0 = re.sub(r'{mark}', 'BEGIN', marker)
|
243
|
+
|
244
|
+
if params['endmarker']:
|
245
|
+
marker1 = params['endmarker']
|
246
|
+
else:
|
247
|
+
marker1 = re.sub(r'{mark}', 'END', marker)
|
248
|
+
|
249
|
+
if present and block:
|
250
|
+
# Escape seqeuences like '\n' need to be handled in Ansible 1.x
|
251
|
+
if module.ansible_version.startswith('1.'):
|
252
|
+
block = re.sub('', block, '')
|
253
|
+
marker0 = re.sub('', marker0, '')
|
254
|
+
marker1 = re.sub('', marker1, '')
|
255
|
+
else:
|
256
|
+
# blocklines = []
|
257
|
+
pass
|
258
|
+
|
259
|
+
# make sure each chunk ends with a newline if it doens't already
|
260
|
+
if block != '' and not block.endswith("\n"):
|
261
|
+
block = block + "\n"
|
262
|
+
|
263
|
+
if not marker0.endswith("\n"):
|
264
|
+
marker0 = marker0 + "\n"
|
265
|
+
|
266
|
+
if not marker1.endswith("\n"):
|
267
|
+
marker1 = marker1 + "\n"
|
268
|
+
|
269
|
+
replacement = marker0 + block + marker1
|
270
|
+
|
271
|
+
# module.fail_json(msg=pprint.pformat(replacement))
|
272
|
+
|
273
|
+
exact_re = re.compile(
|
274
|
+
(re.escape(marker0) + re.escape(block) + re.escape(marker1)),
|
275
|
+
(re.MULTILINE | re.DOTALL)
|
276
|
+
)
|
277
|
+
|
278
|
+
# this regex will match if the markers are present but the contents is
|
279
|
+
# different
|
280
|
+
different_re = re.compile(
|
281
|
+
"%s.*%s" % (re.escape(marker0), re.escape(marker1)),
|
282
|
+
(re.MULTILINE | re.DOTALL)
|
283
|
+
)
|
284
|
+
|
285
|
+
result = original
|
286
|
+
|
287
|
+
# there are four cases:
|
288
|
+
#
|
289
|
+
# 1. removal - this is it's own case because the markers are
|
290
|
+
# removed along with the content.
|
291
|
+
#
|
292
|
+
if not present or block == '':
|
293
|
+
result = different_re.sub('', original)
|
294
|
+
|
295
|
+
# 2. no-op - the exact text is already present
|
296
|
+
elif exact_re.search(original):
|
297
|
+
pass
|
298
|
+
|
299
|
+
# 3. replace - the markers are present but the content is different
|
300
|
+
elif different_re.search(original):
|
301
|
+
result = different_re.sub(replacement, original)
|
302
|
+
|
303
|
+
# 4. insert - the markers
|
304
|
+
else:
|
305
|
+
lines = original.splitlines()
|
306
|
+
blocklines = replacement.splitlines()
|
307
|
+
|
308
|
+
n0 = None
|
309
|
+
if insertre is not None:
|
310
|
+
for i, line in enumerate(lines):
|
311
|
+
if insertre.search(line):
|
312
|
+
n0 = i
|
313
|
+
if n0 is None:
|
314
|
+
n0 = len(lines)
|
315
|
+
elif insertafter is not None:
|
316
|
+
n0 += 1
|
317
|
+
elif insertbefore is not None:
|
318
|
+
n0 = 0 # insertbefore=BOF
|
319
|
+
else:
|
320
|
+
n0 = len(lines) # insertafter=EOF
|
321
|
+
|
322
|
+
lines[n0:n0] = blocklines
|
323
|
+
|
324
|
+
if lines:
|
325
|
+
result = '\n'.join(lines)+'\n'
|
326
|
+
else:
|
327
|
+
result = ''
|
328
|
+
|
329
|
+
if original == result:
|
330
|
+
msg = ''
|
331
|
+
changed = False
|
332
|
+
elif original == '':
|
333
|
+
msg = 'File created'
|
334
|
+
changed = True
|
335
|
+
elif not block:
|
336
|
+
msg = 'Block removed'
|
337
|
+
changed = True
|
338
|
+
else:
|
339
|
+
msg = 'Block inserted'
|
340
|
+
changed = True
|
341
|
+
|
342
|
+
if changed and not module.check_mode:
|
343
|
+
if module.boolean(params['backup']) and os.path.exists(dest):
|
344
|
+
module.backup_local(dest)
|
345
|
+
write_changes(module, result, dest)
|
346
|
+
|
347
|
+
msg, changed = check_file_attrs(module, changed, msg)
|
348
|
+
module.exit_json(changed=changed, msg=msg)
|
349
|
+
|
350
|
+
# import module snippets
|
351
|
+
from ansible.module_utils.basic import *
|
352
|
+
from ansible.module_utils.splitter import *
|
353
|
+
if __name__ == '__main__':
|
354
|
+
main()
|
@@ -0,0 +1 @@
|
|
1
|
+
/testing
|
@@ -0,0 +1 @@
|
|
1
|
+
real2.txt
|