From 5368001c7ba8fbd8ad3858676dc18d9fb967320e Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Mon, 12 Mar 2018 16:55:03 +0100 Subject: [PATCH 1/6] fix #26 : Improve error message when passing an xcdatamodeld --- bin/gyro | 6 +++++- lib/gyro/log.rb | 2 +- lib/gyro/parser/xcdatamodel/xcdatamodel.rb | 12 ++++++------ .../Model.xcdatamodeld/Model.xcdatamodel/contents | 4 ++++ spec/gyro/xcdatamodel_spec.rb | 6 +++--- 5 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 spec/fixtures/xcdatamodel/Model.xcdatamodeld/Model.xcdatamodel/contents diff --git a/bin/gyro b/bin/gyro index f5db5fd..dcdf98e 100755 --- a/bin/gyro +++ b/bin/gyro @@ -76,6 +76,7 @@ rescue OptionParser::ParseError => e exit 1 end +# Model directory parsing if options[:model].nil? Gyro::Log.info('No model provided, trying to find one in the local directory…') options[:model] = Gyro::Parser::XCDataModel.find_in_dir(dir) @@ -90,6 +91,8 @@ else Gyro::Log.success("Using #{basename} in #{dirname}") end +xcdatamodel_dir = Pathname.new(options[:model]) + # Liquid Templates if options[:template].nil? # Generate JSON if no -t is specified @@ -114,12 +117,13 @@ end puts <<-INFO.gsub(/ \|/, '') | |#=================================== + |# Model : #{xcdatamodel_dir} |# Template : #{template_dir} |# Output Dir : #{output_dir} |# Params : #{options[:params].inspect} |#=================================== INFO -xcdatamodel = Gyro::Parser::XCDataModel::XCDataModel.new(options[:model]) +xcdatamodel = Gyro::Parser::XCDataModel::XCDataModel.new(xcdatamodel_dir) gen = Gyro::Generator::Liquid.new(template_dir, output_dir, options[:params]) gen.generate(xcdatamodel) diff --git a/lib/gyro/log.rb b/lib/gyro/log.rb index 912af46..9e52665 100644 --- a/lib/gyro/log.rb +++ b/lib/gyro/log.rb @@ -37,7 +37,7 @@ def self.success(str) puts "√ #{str}".colorize(:green, :bold) unless @quiet end - def self.fail!(message, stacktrace: false) + def self.fail!(message, stacktrace: true) Gyro::Log.error message raise message if stacktrace exit 1 diff --git a/lib/gyro/parser/xcdatamodel/xcdatamodel.rb b/lib/gyro/parser/xcdatamodel/xcdatamodel.rb index 850ccde..6292f6e 100644 --- a/lib/gyro/parser/xcdatamodel/xcdatamodel.rb +++ b/lib/gyro/parser/xcdatamodel/xcdatamodel.rb @@ -36,13 +36,13 @@ class XCDataModel attr_accessor :entities def initialize(xcdatamodel_dir) - contents_file = File.join(xcdatamodel_dir, 'contents') - Gyro::Log.fail!('Unable to find contents of xcdatamodel', stacktrace: true) unless File.exist?(contents_file) + Gyro::Log.fail!('Please target an xcdatamodel inside your xcdatamodeld') unless xcdatamodel_dir.extname != '.xcdatamodeld' + Gyro::Log.info("You are using an xcdatamodeld, please be sure you target the correct version of your xcdatamodel. Actual version using by gyro is : #{xcdatamodel_dir.basename}") unless !xcdatamodel_dir.to_path.include?('.xcdatamodeld') + file_contents = xcdatamodel_dir + 'contents' + Gyro::Log.fail!('Unable to find contents of xcdatamodel') unless file_contents.exist? @entities = {} - file = File.open(contents_file) - document_xml = Document.new(file) - file.close - load_entities(document_xml) + xml_document = Document.new(file_contents.open) + load_entities(xml_document) end def to_h diff --git a/spec/fixtures/xcdatamodel/Model.xcdatamodeld/Model.xcdatamodel/contents b/spec/fixtures/xcdatamodel/Model.xcdatamodeld/Model.xcdatamodel/contents new file mode 100644 index 0000000..6e56d57 --- /dev/null +++ b/spec/fixtures/xcdatamodel/Model.xcdatamodeld/Model.xcdatamodel/contents @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/spec/gyro/xcdatamodel_spec.rb b/spec/gyro/xcdatamodel_spec.rb index 96b6a23..90963cd 100644 --- a/spec/gyro/xcdatamodel_spec.rb +++ b/spec/gyro/xcdatamodel_spec.rb @@ -24,10 +24,10 @@ module Gyro .to raise_error 'Unable to find contents of xcdatamodel' end - it 'check raising relationship error' do - xcdatamodel_dir = fixture('xcdatamodel', 'error_relationship.xcdatamodel') + it 'check raise an error for xcdatamodeld' do + xcdatamodel_dir = fixture('xcdatamodel', 'Model.xcdatamodeld') expect { Parser::XCDataModel::XCDataModel.new(xcdatamodel_dir) } - .to raise_error 'The relationship "user" from "FidelityCard" is wrong - please fix it' + .to raise_error 'Please target an xcdatamodel inside your xcdatamodeld' end it 'check raising undefined type error' do From 2f16f22b988bf2d337f4f2625b02a0edf67cf456 Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Mon, 12 Mar 2018 17:15:42 +0100 Subject: [PATCH 2/6] clean some code --- lib/gyro/parser/xcdatamodel/xcdatamodel.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/gyro/parser/xcdatamodel/xcdatamodel.rb b/lib/gyro/parser/xcdatamodel/xcdatamodel.rb index 6292f6e..6481324 100644 --- a/lib/gyro/parser/xcdatamodel/xcdatamodel.rb +++ b/lib/gyro/parser/xcdatamodel/xcdatamodel.rb @@ -36,8 +36,14 @@ class XCDataModel attr_accessor :entities def initialize(xcdatamodel_dir) - Gyro::Log.fail!('Please target an xcdatamodel inside your xcdatamodeld') unless xcdatamodel_dir.extname != '.xcdatamodeld' - Gyro::Log.info("You are using an xcdatamodeld, please be sure you target the correct version of your xcdatamodel. Actual version using by gyro is : #{xcdatamodel_dir.basename}") unless !xcdatamodel_dir.to_path.include?('.xcdatamodeld') + is_xcdatamodeld = xcdatamodel_dir.extname != '.xcdatamodeld' + Gyro::Log.fail!('Please target an xcdatamodel inside your xcdatamodeld') unless is_xcdatamodeld + if xcdatamodel_dir.to_path.include?('.xcdatamodeld') + xcdatamodeld_info_message = 'You are using an xcdatamodeld, ' \ + 'please be sure you target the correct version of your xcdatamodel.' \ + ' Actual version using by gyro is :' + xcdatamodel_dir.basename.to_path + Gyro::Log.info(xcdatamodeld_info_message) + end file_contents = xcdatamodel_dir + 'contents' Gyro::Log.fail!('Unable to find contents of xcdatamodel') unless file_contents.exist? @entities = {} From 8340de55f3e89d177ed497793f91f7ac476079cd Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Mon, 12 Mar 2018 18:28:42 +0100 Subject: [PATCH 3/6] update error management and xcdatamodeld test --- lib/gyro/log.rb | 18 +++++++++--------- lib/gyro/parser/xcdatamodel/attribute.rb | 4 ++-- lib/gyro/parser/xcdatamodel/relationship.rb | 4 ++-- lib/gyro/parser/xcdatamodel/xcdatamodel.rb | 4 ++-- spec/gyro/liquid_generator_java_spec.rb | 2 +- spec/gyro/liquid_generator_kotlin_spec.rb | 2 +- spec/gyro/liquid_generator_swift_spec.rb | 2 +- spec/gyro/xcdatamodel_spec.rb | 2 +- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/gyro/log.rb b/lib/gyro/log.rb index 9e52665..af16c5c 100644 --- a/lib/gyro/log.rb +++ b/lib/gyro/log.rb @@ -16,30 +16,30 @@ module Gyro # Print nice and colored output for various error/success/title messages of Gyro # module Log - @quiet = false - def self.quiet=(value) - @quiet = value + @in_test_context = false + def self.in_test_context=(value) + @in_test_context = value end def self.title(str) # bg yellow - puts "\n#{str.colorize(:gray, :blue)}" unless @quiet + puts "\n#{str.colorize(:gray, :blue)}" unless @in_test_context end def self.error(str) - puts "! #{str}".colorize(:red, :bold) unless @quiet + puts "! #{str}".colorize(:red, :bold) unless @in_test_context end def self.info(str) - puts "> #{str}".colorize(:yellow, :bold) unless @quiet + puts "> #{str}".colorize(:yellow, :bold) unless @in_test_context end def self.success(str) - puts "√ #{str}".colorize(:green, :bold) unless @quiet + puts "√ #{str}".colorize(:green, :bold) unless @in_test_context end - def self.fail!(message, stacktrace: true) + def self.fail!(message) Gyro::Log.error message - raise message if stacktrace + raise message if @in_test_context exit 1 end end diff --git a/lib/gyro/parser/xcdatamodel/attribute.rb b/lib/gyro/parser/xcdatamodel/attribute.rb index 32e69a0..23a92db 100644 --- a/lib/gyro/parser/xcdatamodel/attribute.rb +++ b/lib/gyro/parser/xcdatamodel/attribute.rb @@ -116,13 +116,13 @@ def search_for_error # rubocop:disable Style/GuardClause if @type == :undefined || @type.empty? msg = %(The attribute "#{@name}" from "#{@entity_name}" has no type - please fix it) - Gyro::Log.fail!(msg, stacktrace: true) + Gyro::Log.fail!(msg) end if !@json_key_path.empty? && !@enum_values.empty? && (@enum_values.size != @json_values.size) message = %(The attribute "#{@name}" from "#{@entity_name}" is wrongly annotated:) + %(when declaring an type with enum and JSONKeyPath, you must have the same number of items) + %(in the 'enumValues' and 'JSONValues' annotations.) - Gyro::Log.fail!(message, stacktrace: true) + Gyro::Log.fail!(message) end # rubocop:enable Style/GuardClause end diff --git a/lib/gyro/parser/xcdatamodel/relationship.rb b/lib/gyro/parser/xcdatamodel/relationship.rb index c972333..781adb6 100644 --- a/lib/gyro/parser/xcdatamodel/relationship.rb +++ b/lib/gyro/parser/xcdatamodel/relationship.rb @@ -72,12 +72,12 @@ def search_for_error # rubocop:disable Style/GuardClause if inverse_type.empty? && destination.empty? message = %(The relationship "#{@name}" from "#{@entity_name}" is wrong - please fix it) - Gyro::Log.fail!(message, stacktrace: true) + Gyro::Log.fail!(message) end if !destination.empty? && type != :to_many message = %(The relationship "#{@name}" from "#{@entity_name}" is wrong - ) + %(please set a 'No Value' relationship as 'To Many') - Gyro::Log.fail!(message, stacktrace: true) + Gyro::Log.fail!(message) end # rubocop:enable Style/GuardClause end diff --git a/lib/gyro/parser/xcdatamodel/xcdatamodel.rb b/lib/gyro/parser/xcdatamodel/xcdatamodel.rb index 6481324..323cb77 100644 --- a/lib/gyro/parser/xcdatamodel/xcdatamodel.rb +++ b/lib/gyro/parser/xcdatamodel/xcdatamodel.rb @@ -38,10 +38,10 @@ class XCDataModel def initialize(xcdatamodel_dir) is_xcdatamodeld = xcdatamodel_dir.extname != '.xcdatamodeld' Gyro::Log.fail!('Please target an xcdatamodel inside your xcdatamodeld') unless is_xcdatamodeld - if xcdatamodel_dir.to_path.include?('.xcdatamodeld') + if xcdatamodel_dir.parent.extname == '.xcdatamodeld' xcdatamodeld_info_message = 'You are using an xcdatamodeld, ' \ 'please be sure you target the correct version of your xcdatamodel.' \ - ' Actual version using by gyro is :' + xcdatamodel_dir.basename.to_path + ' Actual version using by gyro is : ' + xcdatamodel_dir.basename.to_path Gyro::Log.info(xcdatamodeld_info_message) end file_contents = xcdatamodel_dir + 'contents' diff --git a/spec/gyro/liquid_generator_java_spec.rb b/spec/gyro/liquid_generator_java_spec.rb index 960ed5f..aa24d7c 100644 --- a/spec/gyro/liquid_generator_java_spec.rb +++ b/spec/gyro/liquid_generator_java_spec.rb @@ -20,7 +20,7 @@ module Gyro describe 'Liquid' do describe 'Java' do before do - Gyro::Log.quiet = true + Gyro::Log.in_test_context = true end JAVA_MODELS.each do |datamodel| it datamodel do diff --git a/spec/gyro/liquid_generator_kotlin_spec.rb b/spec/gyro/liquid_generator_kotlin_spec.rb index 78e00c7..a1402c9 100644 --- a/spec/gyro/liquid_generator_kotlin_spec.rb +++ b/spec/gyro/liquid_generator_kotlin_spec.rb @@ -23,7 +23,7 @@ module Gyro describe 'Liquid' do describe 'Kotlin' do before do - Gyro::Log.quiet = true + Gyro::Log.in_test_context = true end KOTLIN_MODELS.each do |datamodel| diff --git a/spec/gyro/liquid_generator_swift_spec.rb b/spec/gyro/liquid_generator_swift_spec.rb index fffa574..f9ec7b1 100644 --- a/spec/gyro/liquid_generator_swift_spec.rb +++ b/spec/gyro/liquid_generator_swift_spec.rb @@ -20,7 +20,7 @@ module Gyro describe 'Liquid' do describe 'Swift' do before do - Gyro::Log.quiet = true + Gyro::Log.in_test_context = true end %w[default realm primary ignored inverse enum optional].each do |datamodel| diff --git a/spec/gyro/xcdatamodel_spec.rb b/spec/gyro/xcdatamodel_spec.rb index 90963cd..e79018b 100644 --- a/spec/gyro/xcdatamodel_spec.rb +++ b/spec/gyro/xcdatamodel_spec.rb @@ -15,7 +15,7 @@ module Gyro describe Parser::XCDataModel do before do - Gyro::Log.quiet = true + Gyro::Log.in_test_context = true end it 'check raise an error for file' do From 63d502491a5d206935fdc78c88eefb9b2745a1f0 Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Tue, 13 Mar 2018 08:58:39 +0100 Subject: [PATCH 4/6] add PR changement inside CHANGELOG --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7521ab7..7d67d0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +## master +* Improve error and warning messages when targetting an xcdatamodeld. + [Steven Watremez](https://github.com/StevenWatremez) + [#53](https://github.com/NijiDigital/gyro/pull/53) + ## 1.4.0 * Order the Primary Key (identity attribute) first when generating the class for the entity. From a9f9731c23cc9557344c87e397e2b5ad07a14d80 Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Tue, 13 Mar 2018 17:46:49 +0100 Subject: [PATCH 5/6] fix PR comments --- lib/gyro/parser/xcdatamodel/xcdatamodel.rb | 10 ++++++---- spec/gyro/xcdatamodel_spec.rb | 8 +++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/gyro/parser/xcdatamodel/xcdatamodel.rb b/lib/gyro/parser/xcdatamodel/xcdatamodel.rb index 323cb77..2599ee9 100644 --- a/lib/gyro/parser/xcdatamodel/xcdatamodel.rb +++ b/lib/gyro/parser/xcdatamodel/xcdatamodel.rb @@ -37,18 +37,20 @@ class XCDataModel def initialize(xcdatamodel_dir) is_xcdatamodeld = xcdatamodel_dir.extname != '.xcdatamodeld' - Gyro::Log.fail!('Please target an xcdatamodel inside your xcdatamodeld') unless is_xcdatamodeld + Gyro::Log.fail!('Please target an \'.xcdatamodel\' file inside your xcdatamodeld') unless is_xcdatamodeld if xcdatamodel_dir.parent.extname == '.xcdatamodeld' xcdatamodeld_info_message = 'You are using an xcdatamodeld, ' \ 'please be sure you target the correct version of your xcdatamodel.' \ - ' Actual version using by gyro is : ' + xcdatamodel_dir.basename.to_path + ' Current version used by gyro is: ' + xcdatamodel_dir.basename.to_path Gyro::Log.info(xcdatamodeld_info_message) end file_contents = xcdatamodel_dir + 'contents' Gyro::Log.fail!('Unable to find contents of xcdatamodel') unless file_contents.exist? @entities = {} - xml_document = Document.new(file_contents.open) - load_entities(xml_document) + file = File.open(file_contents) + document_xml = Document.new(file) + file.close + load_entities(document_xml) end def to_h diff --git a/spec/gyro/xcdatamodel_spec.rb b/spec/gyro/xcdatamodel_spec.rb index e79018b..ae05fa2 100644 --- a/spec/gyro/xcdatamodel_spec.rb +++ b/spec/gyro/xcdatamodel_spec.rb @@ -27,7 +27,13 @@ module Gyro it 'check raise an error for xcdatamodeld' do xcdatamodel_dir = fixture('xcdatamodel', 'Model.xcdatamodeld') expect { Parser::XCDataModel::XCDataModel.new(xcdatamodel_dir) } - .to raise_error 'Please target an xcdatamodel inside your xcdatamodeld' + .to raise_error 'Please target an \'.xcdatamodel\' file inside your xcdatamodeld' + end + + it 'check raising relationship error' do + xcdatamodel_dir = fixture('xcdatamodel', 'error_relationship.xcdatamodel') + expect { Parser::XCDataModel::XCDataModel.new(xcdatamodel_dir) } + .to raise_error 'The relationship "user" from "FidelityCard" is wrong - please fix it' end it 'check raising undefined type error' do From 5a173e40ec875aedb27ba0b85e84b56b5c99fedc Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Thu, 15 Mar 2018 17:37:41 +0100 Subject: [PATCH 6/6] change string interpolation and change xml file openning --- lib/gyro/parser/xcdatamodel/xcdatamodel.rb | 6 ++---- spec/gyro/xcdatamodel_spec.rb | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/gyro/parser/xcdatamodel/xcdatamodel.rb b/lib/gyro/parser/xcdatamodel/xcdatamodel.rb index 2599ee9..77e6806 100644 --- a/lib/gyro/parser/xcdatamodel/xcdatamodel.rb +++ b/lib/gyro/parser/xcdatamodel/xcdatamodel.rb @@ -37,7 +37,7 @@ class XCDataModel def initialize(xcdatamodel_dir) is_xcdatamodeld = xcdatamodel_dir.extname != '.xcdatamodeld' - Gyro::Log.fail!('Please target an \'.xcdatamodel\' file inside your xcdatamodeld') unless is_xcdatamodeld + Gyro::Log.fail!(%(Please target an '.xcdatamodel' file inside your xcdatamodeld)) unless is_xcdatamodeld if xcdatamodel_dir.parent.extname == '.xcdatamodeld' xcdatamodeld_info_message = 'You are using an xcdatamodeld, ' \ 'please be sure you target the correct version of your xcdatamodel.' \ @@ -47,9 +47,7 @@ def initialize(xcdatamodel_dir) file_contents = xcdatamodel_dir + 'contents' Gyro::Log.fail!('Unable to find contents of xcdatamodel') unless file_contents.exist? @entities = {} - file = File.open(file_contents) - document_xml = Document.new(file) - file.close + document_xml = File.open(file_contents) { |file| Document.new(file) } load_entities(document_xml) end diff --git a/spec/gyro/xcdatamodel_spec.rb b/spec/gyro/xcdatamodel_spec.rb index ae05fa2..b0e03e1 100644 --- a/spec/gyro/xcdatamodel_spec.rb +++ b/spec/gyro/xcdatamodel_spec.rb @@ -27,7 +27,7 @@ module Gyro it 'check raise an error for xcdatamodeld' do xcdatamodel_dir = fixture('xcdatamodel', 'Model.xcdatamodeld') expect { Parser::XCDataModel::XCDataModel.new(xcdatamodel_dir) } - .to raise_error 'Please target an \'.xcdatamodel\' file inside your xcdatamodeld' + .to raise_error %(Please target an '.xcdatamodel' file inside your xcdatamodeld) end it 'check raising relationship error' do