choco 0.1.0
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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/HISTORY +3 -0
- data/LICENSE +20 -0
- data/README.rdoc +326 -0
- data/Rakefile +55 -0
- data/bin/choco +45 -0
- data/choco.gemspec +98 -0
- data/lib/choco.rb +16 -0
- data/lib/choco/cli.rb +75 -0
- data/lib/choco/dependency_manager.rb +92 -0
- data/lib/choco/generators/app_generator.rb +72 -0
- data/lib/choco/generators/controller_generator.rb +21 -0
- data/lib/choco/generators/layout_generator.rb +19 -0
- data/lib/choco/generators/model_generator.rb +20 -0
- data/lib/choco/generators/plugin_generator.rb +20 -0
- data/lib/choco/generators/scaffold_generator.rb +65 -0
- data/lib/choco/generators/templates/Jimfile +24 -0
- data/lib/choco/generators/templates/README.rdoc +3 -0
- data/lib/choco/generators/templates/Rakefile +25 -0
- data/lib/choco/generators/templates/application.css +1 -0
- data/lib/choco/generators/templates/choco +7 -0
- data/lib/choco/generators/templates/controllers/application_controller.js +33 -0
- data/lib/choco/generators/templates/controllers/base_controller.js +6 -0
- data/lib/choco/generators/templates/controllers/rest_controller.js +53 -0
- data/lib/choco/generators/templates/help/commands +12 -0
- data/lib/choco/generators/templates/help/generators +33 -0
- data/lib/choco/generators/templates/helpers/application_helper.js +7 -0
- data/lib/choco/generators/templates/index.html +16 -0
- data/lib/choco/generators/templates/lib/plugin.js +40 -0
- data/lib/choco/generators/templates/models/base.js +7 -0
- data/lib/choco/generators/templates/views/edit.template +14 -0
- data/lib/choco/generators/templates/views/index.template +32 -0
- data/lib/choco/generators/templates/views/layout.js +4 -0
- data/lib/choco/generators/templates/views/main/index.template +1 -0
- data/lib/choco/generators/templates/views/new.template +14 -0
- data/lib/choco/generators/templates/views/show.template +10 -0
- data/spec/choco_spec.rb +7 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- metadata +164 -0
data/choco.gemspec
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{choco}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Anthony Heukmes"]
|
12
|
+
s.date = %q{2010-07-23}
|
13
|
+
s.default_executable = %q{choco}
|
14
|
+
s.description = %q{Choco brings the MVC to the client side! It allows you to easily develop maintainable Rich Internet Applications using Javascript.}
|
15
|
+
s.email = %q{anthony.heukmes@skynet.be}
|
16
|
+
s.executables = ["choco"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
"HISTORY",
|
25
|
+
"LICENSE",
|
26
|
+
"README.rdoc",
|
27
|
+
"Rakefile",
|
28
|
+
"bin/choco",
|
29
|
+
"choco.gemspec",
|
30
|
+
"lib/choco.rb",
|
31
|
+
"lib/choco/cli.rb",
|
32
|
+
"lib/choco/dependency_manager.rb",
|
33
|
+
"lib/choco/generators/app_generator.rb",
|
34
|
+
"lib/choco/generators/controller_generator.rb",
|
35
|
+
"lib/choco/generators/layout_generator.rb",
|
36
|
+
"lib/choco/generators/model_generator.rb",
|
37
|
+
"lib/choco/generators/plugin_generator.rb",
|
38
|
+
"lib/choco/generators/scaffold_generator.rb",
|
39
|
+
"lib/choco/generators/templates/Jimfile",
|
40
|
+
"lib/choco/generators/templates/README.rdoc",
|
41
|
+
"lib/choco/generators/templates/Rakefile",
|
42
|
+
"lib/choco/generators/templates/application.css",
|
43
|
+
"lib/choco/generators/templates/choco",
|
44
|
+
"lib/choco/generators/templates/controllers/application_controller.js",
|
45
|
+
"lib/choco/generators/templates/controllers/base_controller.js",
|
46
|
+
"lib/choco/generators/templates/controllers/rest_controller.js",
|
47
|
+
"lib/choco/generators/templates/help/commands",
|
48
|
+
"lib/choco/generators/templates/help/generators",
|
49
|
+
"lib/choco/generators/templates/helpers/application_helper.js",
|
50
|
+
"lib/choco/generators/templates/index.html",
|
51
|
+
"lib/choco/generators/templates/lib/plugin.js",
|
52
|
+
"lib/choco/generators/templates/models/base.js",
|
53
|
+
"lib/choco/generators/templates/views/edit.template",
|
54
|
+
"lib/choco/generators/templates/views/index.template",
|
55
|
+
"lib/choco/generators/templates/views/layout.js",
|
56
|
+
"lib/choco/generators/templates/views/main/index.template",
|
57
|
+
"lib/choco/generators/templates/views/new.template",
|
58
|
+
"lib/choco/generators/templates/views/show.template",
|
59
|
+
"spec/choco_spec.rb",
|
60
|
+
"spec/spec.opts",
|
61
|
+
"spec/spec_helper.rb"
|
62
|
+
]
|
63
|
+
s.homepage = %q{http://github.com/ahe/choco}
|
64
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
65
|
+
s.require_paths = ["lib"]
|
66
|
+
s.rubygems_version = %q{1.3.6}
|
67
|
+
s.summary = %q{A delicious Javascript web framework made in Belgium!}
|
68
|
+
s.test_files = [
|
69
|
+
"spec/choco_spec.rb",
|
70
|
+
"spec/spec_helper.rb"
|
71
|
+
]
|
72
|
+
|
73
|
+
if s.respond_to? :specification_version then
|
74
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
75
|
+
s.specification_version = 3
|
76
|
+
|
77
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
78
|
+
s.add_runtime_dependency(%q<jim>, [">= 0"])
|
79
|
+
s.add_runtime_dependency(%q<fssm>, [">= 0"])
|
80
|
+
s.add_runtime_dependency(%q<thor>, [">= 0"])
|
81
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
82
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
83
|
+
else
|
84
|
+
s.add_dependency(%q<jim>, [">= 0"])
|
85
|
+
s.add_dependency(%q<fssm>, [">= 0"])
|
86
|
+
s.add_dependency(%q<thor>, [">= 0"])
|
87
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
88
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
89
|
+
end
|
90
|
+
else
|
91
|
+
s.add_dependency(%q<jim>, [">= 0"])
|
92
|
+
s.add_dependency(%q<fssm>, [">= 0"])
|
93
|
+
s.add_dependency(%q<thor>, [">= 0"])
|
94
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
95
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
data/lib/choco.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'thor/group'
|
3
|
+
require 'active_support/inflector'
|
4
|
+
|
5
|
+
module Choco
|
6
|
+
VERSION = '0.1.0'
|
7
|
+
|
8
|
+
autoload :DependencyManager, 'choco/dependency_manager'
|
9
|
+
autoload :CLI, 'choco/cli'
|
10
|
+
autoload :AppGenerator, 'choco/generators/app_generator'
|
11
|
+
autoload :ControllerGenerator, 'choco/generators/controller_generator'
|
12
|
+
autoload :LayoutGenerator, 'choco/generators/layout_generator'
|
13
|
+
autoload :ModelGenerator, 'choco/generators/model_generator'
|
14
|
+
autoload :PluginGenerator, 'choco/generators/plugin_generator'
|
15
|
+
autoload :ScaffoldGenerator, 'choco/generators/scaffold_generator'
|
16
|
+
end
|
data/lib/choco/cli.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module Choco
|
4
|
+
|
5
|
+
class CLI
|
6
|
+
|
7
|
+
def initialize(args)
|
8
|
+
@args = args
|
9
|
+
@output = ""
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
@args << '--help' if @args.empty?
|
14
|
+
|
15
|
+
aliases = {
|
16
|
+
"g" => "generate"
|
17
|
+
}
|
18
|
+
|
19
|
+
command = @args.shift
|
20
|
+
command = aliases[command] || command
|
21
|
+
|
22
|
+
case command
|
23
|
+
when 'generate'
|
24
|
+
name = @args.shift
|
25
|
+
if name
|
26
|
+
klass = eval("Choco::#{name.capitalize}Generator")
|
27
|
+
klass.start @args
|
28
|
+
else
|
29
|
+
@output = template('generators')
|
30
|
+
end
|
31
|
+
|
32
|
+
when '--watch'
|
33
|
+
require 'fssm'
|
34
|
+
|
35
|
+
puts "*** Choco is now watching your JS files..."
|
36
|
+
|
37
|
+
system "jim bundle #{Choco::DependencyManager.to}"
|
38
|
+
|
39
|
+
FSSM.monitor(Dir.pwd, ['**/*.js', 'Jimfile']) do
|
40
|
+
update do |base, relative|
|
41
|
+
unless relative.include?('bundled.js')
|
42
|
+
puts "*** #{relative} changed!"
|
43
|
+
system "jim bundle #{Choco::DependencyManager.to}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
create do |base, relative|
|
48
|
+
unless relative.include?('bundled.js')
|
49
|
+
puts "*** #{relative} created!"
|
50
|
+
Choco::DependencyManager.add_dependency(relative)
|
51
|
+
system "jim bundle #{Choco::DependencyManager.to}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
delete do |base, relative|
|
56
|
+
puts "*** #{relative} deleted!"
|
57
|
+
Choco::DependencyManager.remove_dependency(relative)
|
58
|
+
system "jim bundle #{Choco::DependencyManager.to}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
else
|
62
|
+
@output = template('commands')
|
63
|
+
end
|
64
|
+
|
65
|
+
@output
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def template(path)
|
71
|
+
(Pathname.new(__FILE__).dirname + 'generators/templates/help/' + path).read
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Choco
|
2
|
+
class DependencyManager
|
3
|
+
|
4
|
+
@@to = 'lib/bundled.js'
|
5
|
+
|
6
|
+
def self.to
|
7
|
+
@@to
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.add_dependency(filename)
|
11
|
+
filename = remove_extension(filename)
|
12
|
+
|
13
|
+
if filename.include?('controllers/')
|
14
|
+
type = 'Controller'
|
15
|
+
elsif filename.include?('helpers/')
|
16
|
+
type = 'Helper'
|
17
|
+
elsif filename.include?('models/')
|
18
|
+
type = 'Model'
|
19
|
+
else
|
20
|
+
type = 'Libs'
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
already_present = false
|
25
|
+
File.new('Jimfile', "r").each do |line|
|
26
|
+
if line.include?(filename)
|
27
|
+
already_present = true
|
28
|
+
break
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
unless already_present
|
33
|
+
jimfile = ""
|
34
|
+
File.new('Jimfile', "r").each do |line|
|
35
|
+
jimfile << line
|
36
|
+
if line.include?("// #{type}")
|
37
|
+
jimfile << "#{filename}\n"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
File.open('Jimfile', "wb") { |io| io.print jimfile }
|
42
|
+
|
43
|
+
if type == 'Controller' || type == 'Helper'
|
44
|
+
application_controller = ""
|
45
|
+
file = extract_filename(filename)
|
46
|
+
|
47
|
+
File.new('app/controllers/application_controller.js', "r").each do |line|
|
48
|
+
application_controller << line
|
49
|
+
if line.include?("/* Configure your #{type.downcase.pluralize} here")
|
50
|
+
if type == 'Helper'
|
51
|
+
application_controller << "\tthis.helpers(#{file});\n"
|
52
|
+
else
|
53
|
+
application_controller << "\t#{file}(this);\n"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
File.open('app/controllers/application_controller.js', "wb") { |io| io.print application_controller }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.remove_dependency(filename)
|
64
|
+
filename = remove_extension(filename)
|
65
|
+
|
66
|
+
jimfile = ""
|
67
|
+
File.new('Jimfile', "r").each do |line|
|
68
|
+
jimfile << line unless line.include?(filename)
|
69
|
+
end
|
70
|
+
|
71
|
+
File.open('Jimfile', "wb") { |io| io.print jimfile }
|
72
|
+
|
73
|
+
file = extract_filename(filename)
|
74
|
+
application_controller = ""
|
75
|
+
File.new('app/controllers/application_controller.js', "r").each do |line|
|
76
|
+
application_controller << line unless line.include?(filename)
|
77
|
+
end
|
78
|
+
|
79
|
+
File.open('app/controllers/application_controller.js', "wb") { |io| io.print application_controller }
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def self.remove_extension(filename)
|
85
|
+
filename.gsub('.js', '')
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.extract_filename(filename)
|
89
|
+
filename.to_s.split('/').last.camelcase
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Choco
|
2
|
+
class AppGenerator < Thor::Group
|
3
|
+
include Thor::Actions
|
4
|
+
|
5
|
+
def self.source_root
|
6
|
+
File.dirname(__FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
desc 'Generates a delicious Choco app'
|
10
|
+
argument :name
|
11
|
+
|
12
|
+
def create_root_folder
|
13
|
+
empty_directory name
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_app_folder
|
17
|
+
empty_directory "#{name}/app"
|
18
|
+
empty_directory "#{name}/app/controllers"
|
19
|
+
empty_directory "#{name}/app/models"
|
20
|
+
empty_directory "#{name}/app/views"
|
21
|
+
empty_directory "#{name}/app/views/main"
|
22
|
+
empty_directory "#{name}/app/views/layouts"
|
23
|
+
empty_directory "#{name}/app/helpers"
|
24
|
+
|
25
|
+
template('templates/controllers/application_controller.js', "#{name}/app/controllers/application_controller.js")
|
26
|
+
template('templates/views/main/index.template', "#{name}/app/views/main/index.template")
|
27
|
+
template('templates/helpers/application_helper.js', "#{name}/app/helpers/application_helper.js")
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_lib_folder
|
31
|
+
empty_directory "#{name}/lib"
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_compressed_folder
|
35
|
+
empty_directory "#{name}/compressed"
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_images_folder
|
39
|
+
empty_directory "#{name}/images"
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_stylesheets_folder
|
43
|
+
empty_directory "#{name}/stylesheets"
|
44
|
+
template('templates/application.css', "#{name}/stylesheets/application.css")
|
45
|
+
end
|
46
|
+
|
47
|
+
def create_spec_folder
|
48
|
+
empty_directory "#{name}/spec"
|
49
|
+
end
|
50
|
+
|
51
|
+
def create_script_folder
|
52
|
+
empty_directory "#{name}/script"
|
53
|
+
template('templates/choco', "#{name}/script/choco")
|
54
|
+
end
|
55
|
+
|
56
|
+
def create_jimfile
|
57
|
+
template('templates/Jimfile', "#{name}/Jimfile")
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_rakefile
|
61
|
+
template('templates/Rakefile', "#{name}/Rakefile")
|
62
|
+
end
|
63
|
+
|
64
|
+
def create_readme_file
|
65
|
+
create_file "#{name}/README.rdoc"
|
66
|
+
end
|
67
|
+
|
68
|
+
def create_index_file
|
69
|
+
template('templates/index.html', "#{name}/index.html")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Choco
|
2
|
+
class ControllerGenerator < Thor::Group
|
3
|
+
include Thor::Actions
|
4
|
+
|
5
|
+
def self.source_root
|
6
|
+
File.dirname(__FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
desc 'Generates a Choco controller'
|
10
|
+
argument :name
|
11
|
+
|
12
|
+
def create_controller_file
|
13
|
+
template('templates/controllers/base_controller.js', "app/controllers/#{name}_controller.js")
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_views_folder
|
17
|
+
empty_directory "app/views/#{name}"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Choco
|
2
|
+
class LayoutGenerator < Thor::Group
|
3
|
+
include Thor::Actions
|
4
|
+
|
5
|
+
def self.source_root
|
6
|
+
File.dirname(__FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
desc 'Generates a Choco layout'
|
10
|
+
argument :name
|
11
|
+
|
12
|
+
def create_model_file
|
13
|
+
@layout_name = name.camelcase.singularize
|
14
|
+
@name = name.underscore.singularize
|
15
|
+
template('templates/views/layout.js', "app/views/layouts/#{@name}.js")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Choco
|
2
|
+
class ModelGenerator < Thor::Group
|
3
|
+
include Thor::Actions
|
4
|
+
|
5
|
+
def self.source_root
|
6
|
+
File.dirname(__FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
desc 'Generates a Choco model'
|
10
|
+
argument :name
|
11
|
+
|
12
|
+
def create_model_file
|
13
|
+
@model_name = name.camelcase.singularize
|
14
|
+
@model = name.underscore.singularize
|
15
|
+
@route_path = name.underscore.pluralize
|
16
|
+
template('templates/models/base.js', "app/models/#{@model}.js")
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Choco
|
2
|
+
class PluginGenerator < Thor::Group
|
3
|
+
include Thor::Actions
|
4
|
+
|
5
|
+
def self.source_root
|
6
|
+
File.dirname(__FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
desc 'Generates a Choco plugin (Sammy or js-model)'
|
10
|
+
argument :name
|
11
|
+
class_option :for_lib
|
12
|
+
|
13
|
+
def create_model_file
|
14
|
+
@plugin_name = name.camelcase.singularize
|
15
|
+
@name = name.underscore.singularize
|
16
|
+
template('templates/lib/plugin.js', "lib/plugin_#{@name}.js")
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Choco
|
5
|
+
class ScaffoldGenerator < Thor::Group
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
def self.source_root
|
9
|
+
File.dirname(__FILE__)
|
10
|
+
end
|
11
|
+
|
12
|
+
desc 'Generates a Choco CRUD controller with views & model'
|
13
|
+
argument :name, :required => true
|
14
|
+
argument :fields, :type => :array, :default => []
|
15
|
+
|
16
|
+
def get_data_structure
|
17
|
+
@controller_name = name.pluralize.camelcase
|
18
|
+
@route_path = name.pluralize.underscore
|
19
|
+
@model = name.singularize.underscore
|
20
|
+
@model_name = name.singularize.camelcase
|
21
|
+
|
22
|
+
@keys = []
|
23
|
+
if fields.first && fields.first.include?('http://')
|
24
|
+
@keys = load_json(fields.first)
|
25
|
+
else
|
26
|
+
@keys = fields
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_controller
|
31
|
+
template('templates/controllers/rest_controller.js', "app/controllers/#{@route_path}_controller.js")
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_views
|
35
|
+
empty_directory "app/views/#{@route_path}"
|
36
|
+
template('templates/views/index.template', "app/views/#{@route_path}/index.template")
|
37
|
+
template('templates/views/show.template', "app/views/#{@route_path}/show.template")
|
38
|
+
template('templates/views/new.template', "app/views/#{@route_path}/new.template")
|
39
|
+
template('templates/views/edit.template', "app/views/#{@route_path}/edit.template")
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_model
|
43
|
+
template('templates/models/base.js', "app/models/#{@model}.js")
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def load_json(url)
|
49
|
+
begin
|
50
|
+
buffer = open(url, 'UserAgent' => 'Choco').read
|
51
|
+
data = JSON.parse(buffer)[0]
|
52
|
+
|
53
|
+
if data.size == 1 && data.first[1].is_a?(Hash)
|
54
|
+
data = data.first[1]
|
55
|
+
end
|
56
|
+
|
57
|
+
keys = data.map{ |key, value| key }
|
58
|
+
rescue Exception
|
59
|
+
puts "An error occured (check that your URL is reachable and that your JSON is not empty)"
|
60
|
+
end
|
61
|
+
keys
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|