davetron5000-gliffy 0.1.7 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +175 -48
- data/bin/gliffy +298 -22
- data/lib/gliffy.rb +4 -0
- data/lib/gliffy/credentials.rb +78 -0
- data/lib/gliffy/handle.rb +269 -290
- data/lib/gliffy/request.rb +101 -0
- data/lib/gliffy/response.rb +248 -91
- data/lib/gliffy/url.rb +133 -36
- metadata +21 -21
- data/lib/gliffy/account.rb +0 -55
- data/lib/gliffy/cli.rb +0 -144
- data/lib/gliffy/commands.rb +0 -6
- data/lib/gliffy/commands/delete.rb +0 -10
- data/lib/gliffy/commands/edit.rb +0 -19
- data/lib/gliffy/commands/get.rb +0 -46
- data/lib/gliffy/commands/list.rb +0 -27
- data/lib/gliffy/commands/new.rb +0 -25
- data/lib/gliffy/commands/url.rb +0 -21
- data/lib/gliffy/config.rb +0 -55
- data/lib/gliffy/diagram.rb +0 -100
- data/lib/gliffy/folder.rb +0 -63
- data/lib/gliffy/rest.rb +0 -110
- data/lib/gliffy/user.rb +0 -72
data/lib/gliffy/commands.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
desc 'Delete a diagram'
|
2
|
-
arg_name 'diagram_id [diagram_id]*'
|
3
|
-
command [:delete,:del,:rm] do |c|
|
4
|
-
c.action do |global_options,options,args|
|
5
|
-
raise UnknownArgumentException("diagram id is required") if args.length == 0;
|
6
|
-
args.each do |diagram_id|
|
7
|
-
$gliffy.delete_diagram(diagram_id)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
data/lib/gliffy/commands/edit.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
desc 'Edit a diagram'
|
2
|
-
arg_name 'diagram_id'
|
3
|
-
command :edit do |c|
|
4
|
-
|
5
|
-
c.action do |global_options,options,args|
|
6
|
-
|
7
|
-
raise(UnknownArgumentException,'You must specify one diagram id') if args.length != 1
|
8
|
-
|
9
|
-
return_link = $gliffy.get_diagram_as_url(args[0])
|
10
|
-
link = $gliffy.get_edit_diagram_link(args[0],return_link,"Done")
|
11
|
-
if Gliffy::CLIConfig.instance.config[:open_url]
|
12
|
-
system(sprintf(Gliffy::CLIConfig.instance.config[:open_url],link.full_url))
|
13
|
-
else
|
14
|
-
puts "Nothing configured for #{:open_url.to_s} to open the url"
|
15
|
-
puts link.full_url
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
data/lib/gliffy/commands/get.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
desc 'Download a diagram as an image to a file'
|
2
|
-
arg_name 'diagram_id [diagram_id]*'
|
3
|
-
command :get do |c|
|
4
|
-
|
5
|
-
c.desc 'Get a specific version number'
|
6
|
-
c.arg_name 'version_number'
|
7
|
-
c.default_value nil
|
8
|
-
c.flag [:v,:version]
|
9
|
-
|
10
|
-
c.desc 'Specify the filename'
|
11
|
-
c.arg_name 'filename'
|
12
|
-
c.default_value nil
|
13
|
-
c.flag [:f,:filename]
|
14
|
-
|
15
|
-
c.desc 'Specify the image type (one of jpeg, jpg, png, svg, xml)'
|
16
|
-
c.arg_name 'type'
|
17
|
-
c.default_value 'jpg'
|
18
|
-
c.flag [:t,:type,:"image-type"]
|
19
|
-
|
20
|
-
c.action do |global_options,options,args|
|
21
|
-
|
22
|
-
raise(UnknownArgumentException,'You must specify a diagram id') if args.length == 0
|
23
|
-
raise(MissingArgumentException,'You may not specify a filename when getting multiple diagrams') if args.length > 1 and options[:f]
|
24
|
-
args.each do |diagram_id|
|
25
|
-
|
26
|
-
version_number = options[:v]
|
27
|
-
filename = options[:f]
|
28
|
-
type = options[:t].to_sym
|
29
|
-
if !filename
|
30
|
-
dir = options['d'] || '.'
|
31
|
-
metadata = $gliffy.get_diagram_metadata(diagram_id)
|
32
|
-
filename = metadata.name.gsub(/[\s\/\-\+\$]/,'_')
|
33
|
-
if version_number
|
34
|
-
filename = "#{dir}/#{filename}_v#{version_number}.#{type.to_s}"
|
35
|
-
else
|
36
|
-
filename = "#{dir}/#{filename}.#{type.to_s}"
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
get_options = { :mime_type => type, :file => filename }
|
41
|
-
get_options[:version] = version_number if version_number
|
42
|
-
$gliffy.get_diagram_as_image(diagram_id,get_options)
|
43
|
-
puts filename
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
data/lib/gliffy/commands/list.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
desc 'List all diagrams in the account'
|
2
|
-
command [:list,:ls] do |c|
|
3
|
-
|
4
|
-
c.desc 'List long form'
|
5
|
-
c.switch :l
|
6
|
-
|
7
|
-
c.action do |global_options,options,args|
|
8
|
-
diagrams = $gliffy.get_diagrams
|
9
|
-
if options[:l]
|
10
|
-
max = diagrams.inject(0) { |max,diagram| diagram.name.length > max ? diagram.name.length : max }
|
11
|
-
diagrams.sort.each do |diagram|
|
12
|
-
printf "%8d %s %-#{max}s %-3d %s %s %s\n",
|
13
|
-
diagram.id,
|
14
|
-
diagram.is_public? ? "P" : "-",
|
15
|
-
diagram.name,
|
16
|
-
diagram.num_versions,
|
17
|
-
format_date(diagram.create_date),
|
18
|
-
format_date(diagram.mod_date),
|
19
|
-
diagram.owner_username
|
20
|
-
end
|
21
|
-
else
|
22
|
-
printf_string = "%d %s\n"
|
23
|
-
diagrams.sort.each { |diagram| printf printf_string,diagram.id,diagram.name }
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
data/lib/gliffy/commands/new.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
desc 'Create a new diagram'
|
2
|
-
arg_name 'new_diagram_name'
|
3
|
-
command [:new,:create] do |c|
|
4
|
-
c.desc 'use the given diagram_id as a template'
|
5
|
-
c.default_value nil
|
6
|
-
c.flag [:t,:template]
|
7
|
-
|
8
|
-
c.desc 'don\'t edit the new diagram'
|
9
|
-
c.switch [:n,:"no-edit"]
|
10
|
-
|
11
|
-
c.action do |global_options,options,args|
|
12
|
-
|
13
|
-
raise(UnknownArgumentException,'You must specify the diagram name') if args.length != 1
|
14
|
-
|
15
|
-
template_id = options[:t]
|
16
|
-
|
17
|
-
diagram = $gliffy.create_diagram(args[0],template_id)
|
18
|
-
if options[:n]
|
19
|
-
puts "Diagram #{diagram.name} created with id #{diagram.id}"
|
20
|
-
else
|
21
|
-
GLI.run(['edit',diagram.id.to_s])
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
data/lib/gliffy/commands/url.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
desc 'Get the URL for a diagram as an image image'
|
2
|
-
arg_name 'diagram_id'
|
3
|
-
command :url do |c|
|
4
|
-
c.desc 'Open URL with configured :open_url command'
|
5
|
-
c.switch [:o,:open]
|
6
|
-
c.action do |global_options,options,args|
|
7
|
-
raise UnknownArgumentException,"diagram id is required" if args.length == 0
|
8
|
-
raise UnknownArgumentException,"Only one diagram id is supported" if args.length > 1
|
9
|
-
url = $gliffy.get_diagram_as_url(args[0])
|
10
|
-
if options[:o]
|
11
|
-
if Gliffy::CLIConfig.instance.config[:open_image]
|
12
|
-
system(sprintf(Gliffy::CLIConfig.instance.config[:open_image],url))
|
13
|
-
else
|
14
|
-
puts "Nothing configured for #{:open_image.to_s} to open the image"
|
15
|
-
puts url
|
16
|
-
end
|
17
|
-
else
|
18
|
-
puts url
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/gliffy/config.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
require 'logger'
|
2
|
-
|
3
|
-
module Gliffy
|
4
|
-
|
5
|
-
# Global Configuration for Gliffy. This is a singleton currently and can be accessed
|
6
|
-
# via the config class method
|
7
|
-
#
|
8
|
-
# * You mostly need to set api_key, secret_key and account_name
|
9
|
-
# * You may wish to set protocol if you have a premium account and wish to use https
|
10
|
-
class Config
|
11
|
-
|
12
|
-
# A Logger level to control logging
|
13
|
-
attr_accessor :log_level
|
14
|
-
# The log device (as passed to Logger) for where log messages should go
|
15
|
-
attr_accessor :log_device
|
16
|
-
# The protocol, either 'http' or 'https' (though feel free to try 'gopher:' :)
|
17
|
-
attr_accessor :protocol
|
18
|
-
# The gliffy app root, which is pretty much www.gliffy.com/gliffy unless you know a secret
|
19
|
-
attr_accessor :gliffy_app_root
|
20
|
-
# The url relative to gliffy_app_root of where the API is accessed
|
21
|
-
attr_accessor :gliffy_rest_context
|
22
|
-
# Your API Key
|
23
|
-
attr_accessor :api_key
|
24
|
-
# Your Secret Key
|
25
|
-
attr_accessor :secret_key
|
26
|
-
# The name of your account
|
27
|
-
attr_accessor :account_name
|
28
|
-
|
29
|
-
@@instance=nil
|
30
|
-
|
31
|
-
def initialize
|
32
|
-
@log_level = Logger::DEBUG
|
33
|
-
@log_device = STDERR
|
34
|
-
@protocol = 'http'
|
35
|
-
@gliffy_app_root = 'www.gliffy.com/gliffy';
|
36
|
-
@gliffy_rest_context = 'rest'
|
37
|
-
@api_key = 'no api key specified'
|
38
|
-
@secret_key = 'no secret key specified'
|
39
|
-
@account_name = 'no account name specified'
|
40
|
-
end
|
41
|
-
|
42
|
-
# Returns the entire URL to the gliffy api root. This uses protocol, gliffy_app_root
|
43
|
-
# and gliffy_rest_context, so you should not really override this
|
44
|
-
def gliffy_root
|
45
|
-
"#{protocol}://#{gliffy_app_root}/#{gliffy_rest_context}"
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.config=(config); @@instance = config; end
|
49
|
-
def self.config
|
50
|
-
@@instance = Config.new if !@@instance
|
51
|
-
@@instance
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
data/lib/gliffy/diagram.rb
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
require 'rexml/document'
|
2
|
-
require 'array_has_response'
|
3
|
-
require 'gliffy/rest'
|
4
|
-
|
5
|
-
include REXML
|
6
|
-
|
7
|
-
module Gliffy
|
8
|
-
|
9
|
-
# A gliffy diagram (or, rather, the meta data about that diagram)
|
10
|
-
class Diagram < Response
|
11
|
-
|
12
|
-
attr_reader :id
|
13
|
-
attr_reader :num_versions
|
14
|
-
attr_reader :name
|
15
|
-
# The username of the proper owner of this diagram
|
16
|
-
attr_reader :owner_username
|
17
|
-
# A Time representing the date on which this diagram was created
|
18
|
-
attr_reader :create_date
|
19
|
-
# A Time representing the date on which this diagram was last modified
|
20
|
-
attr_reader :mod_date
|
21
|
-
# A Time representing the date on which this diagram was published,
|
22
|
-
# or nil if it was not published
|
23
|
-
attr_reader :published_date
|
24
|
-
|
25
|
-
def self.from_xml(element)
|
26
|
-
id = element.attributes['id'].to_i
|
27
|
-
num_versions = element.attributes['num-versions'].to_i
|
28
|
-
is_private = element.attributes['is-private'] == "true"
|
29
|
-
is_public = element.attributes['is-public'] == "true"
|
30
|
-
|
31
|
-
create_date = Time.at(element.elements['create-date'].text.to_i / 1000)
|
32
|
-
mod_date = Time.at(element.elements['mod-date'].text.to_i / 1000)
|
33
|
-
published_date = element.elements['published-date'] ? Time.at(element.elements['published-date'].text.to_i / 1000) : nil
|
34
|
-
name = element.elements['name'].text
|
35
|
-
owner_username = element.elements['owner'] ? element.elements['owner'].text : nil
|
36
|
-
|
37
|
-
Diagram.new(id,name,owner_username,is_public,is_private,num_versions,create_date,mod_date,published_date)
|
38
|
-
end
|
39
|
-
|
40
|
-
# True if this diagram is public
|
41
|
-
def is_public?
|
42
|
-
@is_public
|
43
|
-
end
|
44
|
-
|
45
|
-
# True if this diagram is private (and available only
|
46
|
-
# to the owner and account administrators)
|
47
|
-
def is_private?
|
48
|
-
@is_private
|
49
|
-
end
|
50
|
-
|
51
|
-
# sorts by diagram name
|
52
|
-
def <=>(other_diagram)
|
53
|
-
name <=> other_diagram.name
|
54
|
-
end
|
55
|
-
|
56
|
-
protected
|
57
|
-
def initialize(id,name,owner_username,is_public,is_private,num_versions,create_date,mod_date,published_date)
|
58
|
-
super()
|
59
|
-
@id = id
|
60
|
-
@name = name
|
61
|
-
@owner_username = owner_username
|
62
|
-
@is_public = is_public
|
63
|
-
@is_private = is_private
|
64
|
-
@num_versions = num_versions
|
65
|
-
@create_date = create_date
|
66
|
-
@mod_date = mod_date
|
67
|
-
@published_date = published_date
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
# A link to edit a specific gliffy diagram
|
73
|
-
class LaunchLink < Response
|
74
|
-
|
75
|
-
# The name of the diagram, which can helpful
|
76
|
-
# in creating HTML hyperlinks to url
|
77
|
-
attr_reader :diagram_name
|
78
|
-
attr_reader :url
|
79
|
-
|
80
|
-
def self.from_xml(element)
|
81
|
-
diagram_name = element.attributes['diagram-name']
|
82
|
-
url = element.text
|
83
|
-
LaunchLink.new(diagram_name,url)
|
84
|
-
end
|
85
|
-
|
86
|
-
def full_url
|
87
|
-
Gliffy::Config.config.protocol + "://" + Gliffy::Config.config.gliffy_app_root + url
|
88
|
-
end
|
89
|
-
|
90
|
-
protected
|
91
|
-
|
92
|
-
def initialize(name,url)
|
93
|
-
super()
|
94
|
-
@diagram_name = name
|
95
|
-
@url = url
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
class Diagrams < ArrayResponseParser; end
|
100
|
-
end
|
data/lib/gliffy/folder.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'rexml/document'
|
2
|
-
require 'array_has_response'
|
3
|
-
require 'gliffy/rest'
|
4
|
-
|
5
|
-
include REXML
|
6
|
-
|
7
|
-
module Gliffy
|
8
|
-
|
9
|
-
class Folders < ArrayResponseParser; end
|
10
|
-
|
11
|
-
class Folder < Response
|
12
|
-
|
13
|
-
# An array of Folder objects that are contained within this folder
|
14
|
-
# If this is empty, it means this Folder is a leaf
|
15
|
-
attr_reader :child_folders
|
16
|
-
attr_reader :id
|
17
|
-
attr_reader :name
|
18
|
-
# The full path to this folder within the account's
|
19
|
-
# folder hierarchy
|
20
|
-
attr_reader :path
|
21
|
-
|
22
|
-
def self.from_xml(element)
|
23
|
-
id = element.attributes['id'].to_i
|
24
|
-
default = element.attributes['is-default'] == "true"
|
25
|
-
name = element.elements['name'].text
|
26
|
-
path = element.elements['path'].text
|
27
|
-
child_folders = Array.new
|
28
|
-
element.each_element do |element|
|
29
|
-
child_folders << Folder.from_xml(element) if element.name == "folder"
|
30
|
-
end
|
31
|
-
Folder.new(id,name,default,path,child_folders)
|
32
|
-
end
|
33
|
-
|
34
|
-
# Returns true if this folder is the default folder
|
35
|
-
# used when an operation requiring a folder
|
36
|
-
# doesn't specify one (such as when creating a new
|
37
|
-
# diagram)
|
38
|
-
def default?
|
39
|
-
@default
|
40
|
-
end
|
41
|
-
|
42
|
-
# Encodes the elements of a folder path so it can safely go into a URL
|
43
|
-
def self.encode_path_elements(folder_path)
|
44
|
-
encoded = ''
|
45
|
-
folder_path.split(/\//).each do |part|
|
46
|
-
encoded += CGI::escape(part)
|
47
|
-
encoded += "/"
|
48
|
-
end
|
49
|
-
encoded.gsub(/\/$/,'')
|
50
|
-
end
|
51
|
-
|
52
|
-
protected
|
53
|
-
|
54
|
-
def initialize(id,name,default,path,child_folders)
|
55
|
-
super()
|
56
|
-
@id = id
|
57
|
-
@name = name
|
58
|
-
@default = default
|
59
|
-
@path = path
|
60
|
-
@child_folders = child_folders
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
data/lib/gliffy/rest.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
require 'digest/md5'
|
2
|
-
require 'cgi'
|
3
|
-
require 'rubygems'
|
4
|
-
require 'request_errors'
|
5
|
-
require 'resource'
|
6
|
-
require 'rest_client'
|
7
|
-
|
8
|
-
require 'gliffy/config'
|
9
|
-
require 'gliffy/url'
|
10
|
-
|
11
|
-
require 'logger'
|
12
|
-
|
13
|
-
module Gliffy
|
14
|
-
|
15
|
-
# Provides REST access to Gliffy, handling the signing of the requests
|
16
|
-
# but not the parsing of the results. This class responds to the four primary HTTP methods:
|
17
|
-
#
|
18
|
-
# * get
|
19
|
-
# * put
|
20
|
-
# * post
|
21
|
-
# * delete
|
22
|
-
#
|
23
|
-
# Each method takes three parameters:
|
24
|
-
# [url] - the relative URL being requested
|
25
|
-
# [params] - a hash of parameters to include in the request (these are specific to the request, not things like apiKey or token)
|
26
|
-
# [headers] - any HTTP headers you want to set
|
27
|
-
#
|
28
|
-
# params and headers are optional. These methods return whatever Gliffy sent back. The context
|
29
|
-
# of the request should be used to determine the type, however it should be relatively safe to call
|
30
|
-
# Response#success? on whatever is returned to determine if everythign was OK
|
31
|
-
#
|
32
|
-
class Rest
|
33
|
-
|
34
|
-
# Provides access to the current token,
|
35
|
-
# returning nil if none has been set
|
36
|
-
attr_accessor :current_token
|
37
|
-
|
38
|
-
# Provides access to the logger
|
39
|
-
# Do not set this to nil
|
40
|
-
attr_accessor :logger
|
41
|
-
|
42
|
-
attr_accessor :rest_client
|
43
|
-
|
44
|
-
# Create an accessor to the Gliffy REST api
|
45
|
-
#
|
46
|
-
def initialize
|
47
|
-
@current_token = nil
|
48
|
-
self.rest_client=RestClient
|
49
|
-
@logger = Logger.new(Config.config.log_device)
|
50
|
-
@logger.level = Config.config.log_level
|
51
|
-
|
52
|
-
@logger.debug("Creating #{self.class.to_s} with api_key of #{Config.config.api_key} against #{Config.config.gliffy_root}")
|
53
|
-
end
|
54
|
-
|
55
|
-
# Returns the complete URL that would be requested for
|
56
|
-
# the given URL and parameters
|
57
|
-
#
|
58
|
-
# [url] the URL, relative to the Gliffy API Root
|
59
|
-
# [params] a hash of parameters
|
60
|
-
#
|
61
|
-
def get_url(url,params=nil)
|
62
|
-
return create_url(url,params)
|
63
|
-
end
|
64
|
-
|
65
|
-
# Implements the http methods
|
66
|
-
def method_missing(symbol,*args)
|
67
|
-
if HTTP_METHODS[symbol] && (args.length > 0)
|
68
|
-
url,params,headers = args
|
69
|
-
make_rest_request(symbol,url,params,headers)
|
70
|
-
else
|
71
|
-
if (HTTP_METHODS[symbol])
|
72
|
-
raise ArgumentError.new("Wrong number of arguments for method #{symbol.to_s}")
|
73
|
-
else
|
74
|
-
super.method_missing(symbol,*args)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
# Create the URL that would be needed to access the given resource with the given
|
80
|
-
# parameters
|
81
|
-
#
|
82
|
-
# [+url+] url, relative to the gliffy root, to retrieve
|
83
|
-
# [+params+] optional hash of parameters
|
84
|
-
#
|
85
|
-
def create_url(url,params=nil)
|
86
|
-
url = SignedURL.new(Config.config.api_key,Config.config.secret_key,Config.config.gliffy_root,url)
|
87
|
-
url.params=params if params
|
88
|
-
url['token'] = @current_token.token if @current_token
|
89
|
-
|
90
|
-
url.full_url
|
91
|
-
end
|
92
|
-
|
93
|
-
protected
|
94
|
-
|
95
|
-
def make_rest_request(method,url,params,headers)
|
96
|
-
headers = Hash.new if !headers
|
97
|
-
request_url = create_url(url,params)
|
98
|
-
@logger.debug("#{method.to_s.upcase} #{request_url}")
|
99
|
-
@rest_client.send(method,request_url,headers)
|
100
|
-
end
|
101
|
-
|
102
|
-
HTTP_METHODS = {
|
103
|
-
:get => true,
|
104
|
-
:put => true,
|
105
|
-
:delete => true,
|
106
|
-
:post => true,
|
107
|
-
};
|
108
|
-
|
109
|
-
end
|
110
|
-
end
|