puppet 0.24.6 → 0.24.7
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/CHANGELOG +115 -0
- data/Rakefile +43 -14
- data/bin/puppetca +6 -5
- data/bin/puppetdoc +109 -15
- data/bin/ralsh +3 -1
- data/conf/redhat/puppet.spec +74 -48
- data/examples/mcx_dock_absent.pp +4 -0
- data/examples/mcx_dock_default.pp +118 -0
- data/examples/mcx_dock_full.pp +125 -0
- data/examples/mcx_dock_invalid.pp +9 -0
- data/examples/mcx_nogroup.pp +118 -0
- data/examples/mcx_notexists_absent.pp +4 -0
- data/ext/emacs/puppet-mode.el +1 -1
- data/lib/puppet.rb +1 -1
- data/lib/puppet/external/nagios/base.rb +114 -71
- data/lib/puppet/feature/base.rb +6 -0
- data/lib/puppet/indirector/yaml.rb +12 -3
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/network/client/master.rb +1 -1
- data/lib/puppet/network/xmlrpc/client.rb +3 -1
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/ast.rb +15 -0
- data/lib/puppet/parser/ast/astarray.rb +1 -2
- data/lib/puppet/parser/ast/casestatement.rb +2 -0
- data/lib/puppet/parser/ast/collection.rb +2 -0
- data/lib/puppet/parser/ast/comparison_operator.rb +4 -0
- data/lib/puppet/parser/ast/definition.rb +2 -0
- data/lib/puppet/parser/ast/else.rb +3 -0
- data/lib/puppet/parser/ast/function.rb +19 -12
- data/lib/puppet/parser/ast/hostclass.rb +9 -1
- data/lib/puppet/parser/ast/ifstatement.rb +3 -0
- data/lib/puppet/parser/ast/node.rb +3 -0
- data/lib/puppet/parser/ast/resource.rb +3 -0
- data/lib/puppet/parser/ast/resource_defaults.rb +2 -0
- data/lib/puppet/parser/ast/resource_override.rb +3 -0
- data/lib/puppet/parser/ast/vardef.rb +3 -0
- data/lib/puppet/parser/functions.rb +14 -0
- data/lib/puppet/parser/functions/inline_template.rb +21 -0
- data/lib/puppet/parser/functions/template.rb +3 -2
- data/lib/puppet/parser/lexer.rb +56 -7
- data/lib/puppet/parser/parser.rb +114 -98
- data/lib/puppet/parser/parser_support.rb +24 -4
- data/lib/puppet/parser/resource/reference.rb +4 -3
- data/lib/puppet/parser/templatewrapper.rb +30 -22
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/property/list.rb +7 -2
- data/lib/puppet/property/ordered_list.rb +22 -0
- data/lib/puppet/provider/augeas/augeas.rb +189 -0
- data/lib/puppet/provider/computer/computer.rb +22 -0
- data/lib/puppet/provider/confine.rb +4 -1
- data/lib/puppet/provider/confine/variable.rb +13 -2
- data/lib/puppet/provider/confine_collection.rb +4 -1
- data/lib/puppet/provider/confiner.rb +1 -1
- data/lib/puppet/provider/group/directoryservice.rb +6 -3
- data/lib/puppet/provider/group/groupadd.rb +5 -2
- data/lib/puppet/provider/group/ldap.rb +11 -9
- data/lib/puppet/provider/group/netinfo.rb +8 -4
- data/lib/puppet/provider/group/pw.rb +5 -1
- data/lib/puppet/provider/host/netinfo.rb +5 -2
- data/lib/puppet/provider/macauthorization/macauthorization.rb +315 -0
- data/lib/puppet/provider/mcx/mcxcontent.rb +201 -0
- data/lib/puppet/provider/nameservice/directoryservice.rb +210 -107
- data/lib/puppet/provider/nameservice/netinfo.rb +7 -2
- data/lib/puppet/provider/package/appdmg.rb +0 -3
- data/lib/puppet/provider/package/apt.rb +6 -0
- data/lib/puppet/provider/package/rpm.rb +2 -0
- data/lib/puppet/provider/package/yum.rb +5 -1
- data/lib/puppet/provider/package/yumhelper.py +9 -0
- data/lib/puppet/provider/service/base.rb +9 -6
- data/lib/puppet/provider/service/daemontools.rb +25 -15
- data/lib/puppet/provider/service/debian.rb +6 -2
- data/lib/puppet/provider/service/freebsd.rb +5 -2
- data/lib/puppet/provider/service/gentoo.rb +6 -3
- data/lib/puppet/provider/service/init.rb +31 -21
- data/lib/puppet/provider/service/launchd.rb +195 -0
- data/lib/puppet/provider/service/redhat.rb +5 -2
- data/lib/puppet/provider/service/runit.rb +30 -20
- data/lib/puppet/provider/service/smf.rb +7 -4
- data/lib/puppet/provider/ssh_authorized_key/parsed.rb +21 -1
- data/lib/puppet/provider/user/directoryservice.rb +1 -0
- data/lib/puppet/provider/user/netinfo.rb +9 -3
- data/lib/puppet/provider/user/user_role_add.rb +43 -6
- data/lib/puppet/provider/zfs/solaris.rb +45 -0
- data/lib/puppet/provider/zone/solaris.rb +8 -4
- data/lib/puppet/provider/zpool/solaris.rb +116 -0
- data/lib/puppet/rails/database/003_add_environment_to_host.rb +9 -0
- data/lib/puppet/rails/database/schema.rb +1 -0
- data/lib/puppet/rails/host.rb +4 -0
- data/lib/puppet/reference/configuration.rb +1 -1
- data/lib/puppet/reports/tagmail.rb +15 -6
- data/lib/puppet/transaction/change.rb +3 -5
- data/lib/puppet/transportable.rb +1 -0
- data/lib/puppet/type/augeas.rb +155 -0
- data/lib/puppet/type/computer.rb +62 -0
- data/lib/puppet/type/exec.rb +2 -1
- data/lib/puppet/type/file.rb +1 -1
- data/lib/puppet/type/file/ensure.rb +8 -5
- data/lib/puppet/type/file/mode.rb +0 -14
- data/lib/puppet/type/file/owner.rb +32 -64
- data/lib/puppet/type/file/selcontext.rb +3 -8
- data/lib/puppet/type/group.rb +27 -45
- data/lib/puppet/type/k5login.rb +1 -1
- data/lib/puppet/type/macauthorization.rb +141 -0
- data/lib/puppet/type/mcx.rb +115 -0
- data/lib/puppet/type/mount.rb +1 -1
- data/lib/puppet/type/nagios_hostdependency.rb +3 -0
- data/lib/puppet/type/ssh_authorized_key.rb +16 -0
- data/lib/puppet/type/tidy.rb +43 -14
- data/lib/puppet/type/user.rb +25 -1
- data/lib/puppet/type/zfs.rb +51 -0
- data/lib/puppet/type/zone.rb +8 -0
- data/lib/puppet/type/zpool.rb +93 -0
- data/lib/puppet/util.rb +17 -38
- data/lib/puppet/util/file_locking.rb +44 -0
- data/lib/puppet/util/filetype.rb +3 -3
- data/lib/puppet/util/log.rb +1 -16
- data/lib/puppet/util/metric.rb +0 -5
- data/lib/puppet/util/rdoc.rb +85 -0
- data/lib/puppet/util/rdoc/code_objects.rb +219 -0
- data/lib/puppet/util/rdoc/generators/puppet_generator.rb +829 -0
- data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +1051 -0
- data/lib/puppet/util/rdoc/parser.rb +437 -0
- data/lib/puppet/util/selinux.rb +135 -63
- data/lib/puppet/util/settings.rb +136 -126
- data/lib/puppet/util/storage.rb +4 -2
- data/spec/Rakefile +91 -0
- data/spec/integration/checksum.rb +47 -0
- data/spec/integration/defaults.rb +47 -0
- data/spec/integration/file_serving/configuration.rb +43 -0
- data/spec/integration/file_serving/content.rb +18 -0
- data/spec/integration/file_serving/metadata.rb +18 -0
- data/spec/integration/indirector/direct_file_server.rb +80 -0
- data/spec/integration/indirector/file_content/file_server.rb +18 -0
- data/spec/integration/indirector/file_metadata/file_server.rb +18 -0
- data/spec/integration/indirector/module_files.rb +57 -0
- data/spec/integration/indirector/node/ldap.rb +15 -0
- data/spec/integration/indirector/rest.rb +464 -0
- data/spec/integration/network/server/mongrel.rb +48 -0
- data/spec/integration/network/server/webrick.rb +48 -0
- data/spec/integration/node.rb +93 -0
- data/spec/integration/node/catalog.rb +54 -0
- data/spec/integration/node/facts.rb +45 -0
- data/spec/integration/provider/package.rb +26 -0
- data/spec/integration/provider/service/init.rb +32 -0
- data/spec/integration/reference/providers.rb +17 -0
- data/spec/integration/reports.rb +14 -0
- data/spec/integration/transaction/report.rb +26 -0
- data/spec/integration/type/package.rb +22 -0
- data/spec/integration/util/file_locking.rb +36 -0
- data/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb +46 -0
- data/spec/monkey_patches/alias_should_to_must.rb +5 -0
- data/spec/shared_behaviours/file_server_terminus.rb +42 -0
- data/spec/shared_behaviours/file_serving.rb +64 -0
- data/spec/shared_behaviours/memory_terminus.rb +32 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/unit/executables/client/certhandler.rb +122 -0
- data/spec/unit/file_serving/configuration.rb +224 -0
- data/spec/unit/file_serving/configuration/parser.rb +135 -0
- data/spec/unit/file_serving/content.rb +71 -0
- data/spec/unit/file_serving/file_base.rb +124 -0
- data/spec/unit/file_serving/fileset.rb +239 -0
- data/spec/unit/file_serving/indirection_hooks.rb +124 -0
- data/spec/unit/file_serving/metadata.rb +187 -0
- data/spec/unit/file_serving/mount.rb +143 -0
- data/spec/unit/file_serving/terminus_helper.rb +76 -0
- data/spec/unit/indirector.rb +152 -0
- data/spec/unit/indirector/catalog/compiler.rb +156 -0
- data/spec/unit/indirector/catalog/yaml.rb +25 -0
- data/spec/unit/indirector/checksum/file.rb +139 -0
- data/spec/unit/indirector/code.rb +33 -0
- data/spec/unit/indirector/direct_file_server.rb +89 -0
- data/spec/unit/indirector/envelope.rb +47 -0
- data/spec/unit/indirector/exec.rb +51 -0
- data/spec/unit/indirector/facts/facter.rb +76 -0
- data/spec/unit/indirector/facts/yaml.rb +26 -0
- data/spec/unit/indirector/file.rb +154 -0
- data/spec/unit/indirector/file_content/file.rb +18 -0
- data/spec/unit/indirector/file_content/file_server.rb +18 -0
- data/spec/unit/indirector/file_content/modules.rb +18 -0
- data/spec/unit/indirector/file_content/rest.rb +11 -0
- data/spec/unit/indirector/file_metadata/file.rb +52 -0
- data/spec/unit/indirector/file_metadata/file_server.rb +18 -0
- data/spec/unit/indirector/file_metadata/modules.rb +42 -0
- data/spec/unit/indirector/file_metadata/rest.rb +9 -0
- data/spec/unit/indirector/file_server.rb +184 -0
- data/spec/unit/indirector/indirection.rb +731 -0
- data/spec/unit/indirector/ldap.rb +143 -0
- data/spec/unit/indirector/memory.rb +29 -0
- data/spec/unit/indirector/module_files.rb +259 -0
- data/spec/unit/indirector/node/exec.rb +69 -0
- data/spec/unit/indirector/node/ldap.rb +424 -0
- data/spec/unit/indirector/node/memory.rb +19 -0
- data/spec/unit/indirector/node/plain.rb +19 -0
- data/spec/unit/indirector/node/rest.rb +13 -0
- data/spec/unit/indirector/node/yaml.rb +25 -0
- data/spec/unit/indirector/plain.rb +29 -0
- data/spec/unit/indirector/report/processor.rb +81 -0
- data/spec/unit/indirector/request.rb +87 -0
- data/spec/unit/indirector/rest.rb +372 -0
- data/spec/unit/indirector/ssl_rsa/file.rb +116 -0
- data/spec/unit/indirector/terminus.rb +245 -0
- data/spec/unit/indirector/yaml.rb +145 -0
- data/spec/unit/module.rb +247 -0
- data/spec/unit/network/client.rb +45 -0
- data/spec/unit/network/client/master.rb +442 -0
- data/spec/unit/network/handler/fileserver.rb +179 -0
- data/spec/unit/network/http.rb +35 -0
- data/spec/unit/network/http/mongrel.rb +117 -0
- data/spec/unit/network/http/mongrel/rest.rb +377 -0
- data/spec/unit/network/http/mongrel/xmlrpc.rb +0 -0
- data/spec/unit/network/http/webrick.rb +127 -0
- data/spec/unit/network/http/webrick/rest.rb +323 -0
- data/spec/unit/network/http/webrick/xmlrpc.rb +0 -0
- data/spec/unit/network/http_pool.rb +238 -0
- data/spec/unit/network/server.rb +316 -0
- data/spec/unit/network/xmlrpc/client.rb +13 -0
- data/spec/unit/node.rb +167 -0
- data/spec/unit/node/catalog.rb +864 -0
- data/spec/unit/node/environment.rb +37 -0
- data/spec/unit/node/facts.rb +44 -0
- data/spec/unit/other/checksum.rb +92 -0
- data/spec/unit/other/pgraph.rb +210 -0
- data/spec/unit/other/transaction.rb +33 -0
- data/spec/unit/other/transbucket.rb +172 -0
- data/spec/unit/other/transobject.rb +92 -0
- data/spec/unit/parameter.rb +24 -0
- data/spec/unit/parser/ast.rb +37 -0
- data/spec/unit/parser/ast/arithmetic_operator.rb +73 -0
- data/spec/unit/parser/ast/astarray.rb +66 -0
- data/spec/unit/parser/ast/boolean_operator.rb +53 -0
- data/spec/unit/parser/ast/collexpr.rb +92 -0
- data/spec/unit/parser/ast/comparison_operator.rb +92 -0
- data/spec/unit/parser/ast/definition.rb +195 -0
- data/spec/unit/parser/ast/function.rb +77 -0
- data/spec/unit/parser/ast/hostclass.rb +148 -0
- data/spec/unit/parser/ast/minus.rb +36 -0
- data/spec/unit/parser/ast/node.rb +125 -0
- data/spec/unit/parser/ast/nop.rb +20 -0
- data/spec/unit/parser/ast/not.rb +30 -0
- data/spec/unit/parser/ast/resource_override.rb +51 -0
- data/spec/unit/parser/ast/resource_reference.rb +63 -0
- data/spec/unit/parser/ast/vardef.rb +47 -0
- data/spec/unit/parser/collector.rb +426 -0
- data/spec/unit/parser/compiler.rb +561 -0
- data/spec/unit/parser/functions.rb +83 -0
- data/spec/unit/parser/functions/inline_template.rb +59 -0
- data/spec/unit/parser/functions/template.rb +62 -0
- data/spec/unit/parser/interpreter.rb +138 -0
- data/spec/unit/parser/lexer.rb +646 -0
- data/spec/unit/parser/parser.rb +228 -0
- data/spec/unit/parser/resource.rb +336 -0
- data/spec/unit/parser/resource/reference.rb +95 -0
- data/spec/unit/parser/scope.rb +87 -0
- data/spec/unit/parser/templatewrapper.rb +129 -0
- data/spec/unit/property.rb +35 -0
- data/spec/unit/property/keyvalue.rb +168 -0
- data/spec/unit/property/list.rb +156 -0
- data/spec/unit/property/ordered_list.rb +64 -0
- data/spec/unit/provider/augeas/augeas.rb +238 -0
- data/spec/unit/provider/confine.rb +78 -0
- data/spec/unit/provider/confine/exists.rb +81 -0
- data/spec/unit/provider/confine/false.rb +53 -0
- data/spec/unit/provider/confine/feature.rb +60 -0
- data/spec/unit/provider/confine/true.rb +53 -0
- data/spec/unit/provider/confine/variable.rb +107 -0
- data/spec/unit/provider/confine_collection.rb +134 -0
- data/spec/unit/provider/confiner.rb +63 -0
- data/spec/unit/provider/group/groupadd.rb +31 -0
- data/spec/unit/provider/group/ldap.rb +105 -0
- data/spec/unit/provider/ldap.rb +248 -0
- data/spec/unit/provider/macauthorization.rb +147 -0
- data/spec/unit/provider/mcx/mcxcontent.rb +175 -0
- data/spec/unit/provider/mount.rb +130 -0
- data/spec/unit/provider/mount/parsed.rb +185 -0
- data/spec/unit/provider/package/apt.rb +138 -0
- data/spec/unit/provider/package/dpkg.rb +163 -0
- data/spec/unit/provider/package/gem.rb +87 -0
- data/spec/unit/provider/package/hpux.rb +52 -0
- data/spec/unit/provider/selboolean.rb +37 -0
- data/spec/unit/provider/selmodule-example.pp +0 -0
- data/spec/unit/provider/selmodule.rb +66 -0
- data/spec/unit/provider/service/daemontools.rb +124 -0
- data/spec/unit/provider/service/launchd.rb +134 -0
- data/spec/unit/provider/service/runit.rb +117 -0
- data/spec/unit/provider/ssh_authorized_key/parsed.rb +102 -0
- data/spec/unit/provider/user/hpux.rb +25 -0
- data/spec/unit/provider/user/ldap.rb +279 -0
- data/spec/unit/provider/user/user_role_add.rb +249 -0
- data/spec/unit/provider/user/useradd.rb +115 -0
- data/spec/unit/provider/zfs/solaris.rb +87 -0
- data/spec/unit/provider/zone/solaris.rb +42 -0
- data/spec/unit/provider/zpool/solaris.rb +179 -0
- data/spec/unit/rails.rb +125 -0
- data/spec/unit/relationship.rb +149 -0
- data/spec/unit/reports.rb +61 -0
- data/spec/unit/resource_reference.rb +73 -0
- data/spec/unit/simple_graph.rb +280 -0
- data/spec/unit/transaction/change.rb +187 -0
- data/spec/unit/transaction/event.rb +25 -0
- data/spec/unit/transaction/report.rb +40 -0
- data/spec/unit/type.rb +64 -0
- data/spec/unit/type/augeas.rb +113 -0
- data/spec/unit/type/computer.rb +82 -0
- data/spec/unit/type/exec.rb +91 -0
- data/spec/unit/type/file.rb +155 -0
- data/spec/unit/type/file/ensure.rb +21 -0
- data/spec/unit/type/file/group.rb +118 -0
- data/spec/unit/type/file/owner.rb +132 -0
- data/spec/unit/type/file/selinux.rb +82 -0
- data/spec/unit/type/group.rb +40 -0
- data/spec/unit/type/macauthorization.rb +78 -0
- data/spec/unit/type/mcx.rb +108 -0
- data/spec/unit/type/mount.rb +219 -0
- data/spec/unit/type/nagios.rb +63 -0
- data/spec/unit/type/noop_metaparam.rb +38 -0
- data/spec/unit/type/package.rb +246 -0
- data/spec/unit/type/resources.rb +27 -0
- data/spec/unit/type/schedule.rb +339 -0
- data/spec/unit/type/selboolean.rb +47 -0
- data/spec/unit/type/selmodule.rb +18 -0
- data/spec/unit/type/service.rb +254 -0
- data/spec/unit/type/ssh_authorized_key.rb +106 -0
- data/spec/unit/type/tidy.rb +68 -0
- data/spec/unit/type/user.rb +260 -0
- data/spec/unit/type/zfs.rb +45 -0
- data/spec/unit/type/zone.rb +20 -0
- data/spec/unit/type/zpool.rb +110 -0
- data/spec/unit/util/checksums.rb +99 -0
- data/spec/unit/util/constant_inflector.rb +70 -0
- data/spec/unit/util/file_locking.rb +115 -0
- data/spec/unit/util/ldap/connection.rb +169 -0
- data/spec/unit/util/ldap/generator.rb +54 -0
- data/spec/unit/util/ldap/manager.rb +654 -0
- data/spec/unit/util/loadedfile.rb +65 -0
- data/spec/unit/util/log.rb +107 -0
- data/spec/unit/util/metric.rb +95 -0
- data/spec/unit/util/nagios_maker.rb +128 -0
- data/spec/unit/util/posix.rb +256 -0
- data/spec/unit/util/resource_template.rb +58 -0
- data/spec/unit/util/selinux.rb +219 -0
- data/spec/unit/util/settings.rb +847 -0
- data/spec/unit/util/storage.rb +248 -0
- data/spec/unit/util/tagging.rb +92 -0
- data/spec/unit/util/uri_helper.rb +41 -0
- data/spec/unit/util/user_attr.rb +47 -0
- data/spec/unit/util/warnings.rb +35 -0
- data/test/certmgr/support.rb +0 -6
- data/test/data/providers/ssh_authorized_key/parsed/authorized_keys +1 -0
- data/test/data/snippets/multilinecomments.pp +6 -0
- data/test/data/snippets/multipleclass.pp +9 -0
- data/test/language/functions.rb +11 -1
- data/test/language/snippets.rb +16 -0
- data/test/lib/puppettest/runnable_test.rb +1 -1
- data/test/network/handler/fileserver.rb +5 -0
- data/test/other/report.rb +0 -4
- data/test/ral/type/resources.rb +2 -19
- data/test/util/settings.rb +4 -4
- data/test/util/storage.rb +0 -24
- data/test/util/utiltest.rb +0 -33
- metadata +319 -26
- data/conf/debian/README.source +0 -2
- data/conf/debian/TODO.Debian +0 -1
- data/conf/debian/changelog +0 -257
- data/conf/debian/compat +0 -1
- data/conf/debian/control +0 -45
- data/conf/debian/copyright +0 -17
- data/conf/debian/docs +0 -1
- data/conf/debian/fileserver.conf +0 -12
- data/conf/debian/puppet.NEWS +0 -63
- data/conf/debian/puppet.conf +0 -8
- data/conf/debian/puppet.dirs +0 -7
- data/conf/debian/puppet.files +0 -6
- data/conf/debian/puppet.init +0 -64
- data/conf/debian/puppet.logrotate +0 -11
- data/conf/debian/puppet.postinst +0 -9
- data/conf/debian/puppet.postrm +0 -21
- data/conf/debian/puppet.preinst +0 -25
- data/conf/debian/puppetmaster.files +0 -4
- data/conf/debian/puppetmaster.init +0 -58
- data/conf/debian/rules +0 -115
- data/conf/debian/watch +0 -2
- data/lib/puppet/type/nagios_hostgroupescalation.rb +0 -3
@@ -0,0 +1,83 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
4
|
+
|
5
|
+
describe Puppet::Parser::Functions do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
end
|
9
|
+
|
10
|
+
after(:each) do
|
11
|
+
# Rationale:
|
12
|
+
# our various tests will almost all register to Pupet::Parser::Functions
|
13
|
+
# a new function called "name". All tests are required to stub Puppet::Parser::Scope
|
14
|
+
# so that +no+ new real ruby method are defined.
|
15
|
+
# After each test, we want to leave the whole Puppet::Parser::Functions environment
|
16
|
+
# as it was before we were called, hence we call rmfunction (which might not succeed
|
17
|
+
# if the function hasn't been registered in the test). It is also important in this
|
18
|
+
# section to stub +remove_method+ here so that we don't pollute the scope.
|
19
|
+
Puppet::Parser::Scope.stubs(:remove_method)
|
20
|
+
begin
|
21
|
+
Puppet::Parser::Functions.rmfunction("name")
|
22
|
+
rescue
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "when calling newfunction" do
|
27
|
+
it "should create the function in the scope class" do
|
28
|
+
Puppet::Parser::Scope.expects(:define_method).with { |name,block| name == "function_name" }
|
29
|
+
|
30
|
+
Puppet::Parser::Functions.newfunction("name", :type => :rvalue)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should raise an error if the function already exists" do
|
34
|
+
Puppet::Parser::Scope.expects(:define_method).with { |name,block| name == "function_name" }.once
|
35
|
+
Puppet::Parser::Functions.newfunction("name", :type => :rvalue)
|
36
|
+
|
37
|
+
lambda { Puppet::Parser::Functions.newfunction("name", :type => :rvalue) }.should raise_error
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should raise an error if the function type is not correct" do
|
41
|
+
Puppet::Parser::Scope.expects(:define_method).with { |name,block| name == "function_name" }.never
|
42
|
+
|
43
|
+
lambda { Puppet::Parser::Functions.newfunction("name", :type => :unknown) }.should raise_error
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "when calling rmfunction" do
|
48
|
+
it "should remove the function in the scope class" do
|
49
|
+
Puppet::Parser::Scope.expects(:define_method).with { |name,block| name == "function_name" }
|
50
|
+
Puppet::Parser::Functions.newfunction("name", :type => :rvalue)
|
51
|
+
|
52
|
+
Puppet::Parser::Scope.expects(:remove_method).with("function_name").once
|
53
|
+
|
54
|
+
Puppet::Parser::Functions.rmfunction("name")
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should raise an error if the function doesn't exists" do
|
58
|
+
lambda { Puppet::Parser::Functions.rmfunction("name") }.should raise_error
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "when calling function to test function existance" do
|
63
|
+
|
64
|
+
it "should return false if the function doesn't exist" do
|
65
|
+
Puppet::Parser::Functions.autoloader.stubs(:load)
|
66
|
+
|
67
|
+
Puppet::Parser::Functions.function("name").should be_false
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should return it's name if the function exists" do
|
71
|
+
Puppet::Parser::Scope.expects(:define_method).with { |name,block| name == "function_name" }
|
72
|
+
Puppet::Parser::Functions.newfunction("name", :type => :rvalue)
|
73
|
+
|
74
|
+
Puppet::Parser::Functions.function("name").should == "function_name"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should try to autoload the function if it doesn't exist yet" do
|
78
|
+
Puppet::Parser::Functions.autoloader.expects(:load)
|
79
|
+
|
80
|
+
Puppet::Parser::Functions.function("name")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
4
|
+
|
5
|
+
describe "the inline_template function" do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@scope = Puppet::Parser::Scope.new()
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should exist" do
|
12
|
+
Puppet::Parser::Functions.function("inline_template").should == "function_inline_template"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should create a TemplateWrapper when called" do
|
16
|
+
tw = stub_everything 'template_wrapper'
|
17
|
+
|
18
|
+
Puppet::Parser::TemplateWrapper.expects(:new).returns(tw)
|
19
|
+
|
20
|
+
@scope.function_inline_template("test")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should pass the template string to TemplateWrapper.result" do
|
24
|
+
tw = stub_everything 'template_wrapper'
|
25
|
+
Puppet::Parser::TemplateWrapper.stubs(:new).returns(tw)
|
26
|
+
|
27
|
+
tw.expects(:result).with("test")
|
28
|
+
|
29
|
+
@scope.function_inline_template("test")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return what TemplateWrapper.result returns" do
|
33
|
+
tw = stub_everything 'template_wrapper'
|
34
|
+
Puppet::Parser::TemplateWrapper.stubs(:new).returns(tw)
|
35
|
+
|
36
|
+
tw.expects(:result).returns("template contents evaluated")
|
37
|
+
|
38
|
+
@scope.function_inline_template("test").should == "template contents evaluated"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should concatenate template wrapper outputs for multiple templates" do
|
42
|
+
tw1 = stub_everything "template_wrapper1"
|
43
|
+
tw2 = stub_everything "template_wrapper2"
|
44
|
+
Puppet::Parser::TemplateWrapper.stubs(:new).returns(tw1,tw2)
|
45
|
+
tw1.stubs(:result).returns("result1")
|
46
|
+
tw2.stubs(:result).returns("result2")
|
47
|
+
|
48
|
+
@scope.function_inline_template(["1","2"]).should == "result1result2"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should raise an error if the template raises an error" do
|
52
|
+
tw = stub_everything 'template_wrapper'
|
53
|
+
Puppet::Parser::TemplateWrapper.stubs(:new).returns(tw)
|
54
|
+
tw.stubs(:result).raises
|
55
|
+
|
56
|
+
lambda { @scope.function_inline_template("1") }.should raise_error(Puppet::ParseError)
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
4
|
+
|
5
|
+
describe "the template function" do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@scope = Puppet::Parser::Scope.new()
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should exist" do
|
12
|
+
Puppet::Parser::Functions.function("template").should == "function_template"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should create a TemplateWrapper when called" do
|
16
|
+
tw = stub_everything 'template_wrapper'
|
17
|
+
|
18
|
+
Puppet::Parser::TemplateWrapper.expects(:new).returns(tw)
|
19
|
+
|
20
|
+
@scope.function_template("test")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should give the template filename to the TemplateWrapper" do
|
24
|
+
tw = stub_everything 'template_wrapper'
|
25
|
+
Puppet::Parser::TemplateWrapper.stubs(:new).returns(tw)
|
26
|
+
|
27
|
+
tw.expects(:file=).with("test")
|
28
|
+
|
29
|
+
@scope.function_template("test")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return what TemplateWrapper.result returns" do
|
33
|
+
tw = stub_everything 'template_wrapper'
|
34
|
+
Puppet::Parser::TemplateWrapper.stubs(:new).returns(tw)
|
35
|
+
tw.stubs(:file=).with("test")
|
36
|
+
|
37
|
+
tw.expects(:result).returns("template contents evaluated")
|
38
|
+
|
39
|
+
@scope.function_template("test").should == "template contents evaluated"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should concatenate template wrapper outputs for multiple templates" do
|
43
|
+
tw1 = stub_everything "template_wrapper1"
|
44
|
+
tw2 = stub_everything "template_wrapper2"
|
45
|
+
Puppet::Parser::TemplateWrapper.stubs(:new).returns(tw1,tw2)
|
46
|
+
tw1.stubs(:file=).with("1")
|
47
|
+
tw2.stubs(:file=).with("2")
|
48
|
+
tw1.stubs(:result).returns("result1")
|
49
|
+
tw2.stubs(:result).returns("result2")
|
50
|
+
|
51
|
+
@scope.function_template(["1","2"]).should == "result1result2"
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should raise an error if the template raises an error" do
|
55
|
+
tw = stub_everything 'template_wrapper'
|
56
|
+
Puppet::Parser::TemplateWrapper.stubs(:new).returns(tw)
|
57
|
+
tw.stubs(:result).raises
|
58
|
+
|
59
|
+
lambda { @scope.function_template("1") }.should raise_error(Puppet::ParseError)
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
4
|
+
|
5
|
+
describe Puppet::Parser::Interpreter do
|
6
|
+
before do
|
7
|
+
@interp = Puppet::Parser::Interpreter.new
|
8
|
+
@parser = mock 'parser'
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "when creating parser instances" do
|
12
|
+
it "should create a parser with code if there is code defined in the :code setting" do
|
13
|
+
Puppet.settings.stubs(:value).with(:code, :myenv).returns("mycode")
|
14
|
+
@parser.expects(:string=).with("mycode")
|
15
|
+
@parser.expects(:parse)
|
16
|
+
Puppet::Parser::Parser.expects(:new).with(:environment => :myenv).returns(@parser)
|
17
|
+
@interp.send(:create_parser, :myenv).object_id.should equal(@parser.object_id)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should create a parser with the main manifest when the code setting is an empty string" do
|
21
|
+
Puppet.settings.stubs(:value).with(:code, :myenv).returns("")
|
22
|
+
Puppet.settings.stubs(:value).with(:manifest, :myenv).returns("/my/file")
|
23
|
+
@parser.expects(:parse)
|
24
|
+
@parser.expects(:file=).with("/my/file")
|
25
|
+
Puppet::Parser::Parser.expects(:new).with(:environment => :myenv).returns(@parser)
|
26
|
+
@interp.send(:create_parser, :myenv).should equal(@parser)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should return nothing when new parsers fail" do
|
30
|
+
Puppet::Parser::Parser.expects(:new).with(:environment => :myenv).raises(ArgumentError)
|
31
|
+
proc { @interp.send(:create_parser, :myenv) }.should raise_error(Puppet::Error)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should create parsers with environment-appropriate manifests" do
|
35
|
+
# Set our per-environment values. We can't just stub :value, because
|
36
|
+
# it's called by too much of the rest of the code.
|
37
|
+
text = "[env1]\nmanifest = /t/env1.pp\n[env2]\nmanifest = /t/env2.pp"
|
38
|
+
file = mock 'file'
|
39
|
+
file.stubs(:changed?).returns(true)
|
40
|
+
file.stubs(:file).returns("/whatever")
|
41
|
+
Puppet.settings.stubs(:read_file).with(file).returns(text)
|
42
|
+
Puppet.settings.parse(file)
|
43
|
+
|
44
|
+
parser1 = mock 'parser1'
|
45
|
+
Puppet::Parser::Parser.expects(:new).with(:environment => :env1).returns(parser1)
|
46
|
+
parser1.expects(:file=).with("/t/env1.pp")
|
47
|
+
parser1.expects(:parse)
|
48
|
+
@interp.send(:create_parser, :env1)
|
49
|
+
|
50
|
+
parser2 = mock 'parser2'
|
51
|
+
Puppet::Parser::Parser.expects(:new).with(:environment => :env2).returns(parser2)
|
52
|
+
parser2.expects(:file=).with("/t/env2.pp")
|
53
|
+
parser2.expects(:parse)
|
54
|
+
@interp.send(:create_parser, :env2)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "when managing parser instances" do
|
59
|
+
it "should use the same parser when the parser does not need reparsing" do
|
60
|
+
@interp.expects(:create_parser).with(:myenv).returns(@parser)
|
61
|
+
@interp.send(:parser, :myenv).should equal(@parser)
|
62
|
+
|
63
|
+
@parser.expects(:reparse?).returns(false)
|
64
|
+
@interp.send(:parser, :myenv).should equal(@parser)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should fail intelligently if a parser cannot be created and one does not already exist" do
|
68
|
+
@interp.expects(:create_parser).with(:myenv).raises(ArgumentError)
|
69
|
+
proc { @interp.send(:parser, :myenv) }.should raise_error(ArgumentError)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should use different parsers for different environments" do
|
73
|
+
# get one for the first env
|
74
|
+
@interp.expects(:create_parser).with(:first_env).returns(@parser)
|
75
|
+
@interp.send(:parser, :first_env).should equal(@parser)
|
76
|
+
|
77
|
+
other_parser = mock('otherparser')
|
78
|
+
@interp.expects(:create_parser).with(:second_env).returns(other_parser)
|
79
|
+
@interp.send(:parser, :second_env).should equal(other_parser)
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "when files need reparsing" do
|
83
|
+
it "should create a new parser" do
|
84
|
+
oldparser = mock('oldparser')
|
85
|
+
newparser = mock('newparser')
|
86
|
+
oldparser.expects(:reparse?).returns(true)
|
87
|
+
|
88
|
+
@interp.expects(:create_parser).with(:myenv).returns(oldparser)
|
89
|
+
@interp.send(:parser, :myenv).should equal(oldparser)
|
90
|
+
@interp.expects(:create_parser).with(:myenv).returns(newparser)
|
91
|
+
@interp.send(:parser, :myenv).should equal(newparser)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should raise an exception if a new parser cannot be created" do
|
95
|
+
# Get the first parser in the hash.
|
96
|
+
@interp.expects(:create_parser).with(:myenv).returns(@parser)
|
97
|
+
@interp.send(:parser, :myenv).should equal(@parser)
|
98
|
+
|
99
|
+
@parser.expects(:reparse?).returns(true)
|
100
|
+
|
101
|
+
@interp.expects(:create_parser).with(:myenv).raises(Puppet::Error, "Could not parse")
|
102
|
+
|
103
|
+
lambda { @interp.parser(:myenv) }.should raise_error(Puppet::Error)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "when compiling a catalog" do
|
109
|
+
before do
|
110
|
+
@node = stub 'node', :environment => :myenv
|
111
|
+
@compiler = mock 'compile'
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should create a compile with the node and parser" do
|
115
|
+
@compiler.expects(:compile).returns(:config)
|
116
|
+
@interp.expects(:parser).with(:myenv).returns(@parser)
|
117
|
+
Puppet::Parser::Compiler.expects(:new).with(@node, @parser).returns(@compiler)
|
118
|
+
@interp.compile(@node)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should fail intelligently when no parser can be found" do
|
122
|
+
@node.stubs(:name).returns("whatever")
|
123
|
+
@interp.expects(:parser).with(:myenv).returns(nil)
|
124
|
+
proc { @interp.compile(@node) }.should raise_error(Puppet::ParseError)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "when returning catalog version" do
|
129
|
+
it "should ask the appropriate parser for the catalog version" do
|
130
|
+
node = mock 'node'
|
131
|
+
node.expects(:environment).returns(:myenv)
|
132
|
+
parser = mock 'parser'
|
133
|
+
parser.expects(:version).returns(:myvers)
|
134
|
+
@interp.expects(:parser).with(:myenv).returns(parser)
|
135
|
+
@interp.configuration_version(node).should equal(:myvers)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,646 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
4
|
+
|
5
|
+
require 'puppet/parser/lexer'
|
6
|
+
|
7
|
+
describe Puppet::Parser::Lexer do
|
8
|
+
describe "when reading strings" do
|
9
|
+
before { @lexer = Puppet::Parser::Lexer.new }
|
10
|
+
it "should increment the line count for every carriage return in the string" do
|
11
|
+
@lexer.line = 10
|
12
|
+
@lexer.string = "this\nis\natest'"
|
13
|
+
@lexer.slurpstring("'")
|
14
|
+
|
15
|
+
@lexer.line.should == 12
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should not increment the line count for escapes in the string" do
|
19
|
+
@lexer.line = 10
|
20
|
+
@lexer.string = "this\\nis\\natest'"
|
21
|
+
@lexer.slurpstring("'")
|
22
|
+
|
23
|
+
@lexer.line.should == 10
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe Puppet::Parser::Lexer::Token do
|
29
|
+
before do
|
30
|
+
@token = Puppet::Parser::Lexer::Token.new(%r{something}, :NAME)
|
31
|
+
end
|
32
|
+
|
33
|
+
[:regex, :name, :string, :skip, :incr_line, :skip_text, :accumulate].each do |param|
|
34
|
+
it "should have a #{param.to_s} reader" do
|
35
|
+
@token.should be_respond_to(param)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should have a #{param.to_s} writer" do
|
39
|
+
@token.should be_respond_to(param.to_s + "=")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe Puppet::Parser::Lexer::Token, "when initializing" do
|
45
|
+
it "should create a regex if the first argument is a string" do
|
46
|
+
Puppet::Parser::Lexer::Token.new("something", :NAME).regex.should == %r{something}
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should set the string if the first argument is one" do
|
50
|
+
Puppet::Parser::Lexer::Token.new("something", :NAME).string.should == "something"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should set the regex if the first argument is one" do
|
54
|
+
Puppet::Parser::Lexer::Token.new(%r{something}, :NAME).regex.should == %r{something}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe Puppet::Parser::Lexer::TokenList do
|
59
|
+
before do
|
60
|
+
@list = Puppet::Parser::Lexer::TokenList.new
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should have a method for retrieving tokens by the name" do
|
64
|
+
token = @list.add_token :name, "whatever"
|
65
|
+
@list[:name].should equal(token)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should have a method for retrieving string tokens by the string" do
|
69
|
+
token = @list.add_token :name, "whatever"
|
70
|
+
@list.lookup("whatever").should equal(token)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should add tokens to the list when directed" do
|
74
|
+
token = @list.add_token :name, "whatever"
|
75
|
+
@list[:name].should equal(token)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should have a method for adding multiple tokens at once" do
|
79
|
+
@list.add_tokens "whatever" => :name, "foo" => :bar
|
80
|
+
@list[:name].should_not be_nil
|
81
|
+
@list[:bar].should_not be_nil
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should fail to add tokens sharing a name with an existing token" do
|
85
|
+
@list.add_token :name, "whatever"
|
86
|
+
lambda { @list.add_token :name, "whatever" }.should raise_error(ArgumentError)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should set provided options on tokens being added" do
|
90
|
+
token = @list.add_token :name, "whatever", :skip_text => true
|
91
|
+
token.skip_text.should == true
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should define any provided blocks as a :convert method" do
|
95
|
+
token = @list.add_token(:name, "whatever") do "foo" end
|
96
|
+
token.convert.should == "foo"
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should store all string tokens in the :string_tokens list" do
|
100
|
+
one = @list.add_token(:name, "1")
|
101
|
+
@list.string_tokens.should be_include(one)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should store all regex tokens in the :regex_tokens list" do
|
105
|
+
one = @list.add_token(:name, %r{one})
|
106
|
+
@list.regex_tokens.should be_include(one)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should not store string tokens in the :regex_tokens list" do
|
110
|
+
one = @list.add_token(:name, "1")
|
111
|
+
@list.regex_tokens.should_not be_include(one)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should not store regex tokens in the :string_tokens list" do
|
115
|
+
one = @list.add_token(:name, %r{one})
|
116
|
+
@list.string_tokens.should_not be_include(one)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should sort the string tokens inversely by length when asked" do
|
120
|
+
one = @list.add_token(:name, "1")
|
121
|
+
two = @list.add_token(:other, "12")
|
122
|
+
@list.sort_tokens
|
123
|
+
@list.string_tokens.should == [two, one]
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe Puppet::Parser::Lexer::TOKENS do
|
128
|
+
before do
|
129
|
+
@lexer = Puppet::Parser::Lexer.new()
|
130
|
+
end
|
131
|
+
|
132
|
+
{
|
133
|
+
:LBRACK => '[',
|
134
|
+
:RBRACK => ']',
|
135
|
+
:LBRACE => '{',
|
136
|
+
:RBRACE => '}',
|
137
|
+
:LPAREN => '(',
|
138
|
+
:RPAREN => ')',
|
139
|
+
:EQUALS => '=',
|
140
|
+
:ISEQUAL => '==',
|
141
|
+
:GREATEREQUAL => '>=',
|
142
|
+
:GREATERTHAN => '>',
|
143
|
+
:LESSTHAN => '<',
|
144
|
+
:LESSEQUAL => '<=',
|
145
|
+
:NOTEQUAL => '!=',
|
146
|
+
:NOT => '!',
|
147
|
+
:COMMA => ',',
|
148
|
+
:DOT => '.',
|
149
|
+
:COLON => ':',
|
150
|
+
:AT => '@',
|
151
|
+
:LLCOLLECT => '<<|',
|
152
|
+
:RRCOLLECT => '|>>',
|
153
|
+
:LCOLLECT => '<|',
|
154
|
+
:RCOLLECT => '|>',
|
155
|
+
:SEMIC => ';',
|
156
|
+
:QMARK => '?',
|
157
|
+
:BACKSLASH => '\\',
|
158
|
+
:FARROW => '=>',
|
159
|
+
:PARROW => '+>',
|
160
|
+
:APPENDS => '+=',
|
161
|
+
:PLUS => '+',
|
162
|
+
:MINUS => '-',
|
163
|
+
:DIV => '/',
|
164
|
+
:TIMES => '*',
|
165
|
+
:LSHIFT => '<<',
|
166
|
+
:RSHIFT => '>>',
|
167
|
+
}.each do |name, string|
|
168
|
+
it "should have a token named #{name.to_s}" do
|
169
|
+
Puppet::Parser::Lexer::TOKENS[name].should_not be_nil
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should match '#{string}' for the token #{name.to_s}" do
|
173
|
+
Puppet::Parser::Lexer::TOKENS[name].string.should == string
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
{
|
178
|
+
"case" => :CASE,
|
179
|
+
"class" => :CLASS,
|
180
|
+
"default" => :DEFAULT,
|
181
|
+
"define" => :DEFINE,
|
182
|
+
"import" => :IMPORT,
|
183
|
+
"if" => :IF,
|
184
|
+
"elsif" => :ELSIF,
|
185
|
+
"else" => :ELSE,
|
186
|
+
"inherits" => :INHERITS,
|
187
|
+
"node" => :NODE,
|
188
|
+
"and" => :AND,
|
189
|
+
"or" => :OR,
|
190
|
+
"undef" => :UNDEF,
|
191
|
+
"false" => :FALSE,
|
192
|
+
"true" => :TRUE
|
193
|
+
}.each do |string, name|
|
194
|
+
it "should have a keyword named #{name.to_s}" do
|
195
|
+
Puppet::Parser::Lexer::KEYWORDS[name].should_not be_nil
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should have the keyword for #{name.to_s} set to #{string}" do
|
199
|
+
Puppet::Parser::Lexer::KEYWORDS[name].string.should == string
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
# These tokens' strings don't matter, just that the tokens exist.
|
204
|
+
[:DQTEXT, :SQTEXT, :BOOLEAN, :NAME, :NUMBER, :COMMENT, :MLCOMMENT, :RETURN, :SQUOTE, :DQUOTE, :VARIABLE].each do |name|
|
205
|
+
it "should have a token named #{name.to_s}" do
|
206
|
+
Puppet::Parser::Lexer::TOKENS[name].should_not be_nil
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
describe Puppet::Parser::Lexer::TOKENS[:CLASSNAME] do
|
212
|
+
before { @token = Puppet::Parser::Lexer::TOKENS[:CLASSNAME] }
|
213
|
+
|
214
|
+
it "should match against lower-case alpha-numeric terms separated by double colons" do
|
215
|
+
@token.regex.should =~ "one::two"
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should match against many lower-case alpha-numeric terms separated by double colons" do
|
219
|
+
@token.regex.should =~ "one::two::three::four::five"
|
220
|
+
end
|
221
|
+
|
222
|
+
it "should match against lower-case alpha-numeric terms prefixed by double colons" do
|
223
|
+
@token.regex.should =~ "::one"
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
describe Puppet::Parser::Lexer::TOKENS[:CLASSREF] do
|
228
|
+
before { @token = Puppet::Parser::Lexer::TOKENS[:CLASSREF] }
|
229
|
+
|
230
|
+
it "should match against single upper-case alpha-numeric terms" do
|
231
|
+
@token.regex.should =~ "One"
|
232
|
+
end
|
233
|
+
|
234
|
+
it "should match against upper-case alpha-numeric terms separated by double colons" do
|
235
|
+
@token.regex.should =~ "One::Two"
|
236
|
+
end
|
237
|
+
|
238
|
+
it "should match against many upper-case alpha-numeric terms separated by double colons" do
|
239
|
+
@token.regex.should =~ "One::Two::Three::Four::Five"
|
240
|
+
end
|
241
|
+
|
242
|
+
it "should match against upper-case alpha-numeric terms prefixed by double colons" do
|
243
|
+
@token.regex.should =~ "::One"
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
describe Puppet::Parser::Lexer::TOKENS[:NAME] do
|
248
|
+
before { @token = Puppet::Parser::Lexer::TOKENS[:NAME] }
|
249
|
+
|
250
|
+
it "should match against lower-case alpha-numeric terms" do
|
251
|
+
@token.regex.should =~ "one-two"
|
252
|
+
end
|
253
|
+
|
254
|
+
it "should return itself and the value if the matched term is not a keyword" do
|
255
|
+
Puppet::Parser::Lexer::KEYWORDS.expects(:lookup).returns(nil)
|
256
|
+
@token.convert(stub("lexer"), "myval").should == [Puppet::Parser::Lexer::TOKENS[:NAME], "myval"]
|
257
|
+
end
|
258
|
+
|
259
|
+
it "should return the keyword token and the value if the matched term is a keyword" do
|
260
|
+
keyword = stub 'keyword', :name => :testing
|
261
|
+
Puppet::Parser::Lexer::KEYWORDS.expects(:lookup).returns(keyword)
|
262
|
+
@token.convert(stub("lexer"), "myval").should == [keyword, "myval"]
|
263
|
+
end
|
264
|
+
|
265
|
+
it "should return the BOOLEAN token and 'true' if the matched term is the string 'true'" do
|
266
|
+
keyword = stub 'keyword', :name => :TRUE
|
267
|
+
Puppet::Parser::Lexer::KEYWORDS.expects(:lookup).returns(keyword)
|
268
|
+
@token.convert(stub('lexer'), "true").should == [Puppet::Parser::Lexer::TOKENS[:BOOLEAN], true]
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should return the BOOLEAN token and 'false' if the matched term is the string 'false'" do
|
272
|
+
keyword = stub 'keyword', :name => :FALSE
|
273
|
+
Puppet::Parser::Lexer::KEYWORDS.expects(:lookup).returns(keyword)
|
274
|
+
@token.convert(stub('lexer'), "false").should == [Puppet::Parser::Lexer::TOKENS[:BOOLEAN], false]
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
describe Puppet::Parser::Lexer::TOKENS[:NUMBER] do
|
279
|
+
before do
|
280
|
+
@token = Puppet::Parser::Lexer::TOKENS[:NUMBER]
|
281
|
+
# @regex = Regexp.new('^'+@token.regex.source+'$')
|
282
|
+
@regex = @token.regex
|
283
|
+
end
|
284
|
+
|
285
|
+
it "should match against numeric terms" do
|
286
|
+
@regex.should =~ "2982383139"
|
287
|
+
end
|
288
|
+
|
289
|
+
it "should match against float terms" do
|
290
|
+
@regex.should =~ "29823.235"
|
291
|
+
end
|
292
|
+
|
293
|
+
it "should match against hexadecimal terms" do
|
294
|
+
@regex.should =~ "0xBEEF0023"
|
295
|
+
end
|
296
|
+
|
297
|
+
it "should match against float with exponent terms" do
|
298
|
+
@regex.should =~ "10e23"
|
299
|
+
end
|
300
|
+
|
301
|
+
it "should match against float terms with negative exponents" do
|
302
|
+
@regex.should =~ "10e-23"
|
303
|
+
end
|
304
|
+
|
305
|
+
it "should match against float terms with fractional parts and exponent" do
|
306
|
+
@regex.should =~ "1.234e23"
|
307
|
+
end
|
308
|
+
|
309
|
+
it "should return the NAME token and the value" do
|
310
|
+
@token.convert(stub("lexer"), "myval").should == [Puppet::Parser::Lexer::TOKENS[:NAME], "myval"]
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
describe Puppet::Parser::Lexer::TOKENS[:COMMENT] do
|
315
|
+
before { @token = Puppet::Parser::Lexer::TOKENS[:COMMENT] }
|
316
|
+
|
317
|
+
it "should match against lines starting with '#'" do
|
318
|
+
@token.regex.should =~ "# this is a comment"
|
319
|
+
end
|
320
|
+
|
321
|
+
it "should be marked to get skipped" do
|
322
|
+
@token.skip?.should be_true
|
323
|
+
end
|
324
|
+
|
325
|
+
it "should be marked to accumulate" do
|
326
|
+
@token.accumulate?.should be_true
|
327
|
+
end
|
328
|
+
|
329
|
+
it "'s block should return the comment without the #" do
|
330
|
+
@token.convert(@lexer,"# this is a comment")[1].should == "this is a comment"
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
describe Puppet::Parser::Lexer::TOKENS[:MLCOMMENT] do
|
335
|
+
before do
|
336
|
+
@token = Puppet::Parser::Lexer::TOKENS[:MLCOMMENT]
|
337
|
+
@lexer = stub 'lexer', :line => 0
|
338
|
+
end
|
339
|
+
|
340
|
+
it "should match against lines enclosed with '/*' and '*/'" do
|
341
|
+
@token.regex.should =~ "/* this is a comment */"
|
342
|
+
end
|
343
|
+
|
344
|
+
it "should match multiple lines enclosed with '/*' and '*/'" do
|
345
|
+
@token.regex.should =~ """/*
|
346
|
+
this is a comment
|
347
|
+
*/"""
|
348
|
+
end
|
349
|
+
|
350
|
+
it "should increase the lexer current line number by the amount of lines spanned by the comment" do
|
351
|
+
@lexer.expects(:line=).with(2)
|
352
|
+
@token.convert(@lexer, "1\n2\n3")
|
353
|
+
end
|
354
|
+
|
355
|
+
it "should not greedily match comments" do
|
356
|
+
match = @token.regex.match("/* first */ word /* second */")
|
357
|
+
match[1].should == " first "
|
358
|
+
end
|
359
|
+
|
360
|
+
it "should be marked to accumulate" do
|
361
|
+
@token.accumulate?.should be_true
|
362
|
+
end
|
363
|
+
|
364
|
+
it "'s block should return the comment without the comment marks" do
|
365
|
+
@lexer.stubs(:line=).with(0)
|
366
|
+
|
367
|
+
@token.convert(@lexer,"/* this is a comment */")[1].should == "this is a comment"
|
368
|
+
end
|
369
|
+
|
370
|
+
end
|
371
|
+
|
372
|
+
describe Puppet::Parser::Lexer::TOKENS[:RETURN] do
|
373
|
+
before { @token = Puppet::Parser::Lexer::TOKENS[:RETURN] }
|
374
|
+
|
375
|
+
it "should match against carriage returns" do
|
376
|
+
@token.regex.should =~ "\n"
|
377
|
+
end
|
378
|
+
|
379
|
+
it "should be marked to initiate text skipping" do
|
380
|
+
@token.skip_text.should be_true
|
381
|
+
end
|
382
|
+
|
383
|
+
it "should be marked to increment the line" do
|
384
|
+
@token.incr_line.should be_true
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
describe Puppet::Parser::Lexer::TOKENS[:SQUOTE] do
|
389
|
+
before { @token = Puppet::Parser::Lexer::TOKENS[:SQUOTE] }
|
390
|
+
|
391
|
+
it "should match against single quotes" do
|
392
|
+
@token.regex.should =~ "'"
|
393
|
+
end
|
394
|
+
|
395
|
+
it "should slurp the rest of the quoted string" do
|
396
|
+
lexer = stub("lexer")
|
397
|
+
lexer.expects(:slurpstring).with("myval").returns("otherval")
|
398
|
+
@token.convert(lexer, "myval")
|
399
|
+
end
|
400
|
+
|
401
|
+
it "should return the SQTEXT token with the slurped string" do
|
402
|
+
lexer = stub("lexer")
|
403
|
+
lexer.stubs(:slurpstring).with("myval").returns("otherval")
|
404
|
+
@token.convert(lexer, "myval").should == [Puppet::Parser::Lexer::TOKENS[:SQTEXT], "otherval"]
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
describe Puppet::Parser::Lexer::TOKENS[:DQUOTE] do
|
409
|
+
before { @token = Puppet::Parser::Lexer::TOKENS[:DQUOTE] }
|
410
|
+
|
411
|
+
it "should match against single quotes" do
|
412
|
+
@token.regex.should =~ '"'
|
413
|
+
end
|
414
|
+
|
415
|
+
it "should slurp the rest of the quoted string" do
|
416
|
+
lexer = stub("lexer")
|
417
|
+
lexer.expects(:slurpstring).with("myval").returns("otherval")
|
418
|
+
@token.convert(lexer, "myval")
|
419
|
+
end
|
420
|
+
|
421
|
+
it "should return the DQTEXT token with the slurped string" do
|
422
|
+
lexer = stub("lexer")
|
423
|
+
lexer.stubs(:slurpstring).with("myval").returns("otherval")
|
424
|
+
@token.convert(lexer, "myval").should == [Puppet::Parser::Lexer::TOKENS[:DQTEXT], "otherval"]
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
428
|
+
describe Puppet::Parser::Lexer::TOKENS[:VARIABLE] do
|
429
|
+
before { @token = Puppet::Parser::Lexer::TOKENS[:VARIABLE] }
|
430
|
+
|
431
|
+
it "should match against alpha words prefixed with '$'" do
|
432
|
+
@token.regex.should =~ '$this_var'
|
433
|
+
end
|
434
|
+
|
435
|
+
it "should return the VARIABLE token and the variable name stripped of the '$'" do
|
436
|
+
@token.convert(stub("lexer"), "$myval").should == [Puppet::Parser::Lexer::TOKENS[:VARIABLE], "myval"]
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
describe Puppet::Parser::Lexer, "when lexing comments" do
|
441
|
+
before { @lexer = Puppet::Parser::Lexer.new }
|
442
|
+
|
443
|
+
it "should accumulate token in munge_token" do
|
444
|
+
token = stub 'token', :skip => true, :accumulate? => true, :incr_line => nil, :skip_text => false
|
445
|
+
|
446
|
+
token.stubs(:convert).with(@lexer, "# this is a comment").returns([token, " this is a comment"])
|
447
|
+
@lexer.munge_token(token, "# this is a comment")
|
448
|
+
@lexer.munge_token(token, "# this is a comment")
|
449
|
+
|
450
|
+
@lexer.getcomment.should == " this is a comment\n this is a comment\n"
|
451
|
+
end
|
452
|
+
|
453
|
+
it "should add a new comment stack level on LBRACE" do
|
454
|
+
@lexer.string = "{"
|
455
|
+
|
456
|
+
@lexer.expects(:commentpush)
|
457
|
+
|
458
|
+
@lexer.fullscan
|
459
|
+
end
|
460
|
+
|
461
|
+
it "should return the current comments on getcomment" do
|
462
|
+
@lexer.string = "# comment"
|
463
|
+
@lexer.fullscan
|
464
|
+
|
465
|
+
@lexer.getcomment.should == "comment\n"
|
466
|
+
end
|
467
|
+
|
468
|
+
it "should discard the previous comments on blank line" do
|
469
|
+
@lexer.string = "# 1\n\n# 2"
|
470
|
+
@lexer.fullscan
|
471
|
+
|
472
|
+
@lexer.getcomment.should == "2\n"
|
473
|
+
end
|
474
|
+
|
475
|
+
end
|
476
|
+
|
477
|
+
# FIXME: We need to rewrite all of these tests, but I just don't want to take the time right now.
|
478
|
+
describe "Puppet::Parser::Lexer in the old tests" do
|
479
|
+
before { @lexer = Puppet::Parser::Lexer.new }
|
480
|
+
|
481
|
+
it "should do simple lexing" do
|
482
|
+
strings = {
|
483
|
+
%q{\\} => [[:BACKSLASH,"\\"],[false,false]],
|
484
|
+
%q{simplest scanner test} => [[:NAME,"simplest"],[:NAME,"scanner"],[:NAME,"test"],[false,false]],
|
485
|
+
%q{returned scanner test
|
486
|
+
} => [[:NAME,"returned"],[:NAME,"scanner"],[:NAME,"test"],[false,false]]
|
487
|
+
}
|
488
|
+
strings.each { |str,ary|
|
489
|
+
@lexer.string = str
|
490
|
+
@lexer.fullscan().should == ary
|
491
|
+
}
|
492
|
+
end
|
493
|
+
|
494
|
+
it "should correctly lex quoted strings" do
|
495
|
+
strings = {
|
496
|
+
%q{a simple "scanner" test
|
497
|
+
} => [[:NAME,"a"],[:NAME,"simple"],[:DQTEXT,"scanner"],[:NAME,"test"],[false,false]],
|
498
|
+
%q{a simple 'single quote scanner' test
|
499
|
+
} => [[:NAME,"a"],[:NAME,"simple"],[:SQTEXT,"single quote scanner"],[:NAME,"test"],[false,false]],
|
500
|
+
%q{a harder 'a $b \c"'
|
501
|
+
} => [[:NAME,"a"],[:NAME,"harder"],[:SQTEXT,'a $b \c"'],[false,false]],
|
502
|
+
%q{a harder "scanner test"
|
503
|
+
} => [[:NAME,"a"],[:NAME,"harder"],[:DQTEXT,"scanner test"],[false,false]],
|
504
|
+
%q{a hardest "scanner \"test\""
|
505
|
+
} => [[:NAME,"a"],[:NAME,"hardest"],[:DQTEXT,'scanner "test"'],[false,false]],
|
506
|
+
%q{a hardestest "scanner \"test\"
|
507
|
+
"
|
508
|
+
} => [[:NAME,"a"],[:NAME,"hardestest"],[:DQTEXT,'scanner "test"
|
509
|
+
'],[false,false]],
|
510
|
+
%q{function("call")} => [[:NAME,"function"],[:LPAREN,"("],[:DQTEXT,'call'],[:RPAREN,")"],[false,false]]
|
511
|
+
}
|
512
|
+
strings.each { |str,array|
|
513
|
+
@lexer.string = str
|
514
|
+
@lexer.fullscan().should == array
|
515
|
+
}
|
516
|
+
end
|
517
|
+
|
518
|
+
it "should fail usefully" do
|
519
|
+
strings = %w{
|
520
|
+
^
|
521
|
+
}
|
522
|
+
strings.each { |str|
|
523
|
+
@lexer.string = str
|
524
|
+
lambda { @lexer.fullscan() }.should raise_error(RuntimeError)
|
525
|
+
}
|
526
|
+
end
|
527
|
+
|
528
|
+
it "should fail if the string is not set" do
|
529
|
+
lambda { @lexer.fullscan() }.should raise_error(Puppet::LexError)
|
530
|
+
end
|
531
|
+
|
532
|
+
it "should correctly identify keywords" do
|
533
|
+
@lexer.string = "case"
|
534
|
+
@lexer.fullscan.should == [[:CASE, "case"], [false, false]]
|
535
|
+
end
|
536
|
+
|
537
|
+
it "should correctly match strings" do
|
538
|
+
names = %w{this is a bunch of names}
|
539
|
+
types = %w{Many Different Words A Word}
|
540
|
+
words = %w{differently Cased words A a}
|
541
|
+
|
542
|
+
names.each { |t|
|
543
|
+
@lexer.string = t
|
544
|
+
@lexer.fullscan.should == [[:NAME,t],[false,false]]
|
545
|
+
}
|
546
|
+
types.each { |t|
|
547
|
+
@lexer.string = t
|
548
|
+
@lexer.fullscan.should == [[:CLASSREF,t],[false,false]]
|
549
|
+
}
|
550
|
+
end
|
551
|
+
|
552
|
+
it "should correctly parse names with numerals" do
|
553
|
+
string = %w{1name name1 11names names11}
|
554
|
+
|
555
|
+
string.each { |t|
|
556
|
+
@lexer.string = t
|
557
|
+
@lexer.fullscan.should == [[:NAME,t],[false,false]]
|
558
|
+
}
|
559
|
+
end
|
560
|
+
|
561
|
+
it "should correctly parse empty strings" do
|
562
|
+
bit = '$var = ""'
|
563
|
+
|
564
|
+
@lexer.string = bit
|
565
|
+
|
566
|
+
lambda { @lexer.fullscan }.should_not raise_error
|
567
|
+
end
|
568
|
+
|
569
|
+
it "should correctly parse virtual resources" do
|
570
|
+
string = "@type {"
|
571
|
+
|
572
|
+
@lexer.string = string
|
573
|
+
|
574
|
+
@lexer.fullscan.should == [[:AT, "@"], [:NAME, "type"], [:LBRACE, "{"], [false,false]]
|
575
|
+
end
|
576
|
+
|
577
|
+
it "should correctly deal with namespaces" do
|
578
|
+
@lexer.string = %{class myclass}
|
579
|
+
|
580
|
+
@lexer.fullscan
|
581
|
+
|
582
|
+
@lexer.namespace.should == "myclass"
|
583
|
+
|
584
|
+
@lexer.namepop
|
585
|
+
|
586
|
+
@lexer.namespace.should == ""
|
587
|
+
|
588
|
+
@lexer.string = "class base { class sub { class more"
|
589
|
+
|
590
|
+
@lexer.fullscan
|
591
|
+
|
592
|
+
@lexer.namespace.should == "base::sub::more"
|
593
|
+
|
594
|
+
@lexer.namepop
|
595
|
+
|
596
|
+
@lexer.namespace.should == "base::sub"
|
597
|
+
end
|
598
|
+
|
599
|
+
it "should correctly handle fully qualified names" do
|
600
|
+
@lexer.string = "class base { class sub::more {"
|
601
|
+
|
602
|
+
@lexer.fullscan
|
603
|
+
|
604
|
+
@lexer.namespace.should == "base::sub::more"
|
605
|
+
|
606
|
+
@lexer.namepop
|
607
|
+
|
608
|
+
@lexer.namespace.should == "base"
|
609
|
+
end
|
610
|
+
|
611
|
+
it "should correctly lex variables" do
|
612
|
+
["$variable", "$::variable", "$qualified::variable", "$further::qualified::variable"].each do |string|
|
613
|
+
@lexer.string = string
|
614
|
+
|
615
|
+
@lexer.scan do |t, s|
|
616
|
+
t.should == :VARIABLE
|
617
|
+
string.sub(/^\$/, '').should == s
|
618
|
+
break
|
619
|
+
end
|
620
|
+
end
|
621
|
+
end
|
622
|
+
|
623
|
+
# #774
|
624
|
+
it "should correctly parse the CLASSREF token" do
|
625
|
+
string = ["Foo", "::Foo","Foo::Bar","::Foo::Bar"]
|
626
|
+
|
627
|
+
string.each do |foo|
|
628
|
+
@lexer.string = foo
|
629
|
+
@lexer.fullscan[0].should == [:CLASSREF, foo]
|
630
|
+
end
|
631
|
+
end
|
632
|
+
|
633
|
+
end
|
634
|
+
|
635
|
+
require 'puppettest/support/utils'
|
636
|
+
describe "Puppet::Parser::Lexer in the old tests when lexing example files" do
|
637
|
+
extend PuppetTest
|
638
|
+
extend PuppetTest::Support::Utils
|
639
|
+
textfiles() do |file|
|
640
|
+
it "should correctly lex #{file}" do
|
641
|
+
lexer = Puppet::Parser::Lexer.new()
|
642
|
+
lexer.file = file
|
643
|
+
lambda { lexer.fullscan() }.should_not raise_error
|
644
|
+
end
|
645
|
+
end
|
646
|
+
end
|