sf_migrate 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +15 -0
  2. data/lib/import.rb +159 -137
  3. metadata +73 -103
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZWFjNmY0ZGE4YmY3YjQwN2E3YmRmODliNmZhZjc1OTQ3YzQ4MjkzNw==
5
+ data.tar.gz: !binary |-
6
+ ODFmNWI4NDM2NzNmMjVhOTZiMDNkNzdmYjYwYzI1ZDFmZDQ3YzkzYg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZThkZjExNDhhMjVmY2E4NzUxZGViMGVlODgzNTlkNGIxNjk2NzBjYjkzMDMz
10
+ M2I2MDExOGM1ZTkxMTJkZjVkNDgzMmQwZmUyNTY1Mzc0MDVhMWJjYzA4NjE0
11
+ YjFkZDUyZTMwOTkyNmVhMTU3NzQ5ZDQ3MTVlMGJlODMxNTI1MTM=
12
+ data.tar.gz: !binary |-
13
+ YWM3Y2Y5NWJmNDMwM2NlMWUzYWMxZjJmOTg0ZTllOTMyMmQ0NTg0MDU2OTdi
14
+ MmIxYmM0Yzg4OTBhOTEzZTJiOGRmZGVmNWMzMmZkOGEwYmZhN2ZiYjM5NWVi
15
+ YzhmN2FiNzExZDlkN2Q2ZTJhNDQ5M2VkMzExOGQ3ZmY0Y2M1ODI=
data/lib/import.rb CHANGED
@@ -43,7 +43,7 @@ module SalesforceMigration
43
43
  import_agents
44
44
  import_merchants
45
45
 
46
- associate_records_to_groups
46
+ puts_records_in_iso_groups
47
47
  end
48
48
 
49
49
  # Import methods. They load the csv file, for the given type
@@ -525,6 +525,14 @@ module SalesforceMigration
525
525
  end
526
526
  end
527
527
  end
528
+
529
+ # Assign all records, to their ISO's SecurityGroup
530
+ #
531
+ def puts_records_in_iso_groups
532
+ put_isos_into_iso_group
533
+ put_agents_into_iso_group
534
+ put_merchants_into_iso_group
535
+ end
528
536
 
529
537
  # Create the actual records and users in SugarCRM. Populates the var_pool
530
538
  #
@@ -570,6 +578,32 @@ module SalesforceMigration
570
578
  end
571
579
  end
572
580
 
581
+ # Populates the var_pool with Sugar Objects.
582
+ # Reason being, is that if you abort the current process (error or some other reason)
583
+ # You won't be able to continue from the same place and be able to correctly associate the objects
584
+ # To prevent this, we can just load back every object for every type and continue uninterrupted
585
+ #
586
+ # @param [String] id - SalesForce id of the object, that we want to retrieve
587
+ # @param [String] type - type of the object, that we want to retrieve (module type)
588
+ def populate_var_poll_from_sugar(id, type)
589
+ obj = find_sugarcrm_object(type, 'sf_id', id)
590
+ populate_var_pool(obj, type) if obj
591
+ end
592
+
593
+ # Populates Users as SugarCRM objects.
594
+ # We use them later on, when associating objects with Security Groups
595
+ #
596
+ # @param [SugarCRM::Namespace::Object] Already created user object
597
+ # @param [String] type type of the object
598
+ def populate_user_pool(user, type)
599
+ case type
600
+ when 'iso'
601
+ @iso_users << user
602
+ when 'agent'
603
+ @agent_users << user
604
+ end
605
+ end
606
+
573
607
  # Create association for agent, merchant, settlement bank Account, Email, Payment Method
574
608
  # If it is agent, it will find the ISO by id and create the association
575
609
  # If it is merchant, it will find the Agent, Payment Method, User and create the associations
@@ -603,21 +637,42 @@ module SalesforceMigration
603
637
  obj
604
638
  end
605
639
 
606
- # Associate an object with selected ids
607
- def associate_module_by_ids!(object, type, list_of_ids, assign_to_user = false, reverse_association = false)
608
- if list_of_ids.is_a?(Array)
609
- list_of_ids.each do |record_id|
610
- sugar_object = find_sugarcrm_object(type, 'sf_id', record_id)
611
- if reverse_association
612
- sugar_object.associate! object if sugar_object
613
- else
614
- object.associate! sugar_object if sugar_object
615
- end
616
- assign_user_as_owner_to_record(object, sugar_object) if assign_to_user
640
+ # Creates the Security Group object in SugarCRM
641
+ #
642
+ # @param [SugarCRM::Namespace::EmpIso] Iso object
643
+ def create_security_group_iso(iso)
644
+ @logger.info("Creating SecurityGroup #{iso.name}")
645
+ security_group = SugarCRM::SecurityGroup.new(:name => iso.name) unless find_sugarcrm_object('security_group','name', iso.name)
646
+ security_group.save! if security_group
647
+ end
648
+
649
+ # Create user associated with SugarCRM object
650
+ # Default email: mail@example.com, default password: 123456
651
+ #
652
+ # @param [SugarCRM::Namespace::Object] obj object for which a user will be created
653
+ # @param [String] type type of the object
654
+ def create_user(obj, type)
655
+ @logger.info("Creating user for #{type} #{obj.name}")
656
+ if (defined?(obj.emerchantpay_iso_id) && (obj.emerchantpay_iso_id.blank? || obj.email_address.blank?)) ||
657
+ (defined?(obj.emerchantpay_agent_id) && (obj.emerchantpay_agent_id.blank? || obj.email_address.blank?))
658
+ @logger.error("Record |#{obj.name}| with type |#{type}| have empty fields (which are required), thus its skipped!")
659
+ else
660
+ user = SugarCRM::User.new
661
+ user.user_name = (type == 'agent') ? obj.emerchantpay_agent_id : obj.emerchantpay_iso_id
662
+ user.last_name = obj.name
663
+ user.emp_type = type
664
+ user.email1 = obj.email_address || ""
665
+ user.status = 'Inactive'
666
+ user.salesforce_id = obj.sf_id
667
+ user.system_generated_password = false
668
+ user.save!
669
+ obj.assigned_user_id = user.id
670
+ obj.save!
671
+
672
+ populate_user_pool(user, type)
617
673
  end
618
- end
619
674
  end
620
-
675
+
621
676
  # Find records(payment methods, emails) in the junction object arrays, given the merchant_id
622
677
  # Both payment methods and emails have a many-to-many relationship with the merchant in Salesforce
623
678
 
@@ -646,39 +701,19 @@ module SalesforceMigration
646
701
  end
647
702
  end
648
703
 
649
- def find_related_records(relation_data, relation_field, related_to_id)
650
- return unless relation_data and relation_field and related_to_id
651
-
652
- search_results = []
653
-
654
- case @action
655
- when "initial_run"
656
- relation_data.each do |record|
657
- # Check if we are dealing with file-relations (stored as Array)
658
- # OR if we're using SugarCRM records (store as Object)
659
-
660
- record_id = (relation_data.first.is_a?(Hash)) ? record['sf_id'] : record.sf_id
661
- relate_id = (relation_data.first.is_a?(Hash)) ? record[relation_field] : record.send(relation_field.to_sym)
662
-
663
- search_results << record_id if compare_salesforce_ids(relate_id, related_to_id)
664
- end
665
- when "update"
666
- # Check if we are dealing with file-relations (stored as Array)
667
- if relation_data.first.is_a?(Hash)
668
- relation_data.each { |record| search_results << record['sf_id'] if compare_salesforce_ids(record[relation_field], related_to_id) }
669
- # OR extract the objects from SugarCRM
704
+ # Associate an object with selected ids
705
+ def associate_module_by_ids!(object, type, list_of_ids, assign_to_user = false, reverse_association = false)
706
+ if list_of_ids.is_a?(Array)
707
+ list_of_ids.each do |record_id|
708
+ sugar_object = find_sugarcrm_object(type, 'sf_id', record_id)
709
+ if reverse_association
710
+ sugar_object.associate! object if sugar_object and object
670
711
  else
671
- records = find_sugarcrm_object(relation_data, relation_field, related_to_id)
672
-
673
- if records.is_a?(Array)
674
- records.each { |record| search_results << record.sf_id }
675
- else
676
- search_results << records.sf_id
677
- end
712
+ object.associate! sugar_object if sugar_object and object
678
713
  end
714
+ assign_user_as_owner_to_record(object, sugar_object) if assign_to_user
715
+ end
679
716
  end
680
-
681
- return search_results
682
717
  end
683
718
 
684
719
  # Assign user to an object, by providing a source and target objects
@@ -707,89 +742,41 @@ module SalesforceMigration
707
742
  object_to_assign.save!
708
743
  end
709
744
 
710
- # Compare SalesForce Ids - SalesForce have two type of ids - 15 digit case-sensitive and 18-digit case-insensitive
711
- #
712
- # @param [String] salesforce_id - salesforce id to compare to
713
- # @param [String] target_id - id
714
- #
715
- # @return [Boolean] true on match, every other case - false
716
- def compare_salesforce_ids(salesforce_id, target_id)
717
- return false unless salesforce_id and target_id
745
+ def find_related_records(relation_data, relation_field, related_to_id)
746
+ return unless relation_data and relation_field and related_to_id
718
747
 
719
- case salesforce_id.length
720
- when 15
721
- if target_id.length == 18
722
- target_id = target_id[0..-4]
723
- end
724
- if salesforce_id == target_id
725
- return true
726
- end
727
- when 18
728
- if target_id.length == 15
729
- salesforce_id = salesforce_id[0..-4]
748
+ search_results = []
749
+
750
+ case @action
751
+ when "initial_run"
752
+ relation_data.each do |record|
753
+ # Check if we are dealing with file-relations (stored as Array)
754
+ # OR if we're using SugarCRM records (store as Object)
755
+
756
+ record_id = (relation_data.first.is_a?(Hash)) ? record['sf_id'] : record.sf_id
757
+ relate_id = (relation_data.first.is_a?(Hash)) ? record[relation_field] : record.send(relation_field.to_sym)
758
+
759
+ search_results << record_id if compare_salesforce_ids(relate_id, related_to_id)
730
760
  end
731
- if salesforce_id.casecmp(target_id) == 0
732
- return true
761
+ when "update"
762
+ # Check if we are dealing with file-relations (stored as Array)
763
+ if relation_data.first.is_a?(Hash)
764
+ relation_data.each { |record| search_results << record['sf_id'] if compare_salesforce_ids(record[relation_field], related_to_id) }
765
+ # OR extract the objects from SugarCRM
766
+ else
767
+ records = find_sugarcrm_object(relation_data, relation_field, related_to_id)
768
+
769
+ return if records.blank?
770
+
771
+ if records.is_a?(Array)
772
+ records.each { |record| search_results << record.sf_id }
773
+ else
774
+ search_results << records.sf_id
775
+ end
733
776
  end
734
777
  end
735
-
736
- false
737
- end
738
-
739
- # Creates the Security Group object in SugarCRM
740
- #
741
- # @param [SugarCRM::Namespace::EmpIso] Iso object
742
- def create_security_group_iso(iso)
743
- @logger.info("Creating SecurityGroup #{iso.name}")
744
- security_group = SugarCRM::SecurityGroup.new(:name => iso.name) unless find_sugarcrm_object('security_group','name', iso.name)
745
- security_group.save! if security_group
746
- end
747
-
748
- # Assign all records, to their ISO's SecurityGroup
749
- def associate_records_to_groups
750
- put_isos_into_iso_group
751
- put_agents_into_iso_group
752
- put_merchants_into_iso_group
753
- end
754
778
 
755
- # Create user associated with SugarCRM object
756
- # Default email: mail@example.com, default password: 123456
757
- #
758
- # @param [SugarCRM::Namespace::Object] obj object for which a user will be created
759
- # @param [String] type type of the object
760
- def create_user(obj, type)
761
- @logger.info("Creating user for #{type} #{obj.name}")
762
- if (defined?(obj.emerchantpay_iso_id) && (obj.emerchantpay_iso_id.blank? || obj.email_address.blank?)) ||
763
- (defined?(obj.emerchantpay_agent_id) && (obj.emerchantpay_agent_id.blank? || obj.email_address.blank?))
764
- @logger.error("Record |#{obj.name}| with type |#{type}| have empty fields (which are required), thus its skipped!")
765
- else
766
- user = SugarCRM::User.new
767
- user.user_name = (type == 'agent') ? obj.emerchantpay_agent_id : obj.emerchantpay_iso_id
768
- user.last_name = obj.name
769
- user.emp_type = type
770
- user.email1 = obj.email_address || ""
771
- user.status = 'Inactive'
772
- user.salesforce_id = obj.sf_id
773
- user.system_generated_password = false
774
- user.save!
775
- obj.assigned_user_id = user.id
776
- obj.save!
777
-
778
- populate_user_pool(user, type)
779
- end
780
- end
781
-
782
- # Populates Users as SugarCRM objects.
783
- # We use them later on, when associating objects with Security Groups
784
- # @param [SugarCRM::Namespace::Object] Already created user object
785
- # @param [String] type type of the object
786
- def populate_user_pool(user, type)
787
- case type
788
- when 'iso'
789
- @iso_users << user
790
- when 'agent'
791
- @agent_users << user
792
- end
779
+ search_results
793
780
  end
794
781
 
795
782
  def put_isos_into_iso_group
@@ -864,6 +851,7 @@ module SalesforceMigration
864
851
  put_email_objects_into_iso_group(security_group, 'merchant', merchant)
865
852
  put_payment_methods_objects_into_iso_group(security_group, merchant)
866
853
  put_bank_accounts_into_iso_group(security_group, merchant)
854
+ put_contracts_into_iso_group(security_group, merchant)
867
855
  else
868
856
  @logger.error("Couldn't find a ISO SecurityGroup for Merchant - #{merchant.name}")
869
857
  end
@@ -872,10 +860,27 @@ module SalesforceMigration
872
860
  end
873
861
  end
874
862
 
863
+ def put_contracts_into_iso_group(security_group, merchant)
864
+ return unless security_group and merchant
865
+
866
+ @logger.info("Putting Contracts for #{merchant.name} into #{security_group.name} group")
867
+
868
+ case @action
869
+ when "initial_run"
870
+ contracts_for_merchant_id = find_related_records(@contracts, 'sf_account_id', merchant.sf_id)
871
+ when "update"
872
+ contracts_for_merchant_id = find_related_records('contract', 'sf_account_id', merchant.sf_id)
873
+ end
874
+
875
+ return if contracts_for_merchant_id.blank?
876
+
877
+ associate_module_by_ids!(security_group, 'contract', contracts_for_merchant_id, false, true)
878
+ end
879
+
875
880
  def put_bank_accounts_into_iso_group(security_group, merchant)
876
881
  return unless security_group and merchant
877
882
 
878
- @logger.info("Puting Bank Account for #{merchant.name} into ISO group")
883
+ @logger.info("Puting Bank Accounts for #{merchant.name} into #{security_group.name} group")
879
884
 
880
885
  case @action
881
886
  when "initial_run"
@@ -892,7 +897,7 @@ module SalesforceMigration
892
897
  def put_email_objects_into_iso_group(security_group, type, obj)
893
898
  return unless security_group and type and obj
894
899
 
895
- @logger.info("Puting Emails for #{obj.name} into ISO group")
900
+ @logger.info("Puting Emails for #{obj.name} into #{security_group.name} group")
896
901
 
897
902
  case type
898
903
  when "agent"
@@ -919,7 +924,7 @@ module SalesforceMigration
919
924
  def put_payment_methods_objects_into_iso_group(security_group, merchant)
920
925
  return unless security_group and merchant
921
926
 
922
- @logger.info("Puting Payment Methods for #{merchant.name} into ISO group")
927
+ @logger.info("Puting Payment Methods for #{merchant.name} into #{security_group.name} group")
923
928
 
924
929
  payment_methods = find_related_records(@payment_to_merchants, 'sf_merchant_id', merchant.sf_id)
925
930
 
@@ -927,6 +932,35 @@ module SalesforceMigration
927
932
 
928
933
  associate_module_by_ids!(security_group, 'payment_method', payment_methods, false, true)
929
934
  end
935
+
936
+ # Compare SalesForce Ids - SalesForce have two type of ids - 15 digit case-sensitive and 18-digit case-insensitive
937
+ #
938
+ # @param [String] salesforce_id - salesforce id to compare to
939
+ # @param [String] target_id - id
940
+ #
941
+ # @return [Boolean] true on match, every other case - false
942
+ def compare_salesforce_ids(salesforce_id, target_id)
943
+ return false unless salesforce_id and target_id
944
+
945
+ case salesforce_id.length
946
+ when 15
947
+ if target_id.length == 18
948
+ target_id = target_id[0..-4]
949
+ end
950
+ if salesforce_id == target_id
951
+ return true
952
+ end
953
+ when 18
954
+ if target_id.length == 15
955
+ salesforce_id = salesforce_id[0..-4]
956
+ end
957
+ if salesforce_id.casecmp(target_id) == 0
958
+ return true
959
+ end
960
+ end
961
+
962
+ false
963
+ end
930
964
 
931
965
  # Returns the SugarCRM module namespace
932
966
  # @param [String] type type of the module object
@@ -958,17 +992,5 @@ module SalesforceMigration
958
992
  SugarCRM.connection.get_entry_list(module_type, "#{module_type.downcase}.#{attribute} = '#{search_string}'")
959
993
  end
960
994
 
961
- # Populates the var_pool with Sugar Objects.
962
- # Reason being, is that if you abort the current process (error or some other reason)
963
- # You won't be able to continue from the same place and be able to correctly associate the objects
964
- # To prevent this, we can just load back every object for every type and continue uninterrupted
965
- #
966
- # @param [String] id - SalesForce id of the object, that we want to retrieve
967
- # @param [String] type - type of the object, that we want to retrieve (module type)
968
- def populate_var_poll_from_sugar(id, type)
969
- obj = find_sugarcrm_object(type, 'sf_id', id)
970
- populate_var_pool(obj, type) if obj
971
- end
972
-
973
995
  end
974
996
  end
metadata CHANGED
@@ -1,113 +1,94 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sf_migrate
3
- version: !ruby/object:Gem::Version
4
- hash: 25
5
- prerelease:
6
- segments:
7
- - 1
8
- - 2
9
- - 3
10
- version: 1.2.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.4
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Emil Petkov
14
8
  - Petar Manchev
15
9
  autorequire:
16
10
  bindir: bin
17
11
  cert_chain: []
18
-
19
- date: 2014-02-06 00:00:00 Z
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2014-02-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: sugarcrm_emp
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
27
18
  - - ~>
28
- - !ruby/object:Gem::Version
29
- hash: 61
30
- segments:
31
- - 0
32
- - 10
33
- - 5
19
+ - !ruby/object:Gem::Version
34
20
  version: 0.10.5
35
21
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: databasedotcom_emp
39
22
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: 0.10.5
28
+ - !ruby/object:Gem::Dependency
29
+ name: databasedotcom_emp
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
43
32
  - - ~>
44
- - !ruby/object:Gem::Version
45
- hash: 25
46
- segments:
47
- - 1
48
- - 3
49
- - 1
33
+ - !ruby/object:Gem::Version
50
34
  version: 1.3.1
51
35
  type: :runtime
52
- version_requirements: *id002
53
- - !ruby/object:Gem::Dependency
54
- name: mail
55
36
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
59
39
  - - ~>
60
- - !ruby/object:Gem::Version
61
- hash: 29
62
- segments:
63
- - 2
64
- - 5
65
- - 3
40
+ - !ruby/object:Gem::Version
41
+ version: 1.3.1
42
+ - !ruby/object:Gem::Dependency
43
+ name: mail
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
66
48
  version: 2.5.3
67
49
  type: :runtime
68
- version_requirements: *id003
69
- - !ruby/object:Gem::Dependency
70
- name: roo
71
50
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
75
53
  - - ~>
76
- - !ruby/object:Gem::Version
77
- hash: 59
78
- segments:
79
- - 1
80
- - 10
81
- - 2
54
+ - !ruby/object:Gem::Version
55
+ version: 2.5.3
56
+ - !ruby/object:Gem::Dependency
57
+ name: roo
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
82
62
  version: 1.10.2
83
63
  type: :runtime
84
- version_requirements: *id004
85
- - !ruby/object:Gem::Dependency
86
- name: unix-crypt
87
64
  prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.10.2
70
+ - !ruby/object:Gem::Dependency
71
+ name: unix-crypt
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
91
74
  - - ~>
92
- - !ruby/object:Gem::Version
93
- hash: 27
94
- segments:
95
- - 1
96
- - 3
97
- - 0
75
+ - !ruby/object:Gem::Version
98
76
  version: 1.3.0
99
77
  type: :runtime
100
- version_requirements: *id005
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: 1.3.0
101
84
  description: SalesForce to SugarCRM migration tool
102
- email:
85
+ email:
103
86
  - p.manchev@emerchantpay.com
104
- executables:
87
+ executables:
105
88
  - sf_migrate
106
89
  extensions: []
107
-
108
90
  extra_rdoc_files: []
109
-
110
- files:
91
+ files:
111
92
  - README.md
112
93
  - Gemfile
113
94
  - bin/sf_migrate
@@ -119,36 +100,25 @@ files:
119
100
  - config/credentials.yaml.example
120
101
  homepage:
121
102
  licenses: []
122
-
103
+ metadata: {}
123
104
  post_install_message:
124
105
  rdoc_options: []
125
-
126
- require_paths:
106
+ require_paths:
127
107
  - lib
128
- required_ruby_version: !ruby/object:Gem::Requirement
129
- none: false
130
- requirements:
131
- - - ">="
132
- - !ruby/object:Gem::Version
133
- hash: 3
134
- segments:
135
- - 0
136
- version: "0"
137
- required_rubygems_version: !ruby/object:Gem::Requirement
138
- none: false
139
- requirements:
140
- - - ">="
141
- - !ruby/object:Gem::Version
142
- hash: 3
143
- segments:
144
- - 0
145
- version: "0"
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
146
118
  requirements: []
147
-
148
119
  rubyforge_project:
149
- rubygems_version: 1.8.25
120
+ rubygems_version: 2.1.11
150
121
  signing_key:
151
- specification_version: 3
122
+ specification_version: 4
152
123
  summary: Makes a bridge between Salesforce and SugarCRM
153
124
  test_files: []
154
-