choco 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|