sf_migrate 1.2.3 → 1.2.4

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.
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
-