aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobosila Victor <victor.bobosila@puppet.com>2021-10-04 11:06:38 +0300
committerGitHub <noreply@github.com>2021-10-04 11:06:38 +0300
commit74e9d916d182df8a6594403582a8cc9e19dd55c0 (patch)
treec3070ac7809f3cf0ea04ce83622ae438efbd8203
parent4c72fb204bfc98e5d9dd4bff210c9be8178f1258 (diff)
parentdd42efd5323314047d2c44e02f2f7e3472954697 (diff)
downloadpuppet-cron_core-74e9d916d182df8a6594403582a8cc9e19dd55c0.tar.gz
puppet-cron_core-74e9d916d182df8a6594403582a8cc9e19dd55c0.tar.bz2
Merge pull request #44 from joshcooper/bump_json
(maint) Bump templates to 2.2.0
-rw-r--r--.devcontainer/Dockerfile6
-rw-r--r--.devcontainer/devcontainer.json23
-rw-r--r--.github/workflows/auto_release.yml84
-rw-r--r--.github/workflows/release.yml47
-rw-r--r--.gitignore1
-rw-r--r--.pdkignore5
-rw-r--r--.rubocop.yml420
-rw-r--r--.sync.yml49
-rw-r--r--Gemfile57
-rw-r--r--REFERENCE.md176
-rw-r--r--Rakefile43
-rw-r--r--lib/puppet/provider/cron/crontab.rb3
-rw-r--r--lib/puppet/provider/cron/filetype.rb16
-rw-r--r--lib/puppet/type/cron.rb30
-rw-r--r--metadata.json6
-rw-r--r--rakelib/commits.rake26
-rw-r--r--spec/acceptance/tests/resource/cron/should_fail_to_write_a_nonexistent_users_crontab_spec.rb2
-rw-r--r--spec/acceptance/tests/resource/cron/should_not_overwrite_crontab_file_on_file_read_error_spec.rb2
-rw-r--r--spec/acceptance/tests/resource/cron/should_only_fail_associated_resources_on_file_read_error_spec.rb2
-rw-r--r--spec/acceptance/tests/resource/cron/should_write_an_originally_unauthorized_users_crontab_if_puppet_authorizes_them_spec.rb2
-rw-r--r--spec/acceptance/tests/resource/cron/should_write_new_users_crontab_after_puppet_creates_them_spec.rb2
-rw-r--r--spec/lib/puppet_spec/files.rb2
-rw-r--r--spec/spec_helper.rb20
-rw-r--r--spec/unit/provider/cron/crontab_spec.rb4
-rw-r--r--spec/unit/provider/cron/parsed_spec.rb8
-rw-r--r--spec/unit/type/cron_spec.rb12
26 files changed, 802 insertions, 246 deletions
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
new file mode 100644
index 0000000..12ed4ff
--- /dev/null
+++ b/.devcontainer/Dockerfile
@@ -0,0 +1,6 @@
+FROM puppet/pdk:latest
+
+# [Optional] Uncomment this section to install additional packages.
+# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
+# && apt-get -y install --no-install-recommends <your-package-list-here>
+
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 0000000..f1a55dc
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,23 @@
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
+// https://github.com/microsoft/vscode-dev-containers/tree/v0.140.1/containers/puppet
+{
+ "name": "Puppet Development Kit (Community)",
+ "dockerFile": "Dockerfile",
+
+ // Set *default* container specific settings.json values on container create.
+ "settings": {
+ "terminal.integrated.shell.linux": "/bin/bash"
+ },
+
+ // Add the IDs of extensions you want installed when the container is created.
+ "extensions": [
+ "puppet.puppet-vscode",
+ "rebornix.Ruby"
+ ]
+
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
+ // "forwardPorts": [],
+
+ // Use 'postCreateCommand' to run commands after the container is created.
+ // "postCreateCommand": "pdk --version",
+}
diff --git a/.github/workflows/auto_release.yml b/.github/workflows/auto_release.yml
new file mode 100644
index 0000000..e028483
--- /dev/null
+++ b/.github/workflows/auto_release.yml
@@ -0,0 +1,84 @@
+name: "Auto release"
+
+on:
+ workflow_dispatch:
+
+env:
+ HONEYCOMB_WRITEKEY: 7f3c63a70eecc61d635917de46bea4e6
+ HONEYCOMB_DATASET: litmus tests
+ CHANGELOG_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+jobs:
+ auto_release:
+ name: "Automatic release prep"
+ runs-on: ubuntu-20.04
+
+ steps:
+ - name: "Honeycomb: Start recording"
+ uses: puppetlabs/kvrhdn-gha-buildevents@pdk-templates-v1
+ with:
+ apikey: ${{ env.HONEYCOMB_WRITEKEY }}
+ dataset: ${{ env.HONEYCOMB_DATASET }}
+ job-status: ${{ job.status }}
+
+ - name: "Honeycomb: start first step"
+ run: |
+ echo STEP_ID="auto-release" >> $GITHUB_ENV
+ echo STEP_START=$(date +%s) >> $GITHUB_ENV
+
+ - name: "Checkout Source"
+ if: ${{ github.repository_owner == 'puppetlabs' }}
+ uses: actions/checkout@v2
+ with:
+ fetch-depth: 0
+ persist-credentials: false
+
+ - name: "PDK Release prep"
+ uses: docker://puppet/iac_release:ci
+ with:
+ args: 'release prep --force'
+ env:
+ CHANGELOG_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: "Get Version"
+ if: ${{ github.repository_owner == 'puppetlabs' }}
+ id: gv
+ run: |
+ echo "::set-output name=ver::$(jq --raw-output .version metadata.json)"
+
+ - name: "Commit changes"
+ if: ${{ github.repository_owner == 'puppetlabs' }}
+ run: |
+ git config --local user.email "${{ github.repository_owner }}@users.noreply.github.com"
+ git config --local user.name "GitHub Action"
+ git add .
+ git commit -m "Release prep v${{ steps.gv.outputs.ver }}"
+
+ - name: Create Pull Request
+ id: cpr
+ uses: puppetlabs/peter-evans-create-pull-request@v3
+ if: ${{ github.repository_owner == 'puppetlabs' }}
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ commit-message: "Release prep v${{ steps.gv.outputs.ver }}"
+ branch: "release-prep"
+ delete-branch: true
+ title: "Release prep v${{ steps.gv.outputs.ver }}"
+ body: |
+ Automated release-prep through [pdk-templates](https://github.com/puppetlabs/pdk-templates/blob/main/moduleroot/.github/workflows/auto_release.yml.erb) from commit ${{ github.sha }}.
+ Please verify before merging:
+ - [ ] last [nightly](https://github.com/${{ github.repository }}/actions/workflows/nightly.yml) run is green
+ - [ ] [Changelog](https://github.com/${{ github.repository }}/blob/release-prep/CHANGELOG.md) is readable and has no unlabeled pull requests
+ - [ ] Ensure the [changelog](https://github.com/${{ github.repository }}/blob/release-prep/CHANGELOG.md) version and [metadata](https://github.com/${{ github.repository }}/blob/release-prep/metadata.json) version match
+ labels: "maintenance"
+
+ - name: PR outputs
+ if: ${{ github.repository_owner == 'puppetlabs' }}
+ run: |
+ echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
+ echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
+
+ - name: "Honeycomb: Record finish step"
+ if: ${{ always() }}
+ run: |
+ buildevents step $TRACE_ID $STEP_ID $STEP_START 'Finished auto release workflow'
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..1509f6e
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,47 @@
+name: "Publish module"
+
+on:
+ workflow_dispatch:
+
+jobs:
+ create-github-release:
+ name: Deploy GitHub Release
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v2
+ with:
+ ref: ${{ github.ref }}
+ clean: true
+ fetch-depth: 0
+ - name: Get Version
+ id: gv
+ run: |
+ echo "::set-output name=ver::$(jq --raw-output .version metadata.json)"
+ - name: Create Release
+ uses: actions/create-release@v1
+ id: create_release
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ tag_name: "v${{ steps.gv.outputs.ver }}"
+ draft: false
+ prerelease: false
+
+ deploy-forge:
+ name: Deploy to Forge
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v2
+ with:
+ ref: ${{ github.ref }}
+ clean: true
+ - name: "PDK Build"
+ uses: docker://puppet/pdk:nightly
+ with:
+ args: 'build'
+ - name: "Push to Forge"
+ uses: docker://puppet/pdk:nightly
+ with:
+ args: 'release publish --forge-token ${{ secrets.FORGE_API_KEY }} --force'
diff --git a/.gitignore b/.gitignore
index 2767022..988dcbb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,3 +25,4 @@
.project
.envrc
/inventory.yaml
+/spec/fixtures/litmus_inventory.yaml
diff --git a/.pdkignore b/.pdkignore
index e6215cd..c538bea 100644
--- a/.pdkignore
+++ b/.pdkignore
@@ -25,13 +25,16 @@
.project
.envrc
/inventory.yaml
+/spec/fixtures/litmus_inventory.yaml
/appveyor.yml
+/.editorconfig
/.fixtures.yml
/Gemfile
/.gitattributes
/.gitignore
/.gitlab-ci.yml
/.pdkignore
+/.puppet-lint.rc
/Rakefile
/rakelib/
/.rspec
@@ -40,3 +43,5 @@
/.yardopts
/spec/
/.vscode/
+/.sync.yml
+/.devcontainer/
diff --git a/.rubocop.yml b/.rubocop.yml
index b410b2b..82e41e8 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -1,12 +1,12 @@
---
require:
+- rubocop-performance
- rubocop-rspec
-- rubocop-i18n
AllCops:
DisplayCopNames: true
- TargetRubyVersion: '2.1'
+ TargetRubyVersion: '2.4'
Include:
- - "./**/*.rb"
+ - "**/*.rb"
Exclude:
- bin/*
- ".vendor/**/*"
@@ -18,16 +18,9 @@ AllCops:
- "**/Puppetfile"
- "**/Vagrantfile"
- "**/Guardfile"
-Metrics/LineLength:
+Layout/LineLength:
Description: People have wide screens, use them.
Max: 260
-GetText:
- Enabled: false
-GetText/DecorateString:
- Description: We don't want to decorate test output.
- Exclude:
- - spec/**/*
- Enabled: false
RSpec/BeforeAfterAll:
Description: Beware of using after(:all) as it may cause state to leak between tests.
A necessary evil in acceptance testing.
@@ -36,6 +29,9 @@ RSpec/BeforeAfterAll:
RSpec/HookArgument:
Description: Prefer explicit :each argument, matching existing module's style
EnforcedStyle: each
+RSpec/DescribeSymbol:
+ Exclude:
+ - spec/unit/facter/**/*.rb
Style/BlockDelimiters:
Description: Prefer braces for chaining. Mostly an aesthetical choice. Better to
be consistent then.
@@ -68,7 +64,7 @@ Style/TrailingCommaInArguments:
Description: Prefer always trailing comma on multiline argument lists. This makes
diffs, and re-ordering nicer.
EnforcedStyleForMultiline: comma
-Style/TrailingCommaInLiteral:
+Style/TrailingCommaInArrayLiteral:
Description: Prefer always trailing comma on multiline literals. This makes diffs,
and re-ordering nicer.
EnforcedStyleForMultiline: comma
@@ -87,26 +83,170 @@ Style/Documentation:
- spec/**/*
Style/WordArray:
EnforcedStyle: brackets
+Performance/AncestorsInclude:
+ Enabled: true
+Performance/BigDecimalWithNumericArgument:
+ Enabled: true
+Performance/BlockGivenWithExplicitBlock:
+ Enabled: true
+Performance/CaseWhenSplat:
+ Enabled: true
+Performance/ConstantRegexp:
+ Enabled: true
+Performance/MethodObjectAsBlock:
+ Enabled: true
+Performance/RedundantSortBlock:
+ Enabled: true
+Performance/RedundantStringChars:
+ Enabled: true
+Performance/ReverseFirst:
+ Enabled: true
+Performance/SortReverse:
+ Enabled: true
+Performance/Squeeze:
+ Enabled: true
+Performance/StringInclude:
+ Enabled: true
+Performance/Sum:
+ Enabled: true
Style/CollectionMethods:
Enabled: true
Style/MethodCalledOnDoEndBlock:
Enabled: true
Style/StringMethods:
Enabled: true
-GetText/DecorateFunctionMessage:
+Bundler/InsecureProtocolSource:
+ Enabled: false
+Gemspec/DuplicatedAssignment:
+ Enabled: false
+Gemspec/OrderedDependencies:
+ Enabled: false
+Gemspec/RequiredRubyVersion:
+ Enabled: false
+Gemspec/RubyVersionGlobalsUsage:
+ Enabled: false
+Layout/ArgumentAlignment:
+ Enabled: false
+Layout/BeginEndAlignment:
+ Enabled: false
+Layout/ClosingHeredocIndentation:
Enabled: false
-GetText/DecorateStringFormattingUsingInterpolation:
+Layout/EmptyComment:
Enabled: false
-GetText/DecorateStringFormattingUsingPercent:
+Layout/EmptyLineAfterGuardClause:
+ Enabled: false
+Layout/EmptyLinesAroundArguments:
+ Enabled: false
+Layout/EmptyLinesAroundAttributeAccessor:
Enabled: false
Layout/EndOfLine:
Enabled: false
-Layout/IndentHeredoc:
+Layout/FirstArgumentIndentation:
+ Enabled: false
+Layout/HashAlignment:
+ Enabled: false
+Layout/HeredocIndentation:
+ Enabled: false
+Layout/LeadingEmptyLines:
+ Enabled: false
+Layout/SpaceAroundMethodCallOperator:
+ Enabled: false
+Layout/SpaceInsideArrayLiteralBrackets:
+ Enabled: false
+Layout/SpaceInsideReferenceBrackets:
+ Enabled: false
+Lint/BigDecimalNew:
+ Enabled: false
+Lint/BooleanSymbol:
+ Enabled: false
+Lint/ConstantDefinitionInBlock:
+ Enabled: false
+Lint/DeprecatedOpenSSLConstant:
+ Enabled: false
+Lint/DisjunctiveAssignmentInConstructor:
+ Enabled: false
+Lint/DuplicateElsifCondition:
+ Enabled: false
+Lint/DuplicateRequire:
+ Enabled: false
+Lint/DuplicateRescueException:
+ Enabled: false
+Lint/EmptyConditionalBody:
+ Enabled: false
+Lint/EmptyFile:
+ Enabled: false
+Lint/ErbNewArguments:
+ Enabled: false
+Lint/FloatComparison:
+ Enabled: false
+Lint/HashCompareByIdentity:
+ Enabled: false
+Lint/IdentityComparison:
+ Enabled: false
+Lint/InterpolationCheck:
+ Enabled: false
+Lint/MissingCopEnableDirective:
+ Enabled: false
+Lint/MixedRegexpCaptureTypes:
+ Enabled: false
+Lint/NestedPercentLiteral:
+ Enabled: false
+Lint/NonDeterministicRequireOrder:
+ Enabled: false
+Lint/OrderedMagicComments:
+ Enabled: false
+Lint/OutOfRangeRegexpRef:
+ Enabled: false
+Lint/RaiseException:
+ Enabled: false
+Lint/RedundantCopEnableDirective:
+ Enabled: false
+Lint/RedundantRequireStatement:
+ Enabled: false
+Lint/RedundantSafeNavigation:
+ Enabled: false
+Lint/RedundantWithIndex:
+ Enabled: false
+Lint/RedundantWithObject:
+ Enabled: false
+Lint/RegexpAsCondition:
+ Enabled: false
+Lint/ReturnInVoidContext:
+ Enabled: false
+Lint/SafeNavigationConsistency:
+ Enabled: false
+Lint/SafeNavigationWithEmpty:
+ Enabled: false
+Lint/SelfAssignment:
+ Enabled: false
+Lint/SendWithMixinArgument:
+ Enabled: false
+Lint/ShadowedArgument:
+ Enabled: false
+Lint/StructNewOverride:
+ Enabled: false
+Lint/ToJSON:
+ Enabled: false
+Lint/TopLevelReturnWithArgument:
+ Enabled: false
+Lint/TrailingCommaInAttributeDeclaration:
+ Enabled: false
+Lint/UnreachableLoop:
+ Enabled: false
+Lint/UriEscapeUnescape:
+ Enabled: false
+Lint/UriRegexp:
+ Enabled: false
+Lint/UselessMethodDefinition:
+ Enabled: false
+Lint/UselessTimes:
Enabled: false
Metrics/AbcSize:
Enabled: false
Metrics/BlockLength:
Enabled: false
+Metrics/BlockNesting:
+ Enabled: false
Metrics/ClassLength:
Enabled: false
Metrics/CyclomaticComplexity:
@@ -119,19 +259,265 @@ Metrics/ParameterLists:
Enabled: false
Metrics/PerceivedComplexity:
Enabled: false
+Migration/DepartmentName:
+ Enabled: false
+Naming/AccessorMethodName:
+ Enabled: false
+Naming/BlockParameterName:
+ Enabled: false
+Naming/HeredocDelimiterCase:
+ Enabled: false
+Naming/HeredocDelimiterNaming:
+ Enabled: false
+Naming/MemoizedInstanceVariableName:
+ Enabled: false
+Naming/MethodParameterName:
+ Enabled: false
+Naming/RescuedExceptionsVariableName:
+ Enabled: false
+Naming/VariableNumber:
+ Enabled: false
+Performance/BindCall:
+ Enabled: false
+Performance/DeletePrefix:
+ Enabled: false
+Performance/DeleteSuffix:
+ Enabled: false
+Performance/InefficientHashSearch:
+ Enabled: false
+Performance/UnfreezeString:
+ Enabled: false
+Performance/UriDefaultParser:
+ Enabled: false
+RSpec/Be:
+ Enabled: false
+RSpec/Capybara/CurrentPathExpectation:
+ Enabled: false
+RSpec/Capybara/FeatureMethods:
+ Enabled: false
+RSpec/Capybara/VisibilityMatcher:
+ Enabled: false
+RSpec/ContextMethod:
+ Enabled: false
+RSpec/ContextWording:
+ Enabled: false
RSpec/DescribeClass:
Enabled: false
+RSpec/EmptyHook:
+ Enabled: false
+RSpec/EmptyLineAfterExample:
+ Enabled: false
+RSpec/EmptyLineAfterExampleGroup:
+ Enabled: false
+RSpec/EmptyLineAfterHook:
+ Enabled: false
RSpec/ExampleLength:
Enabled: false
-RSpec/MessageExpectation:
+RSpec/ExampleWithoutDescription:
+ Enabled: false
+RSpec/ExpectChange:
+ Enabled: false
+RSpec/ExpectInHook:
+ Enabled: false
+RSpec/FactoryBot/AttributeDefinedStatically:
+ Enabled: false
+RSpec/FactoryBot/CreateList:
+ Enabled: false
+RSpec/FactoryBot/FactoryClassName:
+ Enabled: false
+RSpec/HooksBeforeExamples:
+ Enabled: false
+RSpec/ImplicitBlockExpectation:
+ Enabled: false
+RSpec/ImplicitSubject:
+ Enabled: false
+RSpec/LeakyConstantDeclaration:
+ Enabled: false
+RSpec/LetBeforeExamples:
+ Enabled: false
+RSpec/MissingExampleGroupArgument:
Enabled: false
RSpec/MultipleExpectations:
Enabled: false
+RSpec/MultipleMemoizedHelpers:
+ Enabled: false
+RSpec/MultipleSubjects:
+ Enabled: false
RSpec/NestedGroups:
Enabled: false
+RSpec/PredicateMatcher:
+ Enabled: false
+RSpec/ReceiveCounts:
+ Enabled: false
+RSpec/ReceiveNever:
+ Enabled: false
+RSpec/RepeatedExampleGroupBody:
+ Enabled: false
+RSpec/RepeatedExampleGroupDescription:
+ Enabled: false
+RSpec/RepeatedIncludeExample:
+ Enabled: false
+RSpec/ReturnFromStub:
+ Enabled: false
+RSpec/SharedExamples:
+ Enabled: false
+RSpec/StubbedMock:
+ Enabled: false
+RSpec/UnspecifiedException:
+ Enabled: false
+RSpec/VariableDefinition:
+ Enabled: false
+RSpec/VoidExpect:
+ Enabled: false
+RSpec/Yield:
+ Enabled: false
+Security/Open:
+ Enabled: false
+Style/AccessModifierDeclarations:
+ Enabled: false
+Style/AccessorGrouping:
+ Enabled: false
Style/AsciiComments:
Enabled: false
+Style/BisectedAttrAccessor:
+ Enabled: false
+Style/CaseLikeIf:
+ Enabled: false
+Style/ClassEqualityComparison:
+ Enabled: false
+Style/ColonMethodDefinition:
+ Enabled: false
+Style/CombinableLoops:
+ Enabled: false
+Style/CommentedKeyword:
+ Enabled: false
+Style/Dir:
+ Enabled: false
+Style/DoubleCopDisableDirective:
+ Enabled: false
+Style/EmptyBlockParameter:
+ Enabled: false
+Style/EmptyLambdaParameter:
+ Enabled: false
+Style/Encoding:
+ Enabled: false
+Style/EvalWithLocation:
+ Enabled: false
+Style/ExpandPathArguments:
+ Enabled: false
+Style/ExplicitBlockArgument:
+ Enabled: false
+Style/ExponentialNotation:
+ Enabled: false
+Style/FloatDivision:
+ Enabled: false
+Style/FrozenStringLiteralComment:
+ Enabled: false
+Style/GlobalStdStream:
+ Enabled: false
+Style/HashAsLastArrayItem:
+ Enabled: false
+Style/HashLikeCase:
+ Enabled: false
+Style/HashTransformKeys:
+ Enabled: false
+Style/HashTransformValues:
+ Enabled: false
Style/IfUnlessModifier:
Enabled: false
+Style/KeywordParametersOrder:
+ Enabled: false
+Style/MinMax:
+ Enabled: false
+Style/MixinUsage:
+ Enabled: false
+Style/MultilineWhenThen:
+ Enabled: false
+Style/NegatedUnless:
+ Enabled: false
+Style/NumericPredicate:
+ Enabled: false
+Style/OptionalBooleanParameter:
+ Enabled: false
+Style/OrAssignment:
+ Enabled: false
+Style/RandomWithOffset:
+ Enabled: false
+Style/RedundantAssignment:
+ Enabled: false
+Style/RedundantCondition:
+ Enabled: false
+Style/RedundantConditional:
+ Enabled: false
+Style/RedundantFetchBlock:
+ Enabled: false
+Style/RedundantFileExtensionInRequire:
+ Enabled: false
+Style/RedundantRegexpCharacterClass:
+ Enabled: false
+Style/RedundantRegexpEscape:
+ Enabled: false
+Style/RedundantSelfAssignment:
+ Enabled: false
+Style/RedundantSort:
+ Enabled: false
+Style/RescueStandardError:
+ Enabled: false
+Style/SingleArgumentDig:
+ Enabled: false
+Style/SlicingWithRange:
+ Enabled: false
+Style/SoleNestedConditional:
+ Enabled: false
+Style/StderrPuts:
+ Enabled: false
+Style/StringConcatenation:
+ Enabled: false
+Style/Strip:
+ Enabled: false
Style/SymbolProc:
Enabled: false
+Style/TrailingBodyOnClass:
+ Enabled: false
+Style/TrailingBodyOnMethodDefinition:
+ Enabled: false
+Style/TrailingBodyOnModule:
+ Enabled: false
+Style/TrailingCommaInHashLiteral:
+ Enabled: false
+Style/TrailingMethodEndStatement:
+ Enabled: false
+Style/UnpackFirst:
+ Enabled: false
+Lint/DuplicateBranch:
+ Enabled: false
+Lint/DuplicateRegexpCharacterClassElement:
+ Enabled: false
+Lint/EmptyBlock:
+ Enabled: false
+Lint/EmptyClass:
+ Enabled: false
+Lint/NoReturnInBeginEndBlocks:
+ Enabled: false
+Lint/ToEnumArguments:
+ Enabled: false
+Lint/UnexpectedBlockArity:
+ Enabled: false
+Lint/UnmodifiedReduceAccumulator:
+ Enabled: false
+Performance/CollectionLiteralInLoop:
+ Enabled: false
+Style/ArgumentsForwarding:
+ Enabled: false
+Style/CollectionCompact:
+ Enabled: false
+Style/DocumentDynamicEvalDefinition:
+ Enabled: false
+Style/NegatedIfElseCondition:
+ Enabled: false
+Style/NilLambda:
+ Enabled: false
+Style/RedundantArgument:
+ Enabled: false
+Style/SwapValues:
+ Enabled: false
diff --git a/.sync.yml b/.sync.yml
index d1d8fe1..664fad1 100644
--- a/.sync.yml
+++ b/.sync.yml
@@ -1,27 +1,21 @@
---
.rubocop.yml:
default_configs:
- Metrics/LineLength:
+ Layout/LineLength:
Max: 260
RSpec/NamedSubject:
Enabled: false
-
+ RSpec/SubjectStub:
+ Enabled: false
Gemfile:
- required:
- ':system_tests':
- - gem: 'puppet-module-posix-system-r#{minor_version}'
- platforms: ruby
- - gem: 'puppet-module-win-system-r#{minor_version}'
- platforms:
- - mswin
- - mingw
- - x64_mingw
+ optional:
+ ":development":
- gem: beaker
- version: '~> 3.34'
+ version: '~> 4.30'
from_env: BEAKER_VERSION
- gem: beaker-abs
from_env: BEAKER_ABS_VERSION
- version: '~> 0.5'
+ version: '~> 0.9'
- gem: beaker-pe
- gem: beaker-hostgenerator
from_env: BEAKER_HOSTGENERATOR_VERSION
@@ -29,24 +23,19 @@ Gemfile:
from_env: BEAKER_RSPEC_VERSION
- gem: beaker-puppet
from_env: BEAKER_PUPPET_VERSION
- version: '~> 0.14'
- optional:
- ':development':
- - gem: 'github_changelog_generator'
- git: 'https://github.com/skywinder/github-changelog-generator'
- ref: '20ee04ba1234e9e83eb2ffb5056e23d641c7a018'
- condition: "Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.2.2')"
-
-.gitlab-ci.yml:
- delete: true
+ version: '~> 1.22'
+ - gem: github_changelog_generator
+ - gem: beaker-module_install_helper
+ - gem: beaker-puppet_install_helper
+ - gem: nokogiri
appveyor.yml:
delete: true
-
.travis.yml:
- remove_includes:
- - env: PUPPET_GEM_VERSION="~> 4.0" CHECK=parallel_spec
- rvm: 2.1.9
-
-Rakefile:
- changelog_version_tag_pattern: '%s'
+ delete: true
+.github/workflows/auto_release.yml:
+ unmanaged: false
+.github/workflows/release.yml:
+ unmanaged: false
+.gitlab-ci.yml:
+ delete: true
diff --git a/Gemfile b/Gemfile
index de6992f..26f0def 100644
--- a/Gemfile
+++ b/Gemfile
@@ -17,40 +17,27 @@ ruby_version_segments = Gem::Version.new(RUBY_VERSION.dup).segments
minor_version = ruby_version_segments[0..1].join('.')
group :development do
- gem "parallel_tests", '>= 2.14.1', '< 2.14.3', require: false
- gem "metadata-json-lint", '>= 2.0.2', '< 3.0.0', require: false
- gem "rspec-puppet-facts", '~> 1.10.0', require: false
- gem "rspec_junit_formatter", '~> 0.2', require: false
- gem "rubocop", '~> 0.49.0', require: false
- gem "rubocop-rspec", '~> 1.16.0', require: false
- gem "rubocop-i18n", '~> 1.2.0', require: false
- gem "puppetlabs_spec_helper", '>= 2.9.0', '< 3.0.0', require: false
- gem "fast_gettext", '1.1.0', require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.1.0')
- gem "fast_gettext", require: false if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.1.0')
- gem "json_pure", '<= 2.0.1', require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.0.0')
- gem "json", '= 1.8.1', require: false if Gem::Version.new(RUBY_VERSION.dup) == Gem::Version.new('2.1.9')
- gem "json", '= 2.0.4', require: false if Gem::Requirement.create('~> 2.4.2').satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
- gem "json", '= 2.1.0', require: false if Gem::Requirement.create(['>= 2.5.0', '< 2.7.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
- gem "rb-readline", '= 0.5.5', require: false, platforms: [:mswin, :mingw, :x64_mingw]
- gem "puppet-module-posix-default-r#{minor_version}", '~> 0.3', require: false, platforms: [:ruby]
- gem "puppet-module-win-default-r#{minor_version}", '~> 0.3', require: false, platforms: [:mswin, :mingw, :x64_mingw]
- gem "github_changelog_generator", require: false, git: 'https://github.com/skywinder/github-changelog-generator', ref: '20ee04ba1234e9e83eb2ffb5056e23d641c7a018' if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.2.2')
-end
-
-group :system_tests do
- gem "puppet-module-posix-system-r#{minor_version}", '~> 0.5', require: false, platforms: [:ruby]
- gem "puppet-module-win-system-r#{minor_version}", '~> 0.5', require: false, platforms: [:mswin, :mingw, :x64_mingw]
- gem "beaker", *location_for(ENV['BEAKER_VERSION'] || '~> 4')
- gem "beaker-abs", *location_for(ENV['BEAKER_ABS_VERSION'] || '~> 0.5')
+ gem "json", '= 2.0.4', require: false if Gem::Requirement.create('~> 2.4.2').satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
+ gem "json", '= 2.1.0', require: false if Gem::Requirement.create(['>= 2.5.0', '< 2.7.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
+ gem "json", '= 2.3.0', require: false if Gem::Requirement.create(['>= 2.7.0', '< 2.8.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
+ gem "puppet-module-posix-default-r#{minor_version}", '~> 1.0', require: false, platforms: [:ruby]
+ gem "puppet-module-posix-dev-r#{minor_version}", '~> 1.0', require: false, platforms: [:ruby]
+ gem "puppet-module-win-default-r#{minor_version}", '~> 1.0', require: false, platforms: [:mswin, :mingw, :x64_mingw]
+ gem "puppet-module-win-dev-r#{minor_version}", '~> 1.0', require: false, platforms: [:mswin, :mingw, :x64_mingw]
+ gem "beaker", *location_for(ENV['BEAKER_VERSION'] || '~> 4.30')
+ gem "beaker-abs", *location_for(ENV['BEAKER_ABS_VERSION'] || '~> 0.9')
gem "beaker-pe", require: false
gem "beaker-hostgenerator"
gem "beaker-rspec"
- gem "beaker-puppet", *location_for(ENV['BEAKER_PUPPET_VERSION'] || '~> 1.0')
+ gem "beaker-puppet", *location_for(ENV['BEAKER_PUPPET_VERSION'] || '~> 1.22')
+ gem "github_changelog_generator", require: false
+ gem "beaker-module_install_helper", require: false
+ gem "beaker-puppet_install_helper", require: false
+ gem "nokogiri", require: false
end
-
-group :release do
- gem "puppet-blacksmith", '~> 3.4', require: false
- gem "pdk", '~> 2.0', platforms: [:ruby]
+group :system_tests do
+ gem "puppet-module-posix-system-r#{minor_version}", '~> 1.0', require: false, platforms: [:ruby]
+ gem "puppet-module-win-system-r#{minor_version}", '~> 1.0', require: false, platforms: [:mswin, :mingw, :x64_mingw]
end
puppet_version = ENV['PUPPET_GEM_VERSION']
@@ -67,16 +54,6 @@ gems['puppet'] = location_for(puppet_version)
gems['facter'] = location_for(facter_version) if facter_version
gems['hiera'] = location_for(hiera_version) if hiera_version
-if Gem.win_platform? && puppet_version =~ %r{^(file:///|git://)}
- # If we're using a Puppet gem on Windows which handles its own win32-xxx gem
- # dependencies (>= 3.5.0), set the maximum versions (see PUP-6445).
- gems['win32-dir'] = ['<= 0.4.9', require: false]
- gems['win32-eventlog'] = ['<= 0.6.5', require: false]
- gems['win32-process'] = ['<= 0.7.5', require: false]
- gems['win32-security'] = ['<= 0.2.5', require: false]
- gems['win32-service'] = ['0.8.8', require: false]
-end
-
gems.each do |gem_name, gem_params|
gem gem_name, *gem_params
end
diff --git a/REFERENCE.md b/REFERENCE.md
index afe98bb..6b7b91f 100644
--- a/REFERENCE.md
+++ b/REFERENCE.md
@@ -1,55 +1,28 @@
# Reference
+
<!-- DO NOT EDIT: This document was generated by Puppet Strings -->
## Table of Contents
-**Resource types**
+### Resource types
-* [`cron`](#cron): Installs and manages cron jobs. Every cron resource created by Puppet requires a command and at least one periodic attribute (hour, minute, m
+* [`cron`](#cron): Installs and manages cron jobs.
## Resource types
-### cron
+### <a name="cron"></a>`cron`
-Installs and manages cron jobs. Every cron resource created by Puppet
-requires a command and at least one periodic attribute (hour, minute,
-month, monthday, weekday, or special). While the name of the cron job is
-not part of the actual job, the name is stored in a comment beginning with
-`# Puppet Name: `. These comments are used to match crontab entries created
-by Puppet with cron resources.
+Every cron resource created by Puppet requires a command and at least one
+periodic attribute (hour, minute, month, monthday, weekday, or special). While
+the name of the cron job is not part of the actual job, the name is stored in a
+comment beginning with `# Puppet Name: `. These comments are used to match
+crontab entries created by Puppet with cron resources.
If an existing crontab entry happens to match the scheduling and command of a
cron resource that has never been synced, Puppet defers to the existing
crontab entry and does not create a new entry tagged with the `# Puppet Name: `
comment.
-Example:
-
- cron { 'logrotate':
- command => '/usr/sbin/logrotate',
- user => 'root',
- hour => 2,
- minute => 0,
- }
-
-Note that all periodic attributes can be specified as an array of values:
-
- cron { 'logrotate':
- command => '/usr/sbin/logrotate',
- user => 'root',
- hour => [2, 4],
- }
-
-...or using ranges or the step syntax `*/2` (although there's no guarantee
-that your `cron` daemon supports these):
-
- cron { 'logrotate':
- command => '/usr/sbin/logrotate',
- user => 'root',
- hour => ['2-4'],
- minute => '*/10',
- }
-
**Important:** _The Cron type will not reset parameters that are
removed from a manifest_. For example, removing a `minute => 10` parameter
will not reset the minute component of the associated cronjob to `*`.
@@ -61,17 +34,46 @@ sync with manifest entries.
`user` property of a cron resource, then the cron resource will autorequire
that user.
-#### Properties
+#### Examples
-The following properties are available in the `cron` type.
+#####
-##### `ensure`
+```puppet
-Valid values: present, absent
+cron { 'logrotate':
+ command => '/usr/sbin/logrotate',
+ user => 'root',
+ hour => 2,
+ minute => 0,
+}
+```
-The basic property that the resource should be in.
+##### Note that all periodic attributes can be specified as an array of values:
+
+```puppet
+
+cron { 'logrotate':
+ command => '/usr/sbin/logrotate',
+ user => 'root',
+ hour => [2, 4],
+}
+```
-Default value: present
+##### ...or using ranges or the step syntax `*/2` (although there's no guarantee that your `cron` daemon supports these):
+
+```puppet
+
+cron { 'logrotate':
+ command => '/usr/sbin/logrotate',
+ user => 'root',
+ hour => ['2-4'],
+ minute => '*/10',
+}
+```
+
+#### Properties
+
+The following properties are available in the `cron` type.
##### `command`
@@ -84,32 +86,40 @@ user's environment is desired it should be sourced manually.
All cron parameters support `absent` as a value; this will
remove any existing values for that field.
-##### `special`
+##### `ensure`
-A special value such as 'reboot' or 'annually'.
-Only available on supported systems such as Vixie Cron.
-Overrides more specific time of day/week settings.
-Set to 'absent' to make puppet revert to a plain numeric schedule.
+Valid values: `present`, `absent`
-##### `minute`
+The basic property that the resource should be in.
-The minute at which to run the cron job.
-Optional; if specified, must be between 0 and 59, inclusive.
+Default value: `present`
+
+##### `environment`
+
+Any environment settings associated with this cron job. They
+will be stored between the header and the job in the crontab. There
+can be no guarantees that other, earlier settings will not also
+affect a given cron job.
+
+
+Also, Puppet cannot automatically determine whether an existing,
+unmanaged environment setting is associated with a given cron
+job. If you already have cron jobs with environment settings,
+then Puppet will keep those settings in the same place in the file,
+but will not associate them with a specific job.
+
+Settings should be specified exactly as they should appear in
+the crontab, like `PATH=/bin:/usr/bin:/usr/sbin`.
##### `hour`
The hour at which to run the cron job. Optional;
if specified, must be between 0 and 23, inclusive.
-##### `weekday`
-
-The weekday on which to run the command. Optional; if specified,
-must be either:
-
-- A number between 0 and 7, inclusive, with 0 or 7 being Sunday
-- The name of the day, such as 'Tuesday'.
+##### `minute`
-Day ranges can only be numeric; e.g. '1-5' for weekdays, but not 'Mon-Fri'.
+The minute at which to run the cron job.
+Optional; if specified, must be between 0 and 59, inclusive.
##### `month`
@@ -124,22 +134,24 @@ must be either:
The day of the month on which to run the
command. Optional; if specified, must be between 1 and 31.
-##### `environment`
+##### `special`
-Any environment settings associated with this cron job. They
-will be stored between the header and the job in the crontab. There
-can be no guarantees that other, earlier settings will not also
-affect a given cron job.
+A special value such as 'reboot' or 'annually'.
+Only available on supported systems such as Vixie Cron.
+Overrides more specific time of day/week settings.
+Set to 'absent' to make puppet revert to a plain numeric schedule.
+##### `target`
-Also, Puppet cannot automatically determine whether an existing,
-unmanaged environment setting is associated with a given cron
-job. If you already have cron jobs with environment settings,
-then Puppet will keep those settings in the same place in the file,
-but will not associate them with a specific job.
+The name of the crontab file in which the cron job should be stored.
-Settings should be specified exactly as they should appear in
-the crontab, like `PATH=/bin:/usr/bin:/usr/sbin`.
+This property defaults to the value of the `user` property if set, the
+user running Puppet or `root`.
+
+For the default crontab provider, this property is functionally
+equivalent to the `user` property and should be avoided. In particular,
+setting both `user` and `target` to different values will result in
+undefined behavior.
##### `user`
@@ -152,23 +164,24 @@ This property defaults to the user running Puppet or `root`.
The default crontab provider executes the system `crontab` using
the user account specified by this property.
-##### `target`
+##### `weekday`
-The name of the crontab file in which the cron job should be stored.
+The weekday on which to run the command. Optional; if specified,
+must be either:
-This property defaults to the value of the `user` property if set, the
-user running Puppet or `root`.
+- A number between 0 and 7, inclusive, with 0 or 7 being Sunday
+- The name of the day, such as 'Tuesday'.
-For the default crontab provider, this property is functionally
-equivalent to the `user` property and should be avoided. In particular,
-setting both `user` and `target` to different values will result in
-undefined behavior.
+Day ranges can only be numeric; e.g. '1-5' for weekdays, but not 'Mon-Fri'.
#### Parameters
The following parameters are available in the `cron` type.
-##### `name`
+* [`name`](#name)
+* [`provider`](#provider)
+
+##### <a name="name"></a>`name`
namevar
@@ -180,3 +193,8 @@ against specified jobs (and Puppet adds a comment to cron jobs it adds),
but it is at least possible that converting from unmanaged jobs to
managed jobs might require manual intervention.
+##### <a name="provider"></a>`provider`
+
+The specific backend to use for this `cron` resource. You will seldom need to specify this --- Puppet will usually
+discover the appropriate provider for your platform.
+
diff --git a/Rakefile b/Rakefile
index 7f91a3f..2906c15 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,3 +1,6 @@
+# frozen_string_literal: true
+
+require 'bundler'
require 'puppet_litmus/rake_tasks' if Bundler.rubygems.find_name('puppet_litmus').any?
require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-syntax/tasks/puppet-syntax'
@@ -32,7 +35,7 @@ end
def changelog_future_release
return unless Rake.application.top_level_tasks.include? "changelog"
- returnVal = "%s" % JSON.load(File.read('metadata.json'))['version']
+ returnVal = "v%s" % JSON.load(File.read('metadata.json'))['version']
raise "unable to find the future_release (version) in metadata.json" if returnVal.nil?
puts "GitHubChangelogGenerator future_release:#{returnVal}"
returnVal
@@ -50,7 +53,7 @@ if Bundler.rubygems.find_name('github_changelog_generator').any?
config.header = "# Change log\n\nAll notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org)."
config.add_pr_wo_labels = true
config.issues = false
- config.merge_prefix = "### UNCATEGORIZED PRS; GO LABEL THEM"
+ config.merge_prefix = "### UNCATEGORIZED PRS; LABEL THEM ON GITHUB"
config.configure_sections = {
"Changed" => {
"prefix" => "### Changed",
@@ -58,11 +61,11 @@ if Bundler.rubygems.find_name('github_changelog_generator').any?
},
"Added" => {
"prefix" => "### Added",
- "labels" => ["feature", "enhancement"],
+ "labels" => ["enhancement", "feature"],
},
"Fixed" => {
"prefix" => "### Fixed",
- "labels" => ["bugfix"],
+ "labels" => ["bug", "documentation", "bugfix"],
},
}
end
@@ -70,42 +73,16 @@ else
desc 'Generate a Changelog from GitHub'
task :changelog do
raise <<EOM
-The changelog tasks depends on unreleased features of the github_changelog_generator gem.
+The changelog tasks depends on recent features of the github_changelog_generator gem.
Please manually add it to your .sync.yml for now, and run `pdk update`:
---
Gemfile:
optional:
':development':
- gem: 'github_changelog_generator'
- git: 'https://github.com/skywinder/github-changelog-generator'
- ref: '20ee04ba1234e9e83eb2ffb5056e23d641c7a018'
- condition: "Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.2.2')"
+ version: '~> 1.15'
+ condition: "Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.3.0')"
EOM
end
end
-desc "verify that commit messages match CONTRIBUTING.md requirements"
-task(:commits) do
- # This rake task looks at the summary from every commit from this branch not
- # in the branch targeted for a PR.
- commit_range = 'HEAD^..HEAD'
- puts "Checking commits #{commit_range}"
- %x{git log --no-merges --pretty=%s #{commit_range}}.each_line do |commit_summary|
- # This regex tests for the currently supported commit summary tokens.
- # The exception tries to explain it in more full.
- if /^\((maint|packaging|doc|docs|modules-\d+)\)|revert/i.match(commit_summary).nil?
- raise "\n\n\n\tThis commit summary didn't match CONTRIBUTING.md guidelines:\n" \
- "\n\t\t#{commit_summary}\n" \
- "\tThe commit summary (i.e. the first line of the commit message) should start with one of:\n" \
- "\t\t(MODULES-<digits>) # this is most common and should be a ticket at tickets.puppet.com\n" \
- "\t\t(docs)\n" \
- "\t\t(docs)(DOCUMENT-<digits>)\n" \
- "\t\t(packaging)\n"
- "\t\t(maint)\n" \
- "\n\tThis test for the commit summary is case-insensitive.\n\n\n"
- else
- puts "#{commit_summary}"
- end
- puts "...passed"
- end
-end
diff --git a/lib/puppet/provider/cron/crontab.rb b/lib/puppet/provider/cron/crontab.rb
index 9144725..e07a669 100644
--- a/lib/puppet/provider/cron/crontab.rb
+++ b/lib/puppet/provider/cron/crontab.rb
@@ -32,7 +32,6 @@ Puppet::Type.type(:cron).provide(:crontab, parent: Puppet::Provider::ParsedFile,
match: %r{^\s*(@\w+|\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$},
absent: '*',
block_eval: :instance do
-
def post_parse(record)
time = record.delete(:time)
match = %r{@(\S+)}.match(time)
@@ -207,7 +206,7 @@ Puppet::Type.type(:cron).provide(:crontab, parent: Puppet::Provider::ParsedFile,
envs << record[:line]
record[:skip] = true
end
- when :blank # rubocop: disable Lint/EmptyWhen
+ when :blank
# nothing
else
if name
diff --git a/lib/puppet/provider/cron/filetype.rb b/lib/puppet/provider/cron/filetype.rb
index c381afa..455ec07 100644
--- a/lib/puppet/provider/cron/filetype.rb
+++ b/lib/puppet/provider/cron/filetype.rb
@@ -12,7 +12,7 @@ class Puppet::Provider::Cron
# autoloader meaning that, without this wrapper, the crontab filetypes
# would be re-defined, causing Puppet to raise an exception.
def newfiletype(name, &block)
- return if @filetypes && @filetypes.key?(name)
+ return if @filetypes&.key?(name)
base_newfiletype(name, &block)
end
@@ -26,7 +26,7 @@ class Puppet::Provider::Cron
# implementation in the future. This way, we can refactor all three of
# our cron file types into a common crontab file type.
newfiletype(:crontab) do
- def initialize(user)
+ def initialize(user) # rubocop:disable Lint/MissingSuper
self.path = user
end
@@ -54,11 +54,11 @@ class Puppet::Provider::Cron
rescue => detail
case detail.to_s
when %r{no crontab for}
- return ''
+ ''
when %r{are not allowed to}
Puppet.debug _('The %{path} user is not authorized to use cron. Their crontab file is treated as empty in case Puppet authorizes them in the middle of the run (by, for example, modifying the cron.deny or cron.allow files).') % { path: @path }
- return ''
+ ''
else
raise FileReadError, _('Could not read crontab for %{path}: %{detail}') % { path: @path, detail: detail }, detail.backtrace
end
@@ -117,11 +117,11 @@ class Puppet::Provider::Cron
rescue => detail
case detail.to_s
when %r{can't open your crontab}
- return ''
+ ''
when %r{you are not authorized to use cron}
Puppet.debug _('The %{path} user is not authorized to use cron. Their crontab file is treated as empty in case Puppet authorizes them in the middle of the run (by, for example, modifying the cron.deny or cron.allow files).') % { path: @path }
- return ''
+ ''
else
raise FileReadError, _('Could not read crontab for %{path}: %{detail}') % { path: @path, detail: detail }, detail.backtrace
end
@@ -168,11 +168,11 @@ class Puppet::Provider::Cron
rescue => detail
case detail.to_s
when %r{open.*in.*directory}
- return ''
+ ''
when %r{not.*authorized.*cron}
Puppet.debug _('The %{path} user is not authorized to use cron. Their crontab file is treated as empty in case Puppet authorizes them in the middle of the run (by, for example, modifying the cron.deny or cron.allow files).') % { path: @path }
- return ''
+ ''
else
raise FileReadError, _('Could not read crontab for %{path}: %{detail}') % { path: @path, detail: detail }, detail.backtrace
end
diff --git a/lib/puppet/type/cron.rb b/lib/puppet/type/cron.rb
index a536410..53bb6fd 100644
--- a/lib/puppet/type/cron.rb
+++ b/lib/puppet/type/cron.rb
@@ -4,19 +4,20 @@ require 'puppet/util/filetype'
Puppet::Type.newtype(:cron) do
@doc = <<-'EOT'
- Installs and manages cron jobs. Every cron resource created by Puppet
- requires a command and at least one periodic attribute (hour, minute,
- month, monthday, weekday, or special). While the name of the cron job is
- not part of the actual job, the name is stored in a comment beginning with
- `# Puppet Name: `. These comments are used to match crontab entries created
- by Puppet with cron resources.
+ @summary Installs and manages cron jobs.
+
+ Every cron resource created by Puppet requires a command and at least one
+ periodic attribute (hour, minute, month, monthday, weekday, or special). While
+ the name of the cron job is not part of the actual job, the name is stored in a
+ comment beginning with `# Puppet Name: `. These comments are used to match
+ crontab entries created by Puppet with cron resources.
If an existing crontab entry happens to match the scheduling and command of a
cron resource that has never been synced, Puppet defers to the existing
crontab entry and does not create a new entry tagged with the `# Puppet Name: `
comment.
- Example:
+ @example
cron { 'logrotate':
command => '/usr/sbin/logrotate',
@@ -25,7 +26,7 @@ Puppet::Type.newtype(:cron) do
minute => 0,
}
- Note that all periodic attributes can be specified as an array of values:
+ @example Note that all periodic attributes can be specified as an array of values:
cron { 'logrotate':
command => '/usr/sbin/logrotate',
@@ -33,8 +34,7 @@ Puppet::Type.newtype(:cron) do
hour => [2, 4],
}
- ...or using ranges or the step syntax `*/2` (although there's no guarantee
- that your `cron` daemon supports these):
+ @example ...or using ranges or the step syntax `*/2` (although there's no guarantee that your `cron` daemon supports these):
cron { 'logrotate':
command => '/usr/sbin/logrotate',
@@ -118,7 +118,7 @@ Puppet::Type.newtype(:cron) do
end
end
- def is_to_s(value = @is) # rubocop: disable Style/PredicateName
+ def is_to_s(value = @is) # rubocop: disable Naming/PredicateName
if value
if value.is_a?(Array) && (name == :command || value[0].is_a?(Symbol))
value = value[0]
@@ -155,17 +155,17 @@ Puppet::Type.newtype(:cron) do
end
# Allow step syntax
- if value.to_s =~ %r{^\*/[0-9]+$}
+ if %r{^\*/[0-9]+$}.match?(value.to_s)
return value
end
# Allow ranges
- if value.to_s =~ %r{^[0-9]+-[0-9]+$}
+ if %r{^[0-9]+-[0-9]+$}.match?(value.to_s)
return value
end
# Allow ranges with step
- if value.to_s =~ %r{^[0-9]+-[0-9]+/[0-9]+$}
+ if %r{^[0-9]+-[0-9]+/[0-9]+$}.match?(value.to_s)
return value
end
@@ -210,7 +210,7 @@ Puppet::Type.newtype(:cron) do
def retrieve
return_value = super
- return_value = return_value[0] if return_value && return_value.is_a?(Array)
+ return_value = return_value[0] if return_value&.is_a?(Array)
return_value
end
diff --git a/metadata.json b/metadata.json
index 47b5e59..5c6d1e3 100644
--- a/metadata.json
+++ b/metadata.json
@@ -54,7 +54,7 @@
"version_requirement": ">= 6.0.0 < 8.0.0"
}
],
- "pdk-version": "1.14.0",
- "template-url": "https://github.com/puppetlabs/pdk-templates#1.14.0",
- "template-ref": "1.14.0-0-g1bf3a4e"
+ "pdk-version": "2.2.0",
+ "template-url": "https://github.com/puppetlabs/pdk-templates#2.2.0",
+ "template-ref": "tags/2.2.0-0-g2381db6"
}
diff --git a/rakelib/commits.rake b/rakelib/commits.rake
new file mode 100644
index 0000000..42eb209
--- /dev/null
+++ b/rakelib/commits.rake
@@ -0,0 +1,26 @@
+desc "verify that commit messages match CONTRIBUTING.md requirements"
+task(:commits) do
+ # This rake task looks at the summary from every commit from this branch not
+ # in the branch targeted for a PR.
+ commit_range = 'HEAD^..HEAD'
+ puts "Checking commits #{commit_range}"
+ %x{git log --no-merges --pretty=%s #{commit_range}}.each_line do |commit_summary|
+ # This regex tests for the currently supported commit summary tokens.
+ # The exception tries to explain it in more full.
+ if /^Release prep|\((maint|packaging|doc|docs|modules-\d+)\)|revert/i.match(commit_summary).nil?
+ raise "\n\n\n\tThis commit summary didn't match CONTRIBUTING.md guidelines:\n" \
+ "\n\t\t#{commit_summary}\n" \
+ "\tThe commit summary (i.e. the first line of the commit message) should start with one of:\n" \
+ "\t\t(MODULES-<digits>) # this is most common and should be a ticket at tickets.puppet.com\n" \
+ "\t\t(docs)\n" \
+ "\t\t(docs)(DOCUMENT-<digits>)\n" \
+ "\t\t(packaging)\n"
+ "\t\t(maint)\n" \
+ "\t\tRelease prep v<tag>\n" \
+ "\n\tThis test for the commit summary is case-insensitive.\n\n\n"
+ else
+ puts "#{commit_summary}"
+ end
+ puts "...passed"
+ end
+end
diff --git a/spec/acceptance/tests/resource/cron/should_fail_to_write_a_nonexistent_users_crontab_spec.rb b/spec/acceptance/tests/resource/cron/should_fail_to_write_a_nonexistent_users_crontab_spec.rb
index 40fbbd9..167260a 100644
--- a/spec/acceptance/tests/resource/cron/should_fail_to_write_a_nonexistent_users_crontab_spec.rb
+++ b/spec/acceptance/tests/resource/cron/should_fail_to_write_a_nonexistent_users_crontab_spec.rb
@@ -12,7 +12,7 @@ RSpec.context 'when Puppet attempts to write the crontab of a nonexistent user'
end
compatible_agents.each do |agent|
- it "should fail on #{agent}" do
+ it "fails on #{agent}" do
manifest = cron_manifest('second_entry', command: 'ls', user: nonexistent_username)
apply_manifest_on(agent, manifest, expect_failures: true)
end
diff --git a/spec/acceptance/tests/resource/cron/should_not_overwrite_crontab_file_on_file_read_error_spec.rb b/spec/acceptance/tests/resource/cron/should_not_overwrite_crontab_file_on_file_read_error_spec.rb
index 6a5b2c6..60c51c9 100644
--- a/spec/acceptance/tests/resource/cron/should_not_overwrite_crontab_file_on_file_read_error_spec.rb
+++ b/spec/acceptance/tests/resource/cron/should_not_overwrite_crontab_file_on_file_read_error_spec.rb
@@ -44,7 +44,7 @@ RSpec.context 'when Puppet cannot read a crontab file' do
end
compatible_agents.each do |agent|
- it "should not overwrite it on #{agent}" do
+ it "does not overwrite it on #{agent}" do
if older_agent?(agent)
skip('Skipping this test since we are on an older agent that does not have the PUP-9217 changes')
end
diff --git a/spec/acceptance/tests/resource/cron/should_only_fail_associated_resources_on_file_read_error_spec.rb b/spec/acceptance/tests/resource/cron/should_only_fail_associated_resources_on_file_read_error_spec.rb
index 1846523..e95dc29 100644
--- a/spec/acceptance/tests/resource/cron/should_only_fail_associated_resources_on_file_read_error_spec.rb
+++ b/spec/acceptance/tests/resource/cron/should_only_fail_associated_resources_on_file_read_error_spec.rb
@@ -42,7 +42,7 @@ RSpec.context 'when Puppet cannot read a crontab file' do
end
compatible_agents.each do |agent|
- it "should only fail the associated resources on #{agent}" do
+ it "onlies fail the associated resources on #{agent}" do
if older_agent?(agent)
skip('Skipping this test since we are on an older agent that does not have the PUP-9217 changes')
end
diff --git a/spec/acceptance/tests/resource/cron/should_write_an_originally_unauthorized_users_crontab_if_puppet_authorizes_them_spec.rb b/spec/acceptance/tests/resource/cron/should_write_an_originally_unauthorized_users_crontab_if_puppet_authorizes_them_spec.rb
index 834cac7..07d5375 100644
--- a/spec/acceptance/tests/resource/cron/should_write_an_originally_unauthorized_users_crontab_if_puppet_authorizes_them_spec.rb
+++ b/spec/acceptance/tests/resource/cron/should_write_an_originally_unauthorized_users_crontab_if_puppet_authorizes_them_spec.rb
@@ -61,7 +61,7 @@ RSpec.context 'when Puppet authorizes a previously unauthorized user to use cron
compatible_agents.each do |agent|
is_aix_or_solaris_agent = agent['platform'].include?('aix') || agent['platform'].include?('solaris')
- it "should write that user's crontab on #{agent}", if: is_aix_or_solaris_agent do
+ it "writes that user's crontab on #{agent}", if: is_aix_or_solaris_agent do
step 'Add the unauthorized user to the cron.deny file' do
on(agent, "echo #{unauthorized_username} >> #{cron_deny_path[agent]}")
end
diff --git a/spec/acceptance/tests/resource/cron/should_write_new_users_crontab_after_puppet_creates_them_spec.rb b/spec/acceptance/tests/resource/cron/should_write_new_users_crontab_after_puppet_creates_them_spec.rb
index 12506ad..6fb7396 100644
--- a/spec/acceptance/tests/resource/cron/should_write_new_users_crontab_after_puppet_creates_them_spec.rb
+++ b/spec/acceptance/tests/resource/cron/should_write_new_users_crontab_after_puppet_creates_them_spec.rb
@@ -31,7 +31,7 @@ RSpec.context 'when Puppet creates a user in the middle of its run' do
end
compatible_agents.each do |agent|
- it "should be able to write their crontab on #{agent}" do
+ it "is able to write their crontab on #{agent}" do
puppet_result = nil
step "Create the new user, and the known + new user's crontab entries with Puppet" do
# Placing Cron[first_entry] before creating the new user
diff --git a/spec/lib/puppet_spec/files.rb b/spec/lib/puppet_spec/files.rb
index af0e936..7a43100 100644
--- a/spec/lib/puppet_spec/files.rb
+++ b/spec/lib/puppet_spec/files.rb
@@ -12,7 +12,7 @@ module PuppetSpec::Files
begin
allow(Dir).to receive(:entries).and_call_original
FileUtils.rm_rf path, secure: true
- rescue Errno::ENOENT # rubocop:disable Lint/HandleExceptions
+ rescue Errno::ENOENT
# nothing to do
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 29615cd..9b1fa6f 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,3 +1,9 @@
+# frozen_string_literal: true
+
+RSpec.configure do |c|
+ c.mock_with :rspec
+end
+
require 'puppetlabs_spec_helper/module_spec_helper'
require 'rspec-puppet-facts'
@@ -31,16 +37,28 @@ default_facts.each do |fact, value|
end
RSpec.configure do |c|
- c.mock_with :rspec
c.default_facts = default_facts
c.before :each do
# set to strictest setting for testing
# by default Puppet runs at warning level
Puppet.settings[:strict] = :warning
+ Puppet.settings[:strict_variables] = true
end
c.filter_run_excluding(bolt: true) unless ENV['GEM_BOLT']
c.after(:suite) do
end
+
+ # Filter backtrace noise
+ backtrace_exclusion_patterns = [
+ %r{spec_helper},
+ %r{gems},
+ ]
+
+ if c.respond_to?(:backtrace_exclusion_patterns)
+ c.backtrace_exclusion_patterns = backtrace_exclusion_patterns
+ elsif c.respond_to?(:backtrace_clean_patterns)
+ c.backtrace_clean_patterns = backtrace_exclusion_patterns
+ end
end
# Ensures that a module is defined
diff --git a/spec/unit/provider/cron/crontab_spec.rb b/spec/unit/provider/cron/crontab_spec.rb
index 6e28393..4047f82 100644
--- a/spec/unit/provider/cron/crontab_spec.rb
+++ b/spec/unit/provider/cron/crontab_spec.rb
@@ -37,11 +37,11 @@ describe Puppet::Type.type(:cron).provider(:crontab) do
samples = YAML.load(File.read(my_fixture('single_line.yaml'))) # rubocop:disable Security/YAMLLoad
samples.each do |name, data|
- it "should parse crontab line #{name} correctly" do
+ it "parses crontab line #{name} correctly" do
compare_crontab_record subject.parse_line(data[:text]), data[:record]
end
- it "should reconstruct the crontab line #{name} from the record" do
+ it "reconstructs the crontab line #{name} from the record" do
expect(subject.to_line(data[:record])).to eq(data[:text])
end
end
diff --git a/spec/unit/provider/cron/parsed_spec.rb b/spec/unit/provider/cron/parsed_spec.rb
index e4fa4cd..8e02ce6 100644
--- a/spec/unit/provider/cron/parsed_spec.rb
+++ b/spec/unit/provider/cron/parsed_spec.rb
@@ -81,7 +81,7 @@ describe Puppet::Type.type(:cron).provider(:crontab) do
# I'd use expect(ENV).to receive(:[]).with('USER') but this does not work because
# ENV["USER"] is evaluated at load time.
describe 'when determining the default target' do
- it "should use the current user #{ENV['USER']}", if: ENV['USER'] do
+ it "uses the current user #{ENV['USER']}", if: ENV['USER'] do
expect(described_class.default_target).to eq(ENV['USER'])
end
@@ -166,7 +166,7 @@ describe Puppet::Type.type(:cron).provider(:crontab) do
describe 'it should support special strings' do
['reboot', 'yearly', 'anually', 'monthly', 'weekly', 'daily', 'midnight', 'hourly'].each do |special|
- it "should support @#{special}" do
+ it "supports @#{special}" do
expect(described_class.parse_line("@#{special} /bin/true")).to eq(record_type: :crontab,
hour: :absent,
minute: :absent,
@@ -300,7 +300,7 @@ describe Puppet::Type.type(:cron).provider(:crontab) do
command: '/bin/false',
target: 'nobody',
}.each_pair do |field, new_value|
- it "should not match a record when #{field} does not match" do
+ it "does not match a record when #{field} does not match" do
record[field] = new_value
expect(described_class.match(record, resource[:name] => resource)).to be_falsey
end
@@ -317,7 +317,7 @@ describe Puppet::Type.type(:cron).provider(:crontab) do
command: '/bin/false',
target: 'root',
}.each_pair do |field, new_value|
- it "should not match a record when #{field} does not match" do
+ it "does not match a record when #{field} does not match" do
record_special[field] = new_value
expect(described_class.match(record_special, resource_special[:name] => resource_special)).to be_falsey
end
diff --git a/spec/unit/type/cron_spec.rb b/spec/unit/type/cron_spec.rb
index 78deabf..9564d16 100644
--- a/spec/unit/type/cron_spec.rb
+++ b/spec/unit/type/cron_spec.rb
@@ -21,19 +21,19 @@ describe Puppet::Type.type(:cron), unless: Puppet.features.microsoft_windows? do
describe 'when validating attributes' do
[:name, :provider].each do |param|
- it "should have a #{param} parameter" do
+ it "has a #{param} parameter" do
expect(described_class.attrtype(param)).to eq(:param)
end
end
[:command, :special, :minute, :hour, :weekday, :month, :monthday, :environment, :user, :target].each do |property|
- it "should have a #{property} property" do
+ it "has a #{property} property" do
expect(described_class.attrtype(property)).to eq(:property)
end
end
[:command, :minute, :hour, :weekday, :month, :monthday].each do |cronparam|
- it "should have #{cronparam} of type CronParam" do
+ it "has #{cronparam} of type CronParam" do
expect(described_class.attrclass(cronparam).ancestors).to include CronParam
end
end
@@ -490,7 +490,7 @@ describe Puppet::Type.type(:cron), unless: Puppet.features.microsoft_windows? do
describe 'special' do
['reboot', 'yearly', 'annually', 'monthly', 'weekly', 'daily', 'midnight', 'hourly'].each do |value|
- it "should support the value '#{value}'" do
+ it "supports the value '#{value}'" do
expect { described_class.new(name: 'foo', special: value) }.not_to raise_error
end
end
@@ -498,7 +498,7 @@ describe Puppet::Type.type(:cron), unless: Puppet.features.microsoft_windows? do
context 'when combined with numeric schedule fields' do
context "which are 'absent'" do
[['reboot', 'yearly', 'annually', 'monthly', 'weekly', 'daily', 'midnight', 'hourly'], :absent].flatten.each do |value|
- it "should accept the value '#{value}' for special" do
+ it "accepts the value '#{value}' for special" do
expect {
described_class.new(name: 'foo', minute: :absent, special: value)
}.not_to raise_error
@@ -507,7 +507,7 @@ describe Puppet::Type.type(:cron), unless: Puppet.features.microsoft_windows? do
end
context 'which are not absent' do
['reboot', 'yearly', 'annually', 'monthly', 'weekly', 'daily', 'midnight', 'hourly'].each do |value|
- it "should not accept the value '#{value}' for special" do
+ it "does not accept the value '#{value}' for special" do
expect {
described_class.new(name: 'foo', minute: '1', special: value)
}.to raise_error(Puppet::Error, %r{cannot specify both a special schedule and a value})