line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# $Id: Config.pm,v 1.18 2008/03/03 16:55:04 asc Exp $ |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
package Net::Delicious::Config; |
4
|
|
|
|
|
|
|
$Net::Delicious::Config::VERSION = '1.14'; |
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
=head1 NAME |
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
Net::Delicious::Config - config handler for Net::Delicious. |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
=head2 SYNOPSIS |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
Config handler for Net::Delicious. |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
=head1 DESCRIPTION |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
Internally, Net::Delicious uses an "ini" style Config::Simple object to keep track of its |
17
|
|
|
|
|
|
|
various settings. These include user credentials, endpoints as well as API request and |
18
|
|
|
|
|
|
|
response parameters. |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
While there is no expectation that a user will ever need to change anything than their basic |
21
|
|
|
|
|
|
|
login information, it is possible to override any of the default configuration options. If, you |
22
|
|
|
|
|
|
|
know, you're in to that kind of thing. |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
The only caveat is that in order to override default configuaration for request and response |
25
|
|
|
|
|
|
|
properties you will need to pass the Net::Delicious object constructor a Config::Simple object |
26
|
|
|
|
|
|
|
or the path to a valid "ini" style config file. (Arguments passed to the constructor as a hash |
27
|
|
|
|
|
|
|
reference are assumed to be part of the default B configs.) |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
It is important to remember that these config options, and definitions, are not meant to be a |
30
|
|
|
|
|
|
|
complete web services description nor do they play one on TV. They are some bare-bones glue |
31
|
|
|
|
|
|
|
to allow users the ability to define their own settings in the event that this package falls out |
32
|
|
|
|
|
|
|
of sync with the API or they've dreampt up some wacky project that uses Net::Delicious. |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
=cut |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
=head1 DEFAULT CONFIGS |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
These are outlined in the POD for the L object constructor. They |
39
|
|
|
|
|
|
|
are basically anything define in the B<[delicious]> block. |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
Default API response configs are defined in Net::Delicious::Constants::Config::DELICIOUS_CFG_STD. |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
=cut |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
=head1 API CALL CONFIGS |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
API call configs are the set of allowable parameters that may be sent to del.icio.us |
48
|
|
|
|
|
|
|
with a given method call along with flags to indicate whether an argument is required |
49
|
|
|
|
|
|
|
or needs some special magic DWIM munging. |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
The basic syntax for block names is the string B, the lower-case name of the |
52
|
|
|
|
|
|
|
API class (posts, user, etc.) followed by the lower-case name of the method all joined by |
53
|
|
|
|
|
|
|
underbars. |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
The basic syntax for block arguments is the name of the API parameter followed by a single |
56
|
|
|
|
|
|
|
string containing multiple options separated by semi-colons. As of this writing, there aren't |
57
|
|
|
|
|
|
|
very many options. The first is the string B if (drumroll) the parameter is required. |
58
|
|
|
|
|
|
|
The only other recognized option is the string B which will tell the argument parser to |
59
|
|
|
|
|
|
|
DWIM if the user passes boolean true or false. |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
For example : |
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
[delicious_posts_add] |
64
|
|
|
|
|
|
|
url="required" |
65
|
|
|
|
|
|
|
description="" |
66
|
|
|
|
|
|
|
extended="" |
67
|
|
|
|
|
|
|
tags="" |
68
|
|
|
|
|
|
|
dt="" |
69
|
|
|
|
|
|
|
shared=";no" |
70
|
|
|
|
|
|
|
replace=";no" |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
If a method class is nested, the syntax requires that all B> strings be replaced by underbars. |
73
|
|
|
|
|
|
|
For example B is defined as : |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
[delicious_tags_bundles_set] |
76
|
|
|
|
|
|
|
bundle="required" |
77
|
|
|
|
|
|
|
tags="required" |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
Default API response configs are defined in Net::Delicious::Constants::Config::DELICIOUS_CFG_API. |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
=cut |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=head1 API RESPONSE CONFIGS |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
API response configs define the properties that are expected to be returned in a given |
86
|
|
|
|
|
|
|
method call and mapped to object methods. |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
As of this writings, all properites are defined in the B block. |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
The basic syntax for block arguments is the lower-case name of the Net::Delicious object class |
91
|
|
|
|
|
|
|
followed by a comma-separated list of properties/methods. Unless already defined in their parent |
92
|
|
|
|
|
|
|
package, "get" methods for each property will be automagically created. |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
[delicious_properties] |
95
|
|
|
|
|
|
|
date="tag,date,count,user" |
96
|
|
|
|
|
|
|
post="description,extended,href,time,parent,tag,others,shared" |
97
|
|
|
|
|
|
|
bundle="name,tag" |
98
|
|
|
|
|
|
|
user="name" |
99
|
|
|
|
|
|
|
subscriptions="user,tag" |
100
|
|
|
|
|
|
|
tag="tag,count" |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
Default API response configs are defined in Net::Delicious::Constants::Config::DELICIOUS_CFG_PROPERTIES. |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
=cut |
105
|
|
|
|
|
|
|
|
106
|
1
|
|
|
1
|
|
1137
|
use Config::Simple; |
|
1
|
|
|
|
|
18732
|
|
|
1
|
|
|
|
|
97
|
|
107
|
1
|
|
|
1
|
|
51
|
use Net::Delicious::Constants qw (:config); |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
12
|
|
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
sub mk_config { |
110
|
0
|
|
|
0
|
0
|
|
my $pkg = shift; |
111
|
0
|
|
|
|
|
|
my $args = shift; |
112
|
|
|
|
|
|
|
|
113
|
0
|
|
|
|
|
|
my $cfg = Config::Simple->new(syntax => "ini"); |
114
|
0
|
|
|
|
|
|
$cfg->set_block("delicious", $args); |
115
|
|
|
|
|
|
|
|
116
|
0
|
|
|
|
|
|
return $cfg; |
117
|
|
|
|
|
|
|
} |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
sub merge_configs { |
120
|
0
|
|
|
0
|
0
|
|
my $pkg = shift; |
121
|
0
|
|
|
|
|
|
my $cfg = shift; |
122
|
|
|
|
|
|
|
|
123
|
0
|
|
|
|
|
|
$pkg->merge_defaults($cfg, "delicious", {DELICIOUS_CFG_STD}); |
124
|
0
|
|
|
|
|
|
$pkg->merge_api_parameters($cfg); |
125
|
0
|
|
|
|
|
|
$pkg->merge_rsp_properties($cfg); |
126
|
|
|
|
|
|
|
|
127
|
0
|
|
|
|
|
|
return 1; |
128
|
|
|
|
|
|
|
} |
129
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
sub merge_rsp_properties { |
131
|
0
|
|
|
0
|
0
|
|
my $pkg = shift; |
132
|
0
|
|
|
|
|
|
my $cfg = shift; |
133
|
|
|
|
|
|
|
|
134
|
0
|
|
|
|
|
|
my $defaults = {DELICIOUS_CFG_PROPERTIES}; |
135
|
0
|
|
|
|
|
|
my $block = "delicious_properties"; |
136
|
|
|
|
|
|
|
|
137
|
0
|
|
|
|
|
|
$pkg->merge_defaults($cfg, $block, $defaults); |
138
|
0
|
|
|
|
|
|
return 1; |
139
|
|
|
|
|
|
|
} |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
sub merge_api_parameters { |
142
|
0
|
|
|
0
|
0
|
|
my $pkg = shift; |
143
|
0
|
|
|
|
|
|
my $cfg = shift; |
144
|
|
|
|
|
|
|
|
145
|
0
|
|
|
|
|
|
my $defaults = {DELICIOUS_CFG_API}; |
146
|
|
|
|
|
|
|
|
147
|
0
|
|
|
|
|
|
foreach my $class (keys %$defaults) { |
148
|
|
|
|
|
|
|
|
149
|
0
|
|
|
|
|
|
foreach my $meth (keys %{$defaults->{$class}}) { |
|
0
|
|
|
|
|
|
|
150
|
0
|
|
|
|
|
|
my $block = join("_", "delicious", $class, $meth); |
151
|
0
|
|
|
|
|
|
$pkg->merge_defaults($cfg, $block, $defaults->{$class}->{$meth}); |
152
|
|
|
|
|
|
|
} |
153
|
|
|
|
|
|
|
} |
154
|
|
|
|
|
|
|
|
155
|
0
|
|
|
|
|
|
return 1; |
156
|
|
|
|
|
|
|
} |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
sub merge_defaults { |
159
|
0
|
|
|
0
|
0
|
|
my $pkg = shift; |
160
|
0
|
|
|
|
|
|
my $cfg = shift; |
161
|
0
|
|
|
|
|
|
my $block = shift; |
162
|
0
|
|
|
|
|
|
my $defaults = shift; |
163
|
|
|
|
|
|
|
|
164
|
0
|
|
|
|
|
|
my $input = $cfg->param(-block => $block); |
165
|
|
|
|
|
|
|
|
166
|
0
|
|
|
|
|
|
foreach my $key (keys %$defaults) { |
167
|
|
|
|
|
|
|
|
168
|
0
|
|
|
|
|
|
my $dkey = join(".", $block, $key); |
169
|
|
|
|
|
|
|
|
170
|
0
|
0
|
|
|
|
|
if (! exists($input->{$key})) { |
171
|
0
|
|
|
|
|
|
$cfg->param($dkey, $defaults->{$key}); |
172
|
|
|
|
|
|
|
} |
173
|
|
|
|
|
|
|
} |
174
|
|
|
|
|
|
|
|
175
|
0
|
|
|
|
|
|
return 1; |
176
|
|
|
|
|
|
|
} |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
=head1 VERSION |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
1.13 |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
=head1 DATE |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
$Date: 2008/03/03 16:55:04 $ |
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
=head1 AUTHOR |
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
Aaron Straup Cope Eascope@cpan.orgE |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
=head1 LICENSE |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
Copyright (c) 2004-2008 Aaron Straup Cope. All rights reserved. |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
This is free software, you may use it and distribute it under the |
195
|
|
|
|
|
|
|
same terms as Perl itself. |
196
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
=cut |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
return 1; |