facter 2.0.1.rc1-universal-darwin
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of facter might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/COMMITTERS.md +194 -0
- data/CONTRIBUTING.md +65 -0
- data/Gemfile +43 -0
- data/LICENSE +15 -0
- data/README.md +33 -0
- data/Rakefile +79 -0
- data/bin/facter +16 -0
- data/etc/facter.conf +5 -0
- data/ext/build_defaults.yaml +24 -0
- data/ext/debian/changelog.erb +59 -0
- data/ext/debian/compat +1 -0
- data/ext/debian/control +14 -0
- data/ext/debian/copyright +19 -0
- data/ext/debian/docs +1 -0
- data/ext/debian/lintian-overrides +0 -0
- data/ext/debian/rules +10 -0
- data/ext/debian/source/format +1 -0
- data/ext/facter-diff +74 -0
- data/ext/ips/facter.p5m.erb +10 -0
- data/ext/ips/rules +7 -0
- data/ext/ips/transforms +18 -0
- data/ext/osx/file_mapping.yaml +27 -0
- data/ext/osx/preflight.erb +33 -0
- data/ext/osx/prototype.plist.erb +38 -0
- data/ext/project_data.yaml +33 -0
- data/ext/redhat/facter.spec.erb +220 -0
- data/ext/solaris/pkginfo +7 -0
- data/install.rb +380 -0
- data/lib/facter.rb +262 -0
- data/lib/facter/Cfkey.rb +42 -0
- data/lib/facter/application.rb +204 -0
- data/lib/facter/architecture.rb +50 -0
- data/lib/facter/augeasversion.rb +28 -0
- data/lib/facter/blockdevices.rb +105 -0
- data/lib/facter/core/aggregate.rb +220 -0
- data/lib/facter/core/directed_graph.rb +46 -0
- data/lib/facter/core/execution.rb +100 -0
- data/lib/facter/core/execution/base.rb +73 -0
- data/lib/facter/core/execution/posix.rb +50 -0
- data/lib/facter/core/execution/windows.rb +57 -0
- data/lib/facter/core/logging.rb +169 -0
- data/lib/facter/core/resolvable.rb +94 -0
- data/lib/facter/core/suitable.rb +117 -0
- data/lib/facter/domain.rb +99 -0
- data/lib/facter/ec2.rb +37 -0
- data/lib/facter/facterversion.rb +15 -0
- data/lib/facter/filesystems.rb +38 -0
- data/lib/facter/fqdn.rb +22 -0
- data/lib/facter/hardwareisa.rb +20 -0
- data/lib/facter/hardwaremodel.rb +67 -0
- data/lib/facter/hostname.rb +33 -0
- data/lib/facter/id.rb +21 -0
- data/lib/facter/interfaces.rb +46 -0
- data/lib/facter/ipaddress.rb +171 -0
- data/lib/facter/ipaddress6.rb +82 -0
- data/lib/facter/iphostnumber.rb +29 -0
- data/lib/facter/kernel.rb +22 -0
- data/lib/facter/kernelmajversion.rb +15 -0
- data/lib/facter/kernelrelease.rb +42 -0
- data/lib/facter/kernelversion.rb +22 -0
- data/lib/facter/ldom.rb +47 -0
- data/lib/facter/lsbdistcodename.rb +18 -0
- data/lib/facter/lsbdistdescription.rb +21 -0
- data/lib/facter/lsbdistid.rb +18 -0
- data/lib/facter/lsbdistrelease.rb +18 -0
- data/lib/facter/lsbmajdistrelease.rb +27 -0
- data/lib/facter/lsbrelease.rb +18 -0
- data/lib/facter/macaddress.rb +97 -0
- data/lib/facter/macosx.rb +56 -0
- data/lib/facter/manufacturer.rb +68 -0
- data/lib/facter/memory.rb +162 -0
- data/lib/facter/netmask.rb +42 -0
- data/lib/facter/network.rb +20 -0
- data/lib/facter/operatingsystem.rb +121 -0
- data/lib/facter/operatingsystemmajrelease.rb +33 -0
- data/lib/facter/operatingsystemrelease.rb +226 -0
- data/lib/facter/osfamily.rb +35 -0
- data/lib/facter/path.rb +14 -0
- data/lib/facter/physicalprocessorcount.rb +84 -0
- data/lib/facter/processor.rb +183 -0
- data/lib/facter/ps.rb +30 -0
- data/lib/facter/puppetversion.rb +20 -0
- data/lib/facter/rubysitedir.rb +12 -0
- data/lib/facter/rubyversion.rb +12 -0
- data/lib/facter/selinux.rb +99 -0
- data/lib/facter/ssh.rb +72 -0
- data/lib/facter/timezone.rb +14 -0
- data/lib/facter/uniqueid.rb +4 -0
- data/lib/facter/uptime.rb +34 -0
- data/lib/facter/uptime_days.rb +15 -0
- data/lib/facter/uptime_hours.rb +15 -0
- data/lib/facter/uptime_seconds.rb +24 -0
- data/lib/facter/util/architecture.rb +19 -0
- data/lib/facter/util/collection.rb +161 -0
- data/lib/facter/util/composite_loader.rb +12 -0
- data/lib/facter/util/config.rb +61 -0
- data/lib/facter/util/confine.rb +66 -0
- data/lib/facter/util/directory_loader.rb +83 -0
- data/lib/facter/util/ec2.rb +101 -0
- data/lib/facter/util/fact.rb +204 -0
- data/lib/facter/util/file_read.rb +37 -0
- data/lib/facter/util/formatter.rb +38 -0
- data/lib/facter/util/ip.rb +285 -0
- data/lib/facter/util/ip/windows.rb +215 -0
- data/lib/facter/util/loader.rb +146 -0
- data/lib/facter/util/macaddress.rb +43 -0
- data/lib/facter/util/macosx.rb +73 -0
- data/lib/facter/util/manufacturer.rb +104 -0
- data/lib/facter/util/memory.rb +228 -0
- data/lib/facter/util/monkey_patches.rb +8 -0
- data/lib/facter/util/netmask.rb +40 -0
- data/lib/facter/util/normalization.rb +94 -0
- data/lib/facter/util/nothing_loader.rb +12 -0
- data/lib/facter/util/parser.rb +158 -0
- data/lib/facter/util/plist.rb +24 -0
- data/lib/facter/util/plist/generator.rb +228 -0
- data/lib/facter/util/plist/parser.rb +226 -0
- data/lib/facter/util/processor.rb +291 -0
- data/lib/facter/util/registry.rb +11 -0
- data/lib/facter/util/resolution.rb +152 -0
- data/lib/facter/util/solaris_zones.rb +158 -0
- data/lib/facter/util/unix_root.rb +5 -0
- data/lib/facter/util/uptime.rb +81 -0
- data/lib/facter/util/values.rb +80 -0
- data/lib/facter/util/virtual.rb +151 -0
- data/lib/facter/util/vlans.rb +24 -0
- data/lib/facter/util/windows_root.rb +37 -0
- data/lib/facter/util/wmi.rb +16 -0
- data/lib/facter/util/xendomains.rb +10 -0
- data/lib/facter/version.rb +86 -0
- data/lib/facter/virtual.rb +262 -0
- data/lib/facter/vlans.rb +17 -0
- data/lib/facter/xendomains.rb +20 -0
- data/lib/facter/zfs_version.rb +10 -0
- data/lib/facter/zonename.rb +6 -0
- data/lib/facter/zones.rb +17 -0
- data/lib/facter/zpool_version.rb +10 -0
- data/spec/fixtures/cpuinfo/amd64dual +57 -0
- data/spec/fixtures/cpuinfo/amd64quad +79 -0
- data/spec/fixtures/cpuinfo/amd64solo +23 -0
- data/spec/fixtures/cpuinfo/amd64tri +86 -0
- data/spec/fixtures/cpuinfo/amd64twentyfour +600 -0
- data/spec/fixtures/cpuinfo/bbg3-armel +12 -0
- data/spec/fixtures/cpuinfo/beaglexm-armel +12 -0
- data/spec/fixtures/cpuinfo/panda-armel +17 -0
- data/spec/fixtures/cpuinfo/ppc64 +19 -0
- data/spec/fixtures/cpuinfo/sparc +10 -0
- data/spec/fixtures/hpux/machinfo/hppa-rp4440 +26 -0
- data/spec/fixtures/hpux/machinfo/ia64-rx2620 +49 -0
- data/spec/fixtures/hpux/machinfo/ia64-rx6600 +26 -0
- data/spec/fixtures/hpux/machinfo/ia64-rx8640 +53 -0
- data/spec/fixtures/hpux/machinfo/superdome-server-SD32B +53 -0
- data/spec/fixtures/hpux/machinfo/superdome2-16s +31 -0
- data/spec/fixtures/hpux/sched.models +174 -0
- data/spec/fixtures/hpux/unistd.h +1534 -0
- data/spec/fixtures/ifconfig/bsd_ifconfig_all_with_multiple_interfaces +18 -0
- data/spec/fixtures/ifconfig/centos_5_5 +17 -0
- data/spec/fixtures/ifconfig/centos_5_5_eth0 +8 -0
- data/spec/fixtures/ifconfig/darwin_10_3_0 +26 -0
- data/spec/fixtures/ifconfig/darwin_10_3_0_en0 +6 -0
- data/spec/fixtures/ifconfig/darwin_10_6_4 +28 -0
- data/spec/fixtures/ifconfig/darwin_10_6_4_en1 +6 -0
- data/spec/fixtures/ifconfig/darwin_10_6_6_dualstack +8 -0
- data/spec/fixtures/ifconfig/darwin_10_6_6_dualstack_en1 +7 -0
- data/spec/fixtures/ifconfig/darwin_9_8_0 +26 -0
- data/spec/fixtures/ifconfig/darwin_9_8_0_en0 +6 -0
- data/spec/fixtures/ifconfig/darwin_ifconfig_all_with_multiple_interfaces +23 -0
- data/spec/fixtures/ifconfig/fedora_10 +36 -0
- data/spec/fixtures/ifconfig/fedora_10_eth0 +9 -0
- data/spec/fixtures/ifconfig/fedora_13 +18 -0
- data/spec/fixtures/ifconfig/fedora_13_eth0 +9 -0
- data/spec/fixtures/ifconfig/fedora_8 +38 -0
- data/spec/fixtures/ifconfig/fedora_8_eth0 +9 -0
- data/spec/fixtures/ifconfig/freebsd_6_0 +12 -0
- data/spec/fixtures/ifconfig/ifconfig_net_tools_1.60.txt +19 -0
- data/spec/fixtures/ifconfig/ifconfig_ubuntu_1204.txt +16 -0
- data/spec/fixtures/ifconfig/linux_ifconfig_all_with_multiple_interfaces +19 -0
- data/spec/fixtures/ifconfig/linux_ifconfig_no_addr +19 -0
- data/spec/fixtures/ifconfig/linux_ifconfig_no_mac +8 -0
- data/spec/fixtures/ifconfig/linux_ifconfig_venet +24 -0
- data/spec/fixtures/ifconfig/open_solaris_10 +12 -0
- data/spec/fixtures/ifconfig/open_solaris_b132 +20 -0
- data/spec/fixtures/ifconfig/sunos_ifconfig_all_with_multiple_interfaces +10 -0
- data/spec/fixtures/ifconfig/ubuntu_7_04 +38 -0
- data/spec/fixtures/ifconfig/ubuntu_7_04_eth0 +9 -0
- data/spec/fixtures/ldom/ldom_v1 +6 -0
- data/spec/fixtures/netstat/centos_5_5 +5 -0
- data/spec/fixtures/netstat/darwin_10_3_0 +35 -0
- data/spec/fixtures/netstat/darwin_10_6_4 +29 -0
- data/spec/fixtures/netstat/darwin_10_6_6_dualstack +34 -0
- data/spec/fixtures/netstat/darwin_9_8_0 +28 -0
- data/spec/fixtures/netstat/fedora_10 +7 -0
- data/spec/fixtures/netstat/open_solaris_10 +16 -0
- data/spec/fixtures/netstat/open_solaris_b132 +17 -0
- data/spec/fixtures/netstat/ubuntu_7_04 +7 -0
- data/spec/fixtures/processorcount/solaris-psrinfo +24 -0
- data/spec/fixtures/processorcount/solaris-sparc-kstat-cpu-info +1216 -0
- data/spec/fixtures/processorcount/solaris-x86_64-kstat-cpu-info +225 -0
- data/spec/fixtures/unit/filesystems/linux +28 -0
- data/spec/fixtures/unit/interfaces/ifconfig_net_tools_1.60.txt +19 -0
- data/spec/fixtures/unit/interfaces/ifconfig_net_tools_1.60.txt.em1 +10 -0
- data/spec/fixtures/unit/interfaces/ifconfig_net_tools_1.60.txt.lo +8 -0
- data/spec/fixtures/unit/ipaddress/ifconfig_multiple_127_addresses.txt +20 -0
- data/spec/fixtures/unit/ipaddress/ifconfig_net_tools_1.60.txt +19 -0
- data/spec/fixtures/unit/ipaddress/ifconfig_non_english_locale.txt +18 -0
- data/spec/fixtures/unit/ipaddress/ifconfig_ubuntu_1204.txt +16 -0
- data/spec/fixtures/unit/netmask/darwin_10_8_5.txt +30 -0
- data/spec/fixtures/unit/netmask/ifconfig_net_tools_1.60.txt +19 -0
- data/spec/fixtures/unit/netmask/ifconfig_ubuntu_1204.txt +16 -0
- data/spec/fixtures/unit/selinux/selinux_sestatus +6 -0
- data/spec/fixtures/unit/util/ec2/centos-arp-ec2.out +1 -0
- data/spec/fixtures/unit/util/ec2/linux-arp-ec2.out +1 -0
- data/spec/fixtures/unit/util/ec2/linux-arp-not-ec2.out +5 -0
- data/spec/fixtures/unit/util/ec2/solaris8_arp_a_not_ec2.out +7 -0
- data/spec/fixtures/unit/util/ec2/windows-2008-arp-a-not-ec2.out +6 -0
- data/spec/fixtures/unit/util/ec2/windows-2008-arp-a.out +10 -0
- data/spec/fixtures/unit/util/ip/6.0-STABLE_FreeBSD_ifconfig +12 -0
- data/spec/fixtures/unit/util/ip/Mac_OS_X_10.5.5_ifconfig +26 -0
- data/spec/fixtures/unit/util/ip/darwin_ifconfig_all_with_multiple_interfaces +10 -0
- data/spec/fixtures/unit/util/ip/darwin_ifconfig_single_interface +6 -0
- data/spec/fixtures/unit/util/ip/debian_kfreebsd_ifconfig +40 -0
- data/spec/fixtures/unit/util/ip/hpux_1111_ifconfig_lan0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1111_ifconfig_lan1 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1111_ifconfig_lo0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1111_lanscan +5 -0
- data/spec/fixtures/unit/util/ip/hpux_1111_netstat_in +4 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_ifconfig_lan0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_ifconfig_lan1 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_ifconfig_lo0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_lanscan +5 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_netstat_in +4 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_ifconfig_lan0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_ifconfig_lan1 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_ifconfig_lo0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_lanscan +4 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_netstat_in +4 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lan1 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lan4 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lan4_1 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lo0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_lanscan +9 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_netstat_in +6 -0
- data/spec/fixtures/unit/util/ip/linux_2_6_35_proc_net_bonding_bond0 +19 -0
- data/spec/fixtures/unit/util/ip/linux_get_single_interface_eth0 +10 -0
- data/spec/fixtures/unit/util/ip/linux_get_single_interface_ib0 +8 -0
- data/spec/fixtures/unit/util/ip/linux_get_single_interface_lo +9 -0
- data/spec/fixtures/unit/util/ip/linux_ifconfig_all_with_single_interface +18 -0
- data/spec/fixtures/unit/util/ip/linux_ifconfig_ib0 +8 -0
- data/spec/fixtures/unit/util/ip/solaris_ifconfig_all_with_multiple_interfaces +8 -0
- data/spec/fixtures/unit/util/ip/solaris_ifconfig_single_interface +3 -0
- data/spec/fixtures/unit/util/ip/windows_netsh_all_interfaces +12 -0
- data/spec/fixtures/unit/util/ip/windows_netsh_single_interface +7 -0
- data/spec/fixtures/unit/util/ip/windows_netsh_single_interface6 +18 -0
- data/spec/fixtures/unit/util/loader/nosuchfact.rb +1 -0
- data/spec/fixtures/unit/util/manufacturer/freebsd_dmidecode +42 -0
- data/spec/fixtures/unit/util/manufacturer/intel_linux_dmidecode +549 -0
- data/spec/fixtures/unit/util/manufacturer/linux_dmidecode_with_spaces +60 -0
- data/spec/fixtures/unit/util/manufacturer/opensolaris_smbios +33 -0
- data/spec/fixtures/unit/util/manufacturer/solaris_sunfire_v120_prtdiag +33 -0
- data/spec/fixtures/unit/util/manufacturer/solaris_t5220_prtdiag +136 -0
- data/spec/fixtures/unit/util/processor/solaris-i86pc +28 -0
- data/spec/fixtures/unit/util/processor/solaris-sun4u +151 -0
- data/spec/fixtures/unit/util/processor/x86-pentium2 +41 -0
- data/spec/fixtures/unit/util/uptime/kstat_boot_time +1 -0
- data/spec/fixtures/unit/util/uptime/sysctl_kern_boottime_darwin +1 -0
- data/spec/fixtures/unit/util/uptime/sysctl_kern_boottime_openbsd +1 -0
- data/spec/fixtures/unit/util/uptime/ubuntu_proc_uptime +1 -0
- data/spec/fixtures/unit/util/virtual/invalid_unicode_dmi_entries +0 -0
- data/spec/fixtures/unit/util/virtual/solaris10_proc_self_status1 +0 -0
- data/spec/fixtures/unit/util/vlans/linux_vlan_config +6 -0
- data/spec/fixtures/unit/util/xendomains/xendomains +4 -0
- data/spec/fixtures/unit/virtual/sysfs_dmi_entries_raw.txt +0 -0
- data/spec/fixtures/unit/zfs_version/freebsd_8.2 +14 -0
- data/spec/fixtures/unit/zfs_version/freebsd_9.0 +13 -0
- data/spec/fixtures/unit/zfs_version/linux-fuse_0.6.9 +14 -0
- data/spec/fixtures/unit/zfs_version/solaris_10 +10 -0
- data/spec/fixtures/unit/zfs_version/solaris_11 +12 -0
- data/spec/fixtures/unit/zpool_version/freebsd_8.2 +26 -0
- data/spec/fixtures/unit/zpool_version/freebsd_9.0 +38 -0
- data/spec/fixtures/unit/zpool_version/linux-fuse_0.6.9 +35 -0
- data/spec/fixtures/unit/zpool_version/solaris_10 +31 -0
- data/spec/fixtures/unit/zpool_version/solaris_11 +43 -0
- data/spec/fixtures/virtual/proc_self_status/vserver_2_1/guest +37 -0
- data/spec/fixtures/virtual/proc_self_status/vserver_2_1/host +36 -0
- data/spec/fixtures/virtual/proc_self_status/vserver_2_3/guest +39 -0
- data/spec/fixtures/virtual/proc_self_status/vserver_2_3/host +39 -0
- data/spec/integration/facter_spec.rb +39 -0
- data/spec/lib/facter_spec/cpuinfo.rb +15 -0
- data/spec/lib/facter_spec/windows_network.rb +64 -0
- data/spec/puppetlabs_spec/files.rb +57 -0
- data/spec/puppetlabs_spec/fixtures.rb +49 -0
- data/spec/puppetlabs_spec/matchers.rb +87 -0
- data/spec/puppetlabs_spec/verbose.rb +9 -0
- data/spec/puppetlabs_spec_helper.rb +26 -0
- data/spec/shared_contexts/platform.rb +55 -0
- data/spec/shared_formats/parses.rb +3 -0
- data/spec/spec_helper.rb +75 -0
- data/spec/unit/application_spec.rb +101 -0
- data/spec/unit/architecture_spec.rb +63 -0
- data/spec/unit/blockdevices_spec.rb +109 -0
- data/spec/unit/core/aggregate_spec.rb +125 -0
- data/spec/unit/core/directed_graph_spec.rb +79 -0
- data/spec/unit/core/execution/base_spec.rb +119 -0
- data/spec/unit/core/execution/posix_spec.rb +86 -0
- data/spec/unit/core/execution/windows_spec.rb +106 -0
- data/spec/unit/core/execution_spec.rb +37 -0
- data/spec/unit/core/logging_spec.rb +104 -0
- data/spec/unit/core/resolvable_spec.rb +81 -0
- data/spec/unit/core/suitable_spec.rb +96 -0
- data/spec/unit/domain_spec.rb +310 -0
- data/spec/unit/ec2_spec.rb +187 -0
- data/spec/unit/facter_spec.rb +108 -0
- data/spec/unit/filesystems_spec.rb +50 -0
- data/spec/unit/hardwareisa_spec.rb +41 -0
- data/spec/unit/hardwaremodel_spec.rb +56 -0
- data/spec/unit/hostname_spec.rb +40 -0
- data/spec/unit/id_spec.rb +29 -0
- data/spec/unit/interfaces_spec.rb +57 -0
- data/spec/unit/ipaddress6_spec.rb +161 -0
- data/spec/unit/ipaddress_spec.rb +114 -0
- data/spec/unit/kernel_spec.rb +24 -0
- data/spec/unit/kernelmajversion_spec.rb +17 -0
- data/spec/unit/kernelrelease_spec.rb +53 -0
- data/spec/unit/kernelversion_spec.rb +32 -0
- data/spec/unit/ldom_spec.rb +74 -0
- data/spec/unit/lsbdistcodename_spec.rb +25 -0
- data/spec/unit/lsbdistdescription_spec.rb +25 -0
- data/spec/unit/lsbdistid_spec.rb +25 -0
- data/spec/unit/lsbdistrelease_spec.rb +25 -0
- data/spec/unit/lsbmajdistrelease_spec.rb +13 -0
- data/spec/unit/lsbrelease_spec.rb +25 -0
- data/spec/unit/macaddress_spec.rb +61 -0
- data/spec/unit/manufacturer_spec.rb +115 -0
- data/spec/unit/memory_spec.rb +539 -0
- data/spec/unit/netmask_spec.rb +95 -0
- data/spec/unit/operatingsystem_spec.rb +141 -0
- data/spec/unit/operatingsystemmajrelease_spec.rb +16 -0
- data/spec/unit/operatingsystemrelease_spec.rb +226 -0
- data/spec/unit/physicalprocessorcount_spec.rb +76 -0
- data/spec/unit/processor_spec.rb +393 -0
- data/spec/unit/ps_spec.rb +42 -0
- data/spec/unit/selinux_spec.rb +114 -0
- data/spec/unit/ssh_spec.rb +77 -0
- data/spec/unit/uniqueid_spec.rb +27 -0
- data/spec/unit/uptime_spec.rb +110 -0
- data/spec/unit/util/collection_spec.rb +258 -0
- data/spec/unit/util/config_spec.rb +84 -0
- data/spec/unit/util/confine_spec.rb +148 -0
- data/spec/unit/util/directory_loader_spec.rb +88 -0
- data/spec/unit/util/ec2_spec.rb +180 -0
- data/spec/unit/util/fact_spec.rb +142 -0
- data/spec/unit/util/file_read_spec.rb +29 -0
- data/spec/unit/util/ip/windows_spec.rb +80 -0
- data/spec/unit/util/ip_spec.rb +463 -0
- data/spec/unit/util/loader_spec.rb +286 -0
- data/spec/unit/util/macaddress_spec.rb +141 -0
- data/spec/unit/util/macosx_spec.rb +113 -0
- data/spec/unit/util/manufacturer_spec.rb +179 -0
- data/spec/unit/util/normalization_spec.rb +113 -0
- data/spec/unit/util/parser_spec.rb +200 -0
- data/spec/unit/util/processor_spec.rb +92 -0
- data/spec/unit/util/registry_spec.rb +76 -0
- data/spec/unit/util/resolution_spec.rb +129 -0
- data/spec/unit/util/solaris_zones_spec.rb +127 -0
- data/spec/unit/util/uptime_spec.rb +126 -0
- data/spec/unit/util/values_spec.rb +131 -0
- data/spec/unit/util/virtual_spec.rb +294 -0
- data/spec/unit/util/vlans_spec.rb +12 -0
- data/spec/unit/util/wmi_spec.rb +19 -0
- data/spec/unit/util/xendomains_spec.rb +21 -0
- data/spec/unit/version_spec.rb +42 -0
- data/spec/unit/virtual_spec.rb +470 -0
- data/spec/unit/zfs_version_spec.rb +75 -0
- data/spec/unit/zonename_spec.rb +14 -0
- data/spec/unit/zones_spec.rb +55 -0
- data/spec/unit/zpool_version_spec.rb +75 -0
- data/spec/watchr.rb +125 -0
- metadata +674 -0
@@ -0,0 +1,8 @@
|
|
1
|
+
# This provides an alias for RbConfig to Config for versions of Ruby older then
|
2
|
+
# version 1.8.5. This allows us to use RbConfig in place of the older Config in
|
3
|
+
# our code and still be compatible with at least Ruby 1.8.1.
|
4
|
+
require 'rbconfig'
|
5
|
+
|
6
|
+
unless defined? ::RbConfig
|
7
|
+
::RbConfig = ::Config
|
8
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Facter::NetMask
|
2
|
+
def self.get_netmask
|
3
|
+
netmask = nil;
|
4
|
+
ipregex = %r{(\d{1,3}\.){3}\d{1,3}}
|
5
|
+
|
6
|
+
ops = nil
|
7
|
+
case Facter.value(:kernel)
|
8
|
+
when 'Linux'
|
9
|
+
ops = {
|
10
|
+
:ifconfig_opts => ['2>/dev/null'],
|
11
|
+
:regex => %r{#{Facter.value(:ipaddress)}.*?(?:Mask:|netmask)\s*(#{ipregex})}x,
|
12
|
+
:munge => nil,
|
13
|
+
}
|
14
|
+
when 'SunOS'
|
15
|
+
ops = {
|
16
|
+
:ifconfig_opts => ['-a'],
|
17
|
+
:regex => %r{\s+ inet \s #{Facter.value(:ipaddress)} \s netmask \s (\w{8})}x,
|
18
|
+
:munge => Proc.new { |mask| mask.scan(/../).collect do |byte| byte.to_i(16) end.join('.') }
|
19
|
+
}
|
20
|
+
when 'FreeBSD','NetBSD','OpenBSD', 'Darwin', 'GNU/kFreeBSD', 'DragonFly'
|
21
|
+
ops = {
|
22
|
+
:ifconfig_opts => ['-a'],
|
23
|
+
:regex => %r{\s+ inet \s #{Facter.value(:ipaddress)} \s netmask \s 0x(\w{8})}x,
|
24
|
+
:munge => Proc.new { |mask| mask.scan(/../).collect do |byte| byte.to_i(16) end.join('.') }
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
String(Facter::Util::IP.exec_ifconfig(ops[:ifconfig_opts])).split(/\n/).collect do |line|
|
29
|
+
matches = line.match(ops[:regex])
|
30
|
+
if !matches.nil?
|
31
|
+
if ops[:munge].nil?
|
32
|
+
netmask = matches[1]
|
33
|
+
else
|
34
|
+
netmask = ops[:munge].call(matches[1])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
netmask
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Facter
|
2
|
+
module Util
|
3
|
+
module Normalization
|
4
|
+
class NormalizationError < StandardError; end
|
5
|
+
|
6
|
+
VALID_TYPES = [Integer, Float, TrueClass, FalseClass, NilClass, String, Array, Hash]
|
7
|
+
|
8
|
+
module_function
|
9
|
+
|
10
|
+
# Recursively normalize the given data structure
|
11
|
+
#
|
12
|
+
# @api public
|
13
|
+
# @raise [NormalizationError] If the data structure contained an invalid element.
|
14
|
+
# @return [void]
|
15
|
+
def normalize(value)
|
16
|
+
case value
|
17
|
+
when Integer, Float, TrueClass, FalseClass, NilClass
|
18
|
+
value
|
19
|
+
when String
|
20
|
+
normalize_string(value)
|
21
|
+
when Array
|
22
|
+
normalize_array(value)
|
23
|
+
when Hash
|
24
|
+
normalize_hash(value)
|
25
|
+
else
|
26
|
+
raise NormalizationError, "Expected #{value} to be one of #{VALID_TYPES.inspect}, but was #{value.class}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# @!method normalize_string(value)
|
31
|
+
#
|
32
|
+
# Attempt to normalize and validate the given string.
|
33
|
+
#
|
34
|
+
# On Ruby 1.8 the string is checked by stripping out all non UTF-8
|
35
|
+
# characters and comparing the converted string to the original. If they
|
36
|
+
# do not match then the string is considered invalid.
|
37
|
+
#
|
38
|
+
# On Ruby 1.9+, the string is validate by checking that the string encoding
|
39
|
+
# is UTF-8 and that the string content matches the encoding. If the string
|
40
|
+
# is not an expected encoding then it is converted to UTF-8.
|
41
|
+
#
|
42
|
+
# @api public
|
43
|
+
# @raise [NormalizationError] If the string used an unsupported encoding or did not match its encoding
|
44
|
+
# @param value [String]
|
45
|
+
# @return [void]
|
46
|
+
|
47
|
+
if RUBY_VERSION =~ /^1\.8/
|
48
|
+
require 'iconv'
|
49
|
+
|
50
|
+
def normalize_string(value)
|
51
|
+
converted = Iconv.conv('UTF-8//IGNORE', 'UTF-8', value)
|
52
|
+
if converted != value
|
53
|
+
raise NormalizationError, "String #{value.inspect} is not valid UTF-8"
|
54
|
+
end
|
55
|
+
value
|
56
|
+
end
|
57
|
+
else
|
58
|
+
def normalize_string(value)
|
59
|
+
value = value.encode(Encoding::UTF_8)
|
60
|
+
|
61
|
+
unless value.valid_encoding?
|
62
|
+
raise NormalizationError, "String #{value.inspect} doesn't match the reported encoding #{value.encoding}"
|
63
|
+
end
|
64
|
+
|
65
|
+
value
|
66
|
+
rescue EncodingError
|
67
|
+
raise NormalizationError, "String encoding #{value.encoding} is not UTF-8 and could not be converted to UTF-8"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Validate all elements of the array.
|
72
|
+
#
|
73
|
+
# @api public
|
74
|
+
# @raise [NormalizationError] If one of the elements failed validation
|
75
|
+
# @param value [Array]
|
76
|
+
# @return [void]
|
77
|
+
def normalize_array(value)
|
78
|
+
value.collect do |elem|
|
79
|
+
normalize(elem)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Validate all keys and values of the hash.
|
84
|
+
#
|
85
|
+
# @api public
|
86
|
+
# @raise [NormalizationError] If one of the keys or values failed normalization
|
87
|
+
# @param value [Hash]
|
88
|
+
# @return [void]
|
89
|
+
def normalize_hash(value)
|
90
|
+
Hash[value.collect { |k, v| [ normalize(k), normalize(v) ] } ]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
# This class acts as the factory and parent class for parsed
|
2
|
+
# facts such as scripts, text, json and yaml files.
|
3
|
+
#
|
4
|
+
# Parsers must subclass this class and provide their own #results method.
|
5
|
+
require 'facter'
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
module Facter::Util::Parser
|
9
|
+
@parsers = []
|
10
|
+
|
11
|
+
# For support mutliple extensions you can pass an array of extensions as
|
12
|
+
# +ext+.
|
13
|
+
def self.extension_matches?(filename, ext)
|
14
|
+
extension = case ext
|
15
|
+
when String
|
16
|
+
ext.downcase
|
17
|
+
when Enumerable
|
18
|
+
ext.collect {|x| x.downcase }
|
19
|
+
end
|
20
|
+
[extension].flatten.to_a.include?(file_extension(filename).downcase)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.file_extension(filename)
|
24
|
+
File.extname(filename).sub(".", '')
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.register(klass, &suitable)
|
28
|
+
@parsers << [klass, suitable]
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.parser_for(filename)
|
32
|
+
registration = @parsers.detect { |k| k[1].call(filename) }
|
33
|
+
|
34
|
+
if registration.nil?
|
35
|
+
NothingParser.new
|
36
|
+
else
|
37
|
+
registration[0].new(filename)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class Base
|
42
|
+
attr_reader :filename
|
43
|
+
|
44
|
+
def initialize(filename, content = nil)
|
45
|
+
@filename = filename
|
46
|
+
@content = content
|
47
|
+
end
|
48
|
+
|
49
|
+
def content
|
50
|
+
@content ||= File.read(filename)
|
51
|
+
end
|
52
|
+
|
53
|
+
# results on the base class is really meant to be just an exception handler
|
54
|
+
# wrapper.
|
55
|
+
def results
|
56
|
+
parse_results
|
57
|
+
rescue Exception => detail
|
58
|
+
Facter.log_exception(detail, "Failed to handle #{filename} as #{self.class} facts: #{detail.message}")
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
|
62
|
+
def parse_results
|
63
|
+
raise ArgumentError, "Subclasses must respond to parse_results"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
module KeyValuePairOutputFormat
|
68
|
+
def self.parse(output)
|
69
|
+
return {} if output.nil?
|
70
|
+
|
71
|
+
result = {}
|
72
|
+
re = /^(.+?)=(.+)$/
|
73
|
+
output.each_line do |line|
|
74
|
+
if match_data = re.match(line.chomp)
|
75
|
+
result[match_data[1]] = match_data[2]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
result
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class YamlParser < Base
|
83
|
+
def parse_results
|
84
|
+
YAML.load(content)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
register(YamlParser) do |filename|
|
89
|
+
extension_matches?(filename, "yaml")
|
90
|
+
end
|
91
|
+
|
92
|
+
class TextParser < Base
|
93
|
+
def parse_results
|
94
|
+
KeyValuePairOutputFormat.parse content
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
register(TextParser) do |filename|
|
99
|
+
extension_matches?(filename, "txt")
|
100
|
+
end
|
101
|
+
|
102
|
+
class JsonParser < Base
|
103
|
+
def parse_results
|
104
|
+
if Facter.json?
|
105
|
+
JSON.load(content)
|
106
|
+
else
|
107
|
+
Facter.warnonce "Cannot parse JSON data file #{filename} without the json library."
|
108
|
+
Facter.warnonce "Suggested next step is `gem install json` to install the json library."
|
109
|
+
nil
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
register(JsonParser) do |filename|
|
115
|
+
extension_matches?(filename, "json")
|
116
|
+
end
|
117
|
+
|
118
|
+
class ScriptParser < Base
|
119
|
+
def parse_results
|
120
|
+
KeyValuePairOutputFormat.parse Facter::Core::Execution.exec(quote(filename))
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def quote(filename)
|
126
|
+
filename.index(' ') ? "\"#{filename}\"" : filename
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
register(ScriptParser) do |filename|
|
131
|
+
if Facter::Util::Config.is_windows?
|
132
|
+
extension_matches?(filename, %w{bat cmd com exe}) && File.file?(filename)
|
133
|
+
else
|
134
|
+
File.executable?(filename) && File.file?(filename) && ! extension_matches?(filename, %w{bat cmd com exe})
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# Executes and parses the key value output of Powershell scripts
|
139
|
+
class PowershellParser < Base
|
140
|
+
# Returns a hash of facts from powershell output
|
141
|
+
def parse_results
|
142
|
+
shell_command = "powershell -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -File \"#{filename}\""
|
143
|
+
KeyValuePairOutputFormat.parse Facter::Core::Execution.exec(shell_command)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
register(PowershellParser) do |filename|
|
148
|
+
Facter::Util::Config.is_windows? && extension_matches?(filename, "ps1") && File.file?(filename)
|
149
|
+
end
|
150
|
+
|
151
|
+
# A parser that is used when there is no other parser that can handle the file
|
152
|
+
# The return from results indicates to the caller the file was not parsed correctly.
|
153
|
+
class NothingParser
|
154
|
+
def results
|
155
|
+
nil
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#--
|
2
|
+
##############################################################
|
3
|
+
# Copyright 2006, Ben Bleything <ben@bleything.net> and #
|
4
|
+
# Patrick May <patrick@hexane.org> #
|
5
|
+
# #
|
6
|
+
# Distributed under the MIT license. #
|
7
|
+
##############################################################
|
8
|
+
#++
|
9
|
+
# = Plist
|
10
|
+
#
|
11
|
+
# This is the main file for plist. Everything interesting happens in Plist and Plist::Emit.
|
12
|
+
|
13
|
+
require 'base64'
|
14
|
+
require 'cgi'
|
15
|
+
require 'stringio'
|
16
|
+
|
17
|
+
require 'facter/util/plist/generator'
|
18
|
+
require 'facter/util/plist/parser'
|
19
|
+
|
20
|
+
module Plist
|
21
|
+
VERSION = '3.0.0'
|
22
|
+
end
|
23
|
+
|
24
|
+
# $Id: plist.rb 1781 2006-10-16 01:01:35Z luke $
|
@@ -0,0 +1,228 @@
|
|
1
|
+
#--###########################################################
|
2
|
+
# Copyright 2006, Ben Bleything <ben@bleything.net> and #
|
3
|
+
# Patrick May <patrick@hexane.org> #
|
4
|
+
# #
|
5
|
+
# Distributed under the MIT license. #
|
6
|
+
##############################################################
|
7
|
+
#++
|
8
|
+
# See Plist::Emit.
|
9
|
+
module Plist
|
10
|
+
# === Create a plist
|
11
|
+
# You can dump an object to a plist in one of two ways:
|
12
|
+
#
|
13
|
+
# * <tt>Plist::Emit.dump(obj)</tt>
|
14
|
+
# * <tt>obj.to_plist</tt>
|
15
|
+
# * This requires that you mixin the <tt>Plist::Emit</tt> module, which is already done for +Array+ and +Hash+.
|
16
|
+
#
|
17
|
+
# The following Ruby classes are converted into native plist types:
|
18
|
+
# Array, Bignum, Date, DateTime, Fixnum, Float, Hash, Integer, String, Symbol, Time, true, false
|
19
|
+
# * +Array+ and +Hash+ are both recursive; their elements will be converted into plist nodes inside the <array> and <dict> containers (respectively).
|
20
|
+
# * +IO+ (and its descendants) and +StringIO+ objects are read from and their contents placed in a <data> element.
|
21
|
+
# * User classes may implement +to_plist_node+ to dictate how they should be serialized; otherwise the object will be passed to <tt>Marshal.dump</tt> and the result placed in a <data> element.
|
22
|
+
#
|
23
|
+
# For detailed usage instructions, refer to USAGE[link:files/docs/USAGE.html] and the methods documented below.
|
24
|
+
module Emit
|
25
|
+
# Helper method for injecting into classes. Calls <tt>Plist::Emit.dump</tt> with +self+.
|
26
|
+
def to_plist(envelope = true)
|
27
|
+
return Plist::Emit.dump(self, envelope)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Helper method for injecting into classes. Calls <tt>Plist::Emit.save_plist</tt> with +self+.
|
31
|
+
def save_plist(filename)
|
32
|
+
Plist::Emit.save_plist(self, filename)
|
33
|
+
end
|
34
|
+
|
35
|
+
# The following Ruby classes are converted into native plist types:
|
36
|
+
# Array, Bignum, Date, DateTime, Fixnum, Float, Hash, Integer, String, Symbol, Time
|
37
|
+
#
|
38
|
+
# Write us (via RubyForge) if you think another class can be coerced safely into one of the expected plist classes.
|
39
|
+
#
|
40
|
+
# +IO+ and +StringIO+ objects are encoded and placed in <data> elements; other objects are <tt>Marshal.dump</tt>'ed unless they implement +to_plist_node+.
|
41
|
+
#
|
42
|
+
# The +envelope+ parameters dictates whether or not the resultant plist fragment is wrapped in the normal XML/plist header and footer. Set it to false if you only want the fragment.
|
43
|
+
def self.dump(obj, envelope = true)
|
44
|
+
output = plist_node(obj)
|
45
|
+
|
46
|
+
output = wrap(output) if envelope
|
47
|
+
|
48
|
+
return output
|
49
|
+
end
|
50
|
+
|
51
|
+
# Writes the serialized object's plist to the specified filename.
|
52
|
+
def self.save_plist(obj, filename)
|
53
|
+
File.open(filename, 'wb') do |f|
|
54
|
+
f.write(Plist::Emit.dump(obj))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def self.plist_node(element)
|
60
|
+
output = ''
|
61
|
+
|
62
|
+
if element.respond_to? :to_plist_node
|
63
|
+
output << element.to_plist_node
|
64
|
+
else
|
65
|
+
case element
|
66
|
+
when Array
|
67
|
+
if element.empty?
|
68
|
+
output << "<array/>\n"
|
69
|
+
else
|
70
|
+
output << tag('array') {
|
71
|
+
element.collect {|e| plist_node(e)}
|
72
|
+
}
|
73
|
+
end
|
74
|
+
when Hash
|
75
|
+
if element.empty?
|
76
|
+
output << "<dict/>\n"
|
77
|
+
else
|
78
|
+
inner_tags = []
|
79
|
+
|
80
|
+
element.keys.sort.each do |k|
|
81
|
+
v = element[k]
|
82
|
+
inner_tags << tag('key', CGI::escapeHTML(k.to_s))
|
83
|
+
inner_tags << plist_node(v)
|
84
|
+
end
|
85
|
+
|
86
|
+
output << tag('dict') {
|
87
|
+
inner_tags
|
88
|
+
}
|
89
|
+
end
|
90
|
+
when true, false
|
91
|
+
output << "<#{element}/>\n"
|
92
|
+
when Time
|
93
|
+
output << tag('date', element.utc.strftime('%Y-%m-%dT%H:%M:%SZ'))
|
94
|
+
when Date # also catches DateTime
|
95
|
+
output << tag('date', element.strftime('%Y-%m-%dT%H:%M:%SZ'))
|
96
|
+
when String, Symbol, Fixnum, Bignum, Integer, Float
|
97
|
+
output << tag(element_type(element), CGI::escapeHTML(element.to_s))
|
98
|
+
when IO, StringIO
|
99
|
+
element.rewind
|
100
|
+
contents = element.read
|
101
|
+
# note that apple plists are wrapped at a different length then
|
102
|
+
# what ruby's base64 wraps by default.
|
103
|
+
# I used #encode64 instead of #b64encode (which allows a length arg)
|
104
|
+
# because b64encode is b0rked and ignores the length arg.
|
105
|
+
data = "\n"
|
106
|
+
Base64::encode64(contents).gsub(/\s+/, '').scan(/.{1,68}/o) { data << $& << "\n" }
|
107
|
+
output << tag('data', data)
|
108
|
+
else
|
109
|
+
output << comment( 'The <data> element below contains a Ruby object which has been serialized with Marshal.dump.' )
|
110
|
+
data = "\n"
|
111
|
+
Base64::encode64(Marshal.dump(element)).gsub(/\s+/, '').scan(/.{1,68}/o) { data << $& << "\n" }
|
112
|
+
output << tag('data', data )
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
return output
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.comment(content)
|
120
|
+
return "<!-- #{content} -->\n"
|
121
|
+
end
|
122
|
+
|
123
|
+
def self.tag(type, contents = '', &block)
|
124
|
+
out = nil
|
125
|
+
|
126
|
+
if block_given?
|
127
|
+
out = IndentedString.new
|
128
|
+
out << "<#{type}>"
|
129
|
+
out.raise_indent
|
130
|
+
|
131
|
+
out << block.call
|
132
|
+
|
133
|
+
out.lower_indent
|
134
|
+
out << "</#{type}>"
|
135
|
+
else
|
136
|
+
out = "<#{type}>#{contents.to_s}</#{type}>\n"
|
137
|
+
end
|
138
|
+
|
139
|
+
return out.to_s
|
140
|
+
end
|
141
|
+
|
142
|
+
def self.wrap(contents)
|
143
|
+
output = ''
|
144
|
+
|
145
|
+
output << '<?xml version="1.0" encoding="UTF-8"?>' + "\n"
|
146
|
+
output << '<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' + "\n"
|
147
|
+
output << '<plist version="1.0">' + "\n"
|
148
|
+
|
149
|
+
output << contents
|
150
|
+
|
151
|
+
output << '</plist>' + "\n"
|
152
|
+
|
153
|
+
return output
|
154
|
+
end
|
155
|
+
|
156
|
+
def self.element_type(item)
|
157
|
+
return case item
|
158
|
+
when String, Symbol; 'string'
|
159
|
+
when Fixnum, Bignum, Integer; 'integer'
|
160
|
+
when Float; 'real'
|
161
|
+
else
|
162
|
+
raise "Don't know about this data type... something must be wrong!"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
private
|
167
|
+
|
168
|
+
class IndentedString #:nodoc:
|
169
|
+
attr_accessor :indent_string
|
170
|
+
|
171
|
+
@@indent_level = 0
|
172
|
+
|
173
|
+
def initialize(str = "\t")
|
174
|
+
@indent_string = str
|
175
|
+
@contents = ''
|
176
|
+
end
|
177
|
+
|
178
|
+
def to_s
|
179
|
+
return @contents
|
180
|
+
end
|
181
|
+
|
182
|
+
def raise_indent
|
183
|
+
@@indent_level += 1
|
184
|
+
end
|
185
|
+
|
186
|
+
def lower_indent
|
187
|
+
@@indent_level -= 1 if @@indent_level > 0
|
188
|
+
end
|
189
|
+
|
190
|
+
def <<(val)
|
191
|
+
if val.is_a? Array
|
192
|
+
val.each do |f|
|
193
|
+
self << f
|
194
|
+
end
|
195
|
+
else
|
196
|
+
# if it's already indented, don't bother indenting further
|
197
|
+
unless val =~ /\A#{@indent_string}/
|
198
|
+
indent = @indent_string * @@indent_level
|
199
|
+
|
200
|
+
@contents << val.gsub(/^/, indent)
|
201
|
+
else
|
202
|
+
@contents << val
|
203
|
+
end
|
204
|
+
|
205
|
+
# it already has a newline, don't add another
|
206
|
+
@contents << "\n" unless val =~ /\n$/
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
# we need to add this so sorting hash keys works properly
|
214
|
+
class Symbol #:nodoc:
|
215
|
+
def <=> (other)
|
216
|
+
self.to_s <=> other.to_s
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
class Array #:nodoc:
|
221
|
+
include Plist::Emit
|
222
|
+
end
|
223
|
+
|
224
|
+
class Hash #:nodoc:
|
225
|
+
include Plist::Emit
|
226
|
+
end
|
227
|
+
|
228
|
+
# $Id: generator.rb 1781 2006-10-16 01:01:35Z luke $
|