cfplist 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.clang-format +149 -0
- data/.gitignore +18 -0
- data/.rspec +3 -0
- data/.rubocop.yml +99 -0
- data/.ruby-version +1 -0
- data/.simplecov +5 -0
- data/.travis.yml +6 -0
- data/CHANGELOG +0 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +20 -0
- data/Gemfile.lock +78 -0
- data/LICENSE.txt +21 -0
- data/README.md +97 -0
- data/Rakefile +16 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/cfplist.gemspec +32 -0
- data/compile_commands.json +30 -0
- data/ext/cfplist/cfplist.c +718 -0
- data/ext/cfplist/extconf.rb +26 -0
- data/lib/cfplist.rb +104 -0
- data/lib/cfplist/version.rb +5 -0
- metadata +71 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mkmf"
|
4
|
+
require "rbconfig"
|
5
|
+
|
6
|
+
# Force clang compilation
|
7
|
+
RbConfig::CONFIG["SDKROOT"] = %x(xcrun --sdk macosx --show-sdk-path)
|
8
|
+
RbConfig::MAKEFILE_CONFIG["CC"] = "clang"
|
9
|
+
RbConfig::MAKEFILE_CONFIG["CXX"] = "clang++"
|
10
|
+
|
11
|
+
def ensure_framework(framework)
|
12
|
+
have_framework(framework) || raise("#{framework} framework not found!")
|
13
|
+
have_header("#{framework}/#{framework}.h") || raise("Could not find #{framework}.h!")
|
14
|
+
end
|
15
|
+
|
16
|
+
def ensure_frameworks(*frameworks)
|
17
|
+
frameworks.each do |framework|
|
18
|
+
ensure_framework(framework)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
ensure_framework "CoreFoundation"
|
23
|
+
|
24
|
+
dir_config "cfplist"
|
25
|
+
|
26
|
+
create_makefile("cfplist/cfplist")
|
data/lib/cfplist.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cfplist/version"
|
4
|
+
require "cfplist/cfplist"
|
5
|
+
|
6
|
+
# Main CFPlist Module.
|
7
|
+
module CFPlist
|
8
|
+
class << self
|
9
|
+
def [](object, opts = {})
|
10
|
+
if object.respond_to? :to_str
|
11
|
+
CFPlist.parse(object.to_str, opts)
|
12
|
+
else
|
13
|
+
CFPlist.generate(object, opts)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module_function
|
19
|
+
|
20
|
+
def parse(data, opts = {})
|
21
|
+
symbolize_keys = opts.fetch(:symbolize_keys, false)
|
22
|
+
_parse(data, symbolize_keys)
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate(obj, opts = {})
|
26
|
+
_generate(obj, opts)
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self
|
30
|
+
# Default options for {#load}.
|
31
|
+
# Initially:
|
32
|
+
# opts = CFPlist.load_default_options
|
33
|
+
# opts # => {:symbolize_keys => false}
|
34
|
+
# @return [Hash{Symbol => Boolean}]
|
35
|
+
attr_accessor :load_default_options
|
36
|
+
end
|
37
|
+
self.load_default_options = {
|
38
|
+
symbolize_keys: false
|
39
|
+
}
|
40
|
+
|
41
|
+
def load(source, proc = nil, options = {})
|
42
|
+
opts = load_default_options.merge(options)
|
43
|
+
if source.respond_to?(:to_str)
|
44
|
+
source = source.to_str
|
45
|
+
elsif source.respond_to?(:to_io)
|
46
|
+
source = source.to_io.read
|
47
|
+
elsif source.respond_to?(:read)
|
48
|
+
source = source.read
|
49
|
+
end
|
50
|
+
|
51
|
+
result = parse(source, opts)
|
52
|
+
recurse_proc(result, &proc) if proc
|
53
|
+
result
|
54
|
+
end
|
55
|
+
|
56
|
+
# Recursively calls passed _Proc_ if the parsed data structure is an _Array_
|
57
|
+
# or a _Hash_.
|
58
|
+
def recurse_proc(result, &proc) # :nodoc:
|
59
|
+
case result
|
60
|
+
when Array
|
61
|
+
result.each { |x| recurse_proc(x, &proc) }
|
62
|
+
proc.call(result)
|
63
|
+
when Hash
|
64
|
+
result.each { |_k, _v| recurse_proc(x, &proc); recurse_proc(y, &proc) }
|
65
|
+
proc.call(result)
|
66
|
+
else
|
67
|
+
proc.call(result)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
alias restore load
|
72
|
+
module_function :restore
|
73
|
+
|
74
|
+
class << self
|
75
|
+
# Default options for {#parse}
|
76
|
+
# Initially:
|
77
|
+
# opts = CFPlist.dump_default_options
|
78
|
+
# opts # => {}
|
79
|
+
# @return [Hash{Symbol => Boolean}]
|
80
|
+
attr_accessor :dump_default_options
|
81
|
+
end
|
82
|
+
self.dump_default_options = {}
|
83
|
+
|
84
|
+
def dump(object, an_io = nil, limit = nil)
|
85
|
+
if an_io && limit.nil?
|
86
|
+
an_io = an_io.to_io if an_io.respond_to?(:to_io)
|
87
|
+
unless an_io.respond_to?(:write)
|
88
|
+
limit = an_io
|
89
|
+
an_io = nil
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
opts = CFPlist.dump_default_options
|
94
|
+
opts = opts.merge(max_nesting: limit) if limit
|
95
|
+
result = generate(object, opts)
|
96
|
+
|
97
|
+
if an_io
|
98
|
+
an_io.write(result)
|
99
|
+
an_io
|
100
|
+
else
|
101
|
+
result
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cfplist
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- J. Morgan Lieberthal
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-12-18 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Native bindings for CoreFoundation PropertyList files. Note that this
|
14
|
+
gem requires the CoreFoundation framework be present on the system, so it will only
|
15
|
+
work on macOS.
|
16
|
+
email:
|
17
|
+
- j.morgan.lieberthal@gmail.com
|
18
|
+
executables: []
|
19
|
+
extensions:
|
20
|
+
- ext/cfplist/extconf.rb
|
21
|
+
extra_rdoc_files: []
|
22
|
+
files:
|
23
|
+
- ".clang-format"
|
24
|
+
- ".gitignore"
|
25
|
+
- ".rspec"
|
26
|
+
- ".rubocop.yml"
|
27
|
+
- ".ruby-version"
|
28
|
+
- ".simplecov"
|
29
|
+
- ".travis.yml"
|
30
|
+
- CHANGELOG
|
31
|
+
- CODE_OF_CONDUCT.md
|
32
|
+
- Gemfile
|
33
|
+
- Gemfile.lock
|
34
|
+
- LICENSE.txt
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- bin/console
|
38
|
+
- bin/setup
|
39
|
+
- cfplist.gemspec
|
40
|
+
- compile_commands.json
|
41
|
+
- ext/cfplist/cfplist.c
|
42
|
+
- ext/cfplist/extconf.rb
|
43
|
+
- lib/cfplist.rb
|
44
|
+
- lib/cfplist/version.rb
|
45
|
+
homepage: https://github.com/baberthal/cfplist
|
46
|
+
licenses:
|
47
|
+
- MIT
|
48
|
+
metadata:
|
49
|
+
homepage_uri: https://github.com/baberthal/cfplist
|
50
|
+
source_code_uri: https://github.com/baberthal/cfplist
|
51
|
+
changelog_uri: https://github.com/baberthal/cfplist/blob/prime/CHANGELOG
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 2.6.0
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
requirements: []
|
67
|
+
rubygems_version: 3.1.4
|
68
|
+
signing_key:
|
69
|
+
specification_version: 4
|
70
|
+
summary: CoreFoundation PropertyList Native Bindings
|
71
|
+
test_files: []
|